zoukankan      html  css  js  c++  java
  • 前端学习第69天DOM和BOM

    一.DOM

    1,DOM概述

    1.1 什么是DOM
    
    * 文档对象模型 Document Object Model
    * 文档对象模型 是表示和操作 HTML和XML文档内容的基础API
    * 文档对象模型,是W3C组织推荐的处理可扩展标志语言的标准编程接口
     1.2 DOM分类
    
    * 核心 DOM - 针对任何结构化文档的标准模型
    * XML DOM - 针对 XML 文档的标准模型
    * HTML DOM - 针对 HTML 文档的标准模型
    1.3 DOM树
    
    ![](./dom.gif)

    2,节点

     2.1 什么是节点
    
    文档中的每一个部分都是节点,包括document 元素  属性 文本... 
    2.2 节点的分类
    
    * doctype    文档类型
    * cocument 文档 
    * Element     元素
    * Attr         属性
    * Text          文本
    * Comment  注释
    2.3 节点属性
    
    * nodeName    节点名字
    
    * nodeValue  节点值
    
    * nodeType 节点类型

    3,获取元素的对象

    - getElement系列
    - querySelector系列

    !DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title>节点</title>
        <style></style>
    </head>
    <!---->
    <body>
    <div class="sup" abc="123">
        <div class="sub">sub</div>
        <div class="sub">sub</div>
        <div class="sub">sub</div>
    </div>
    <div class="sup">
        <div class="sub">sub</div>
        <div class="sub">sub</div>
        <div class="sub">sub</div>
    </div>
    </body>
    <script>
        // DOM: 文档对象模型 => 提高给用户操作document obj的标准接口
        // DOM树: 以document为根, 树状展开所有子节点
        var body = document.querySelector('body');
        console.log([body, document]);
    
        // 节点分类: 6个
        // document | doctype | element | text | attr | comment
        // 节点名(纯大写)
        console.log(body.nodeName)
        // 节点类型(标识节点的分类)
        console.log(body.nodeType);
    
    
        // 属性操作
        var sup1 = document.querySelector('.sup');
        console.log(sup1.getAttribute('abc'));
    
        // 操作属性节点
        var info_node = document.createAttribute("info");
        console.log(info_node.nodeName);
        console.log(info_node.nodeType);
        info_node.value = '123';
        console.log(info_node.nodeValue);
        sup1.setAttributeNode(info_node);
    
    
    </script>
    </html>

    4文档结构和遍历文档

    4.1 节点关系
    
    * 父节点 父元素
    * 子节点 子元素
    * 同辈节点 同辈元素
    * 祖先节点 祖先元素
    * 后代节点 后代元素
    
    ### 4.2 作为节点树的文档
    
    * parentNode    父节点
    * childNodes    所有子节点的集合
    * firstChild    第一个子节点
    * lastChild        最后一个子节点
    * nextSibling    下一个兄弟节点
    * previousSibling    上一个兄弟节点
    
    ### 4.3 作为元素树的文档
    
    * parentElement    父元素(大部分情况下 parentElement 等同于 parentNode)
    * children    所有子元素的集合
    * firstElementChild第一个子元素
    * lastElementChild        最后一个子元素
    * nextElementSibling    下一个兄弟元素
    * previousElementSibling    上一个兄弟元素
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title>文档节点</title>
        <style>
            .show {
                width: 500px;
                height: 500px;
                border: 3px solid black;
                margin: 0 auto;
            }
            .sup {
                width: 100px;
                height: 100px;
                border-radius: 50%;
                background-color: orange;
                float: left;
            }
            .sub {
                width: 20px;
                height: 20px;
                border-radius: 50%;
                background-color: deeppink;
                position: relative;
                top: 40px;
                left: 40px;
            }
            .ele {
                width: 100px;
                height: 100px;
                border-radius: 20% / 50%;
                background-color: yellow;
                float: left;
            }
        </style>
    </head>
    <body>
        <div class="show">
            <!--如何动态创建.sup>.sub结构-->
            <!--<div class="sup">-->
                <!--<div class="sub"></div>-->
            <!--</div>-->
        </div>
    </body>
    <script>
        // 产生随机数
        function randomNum(m, n) {
            return parseInt(Math.random() * (n - m + 1)) + m;
        }
        // 随机颜色
        function randomColor() {
            var color = "";
            var r = randomNum(0, 255);
            var g = randomNum(0, 255);
            var b = randomNum(0, 255);
            color = "rgb(" + r + ", " + g + ", " + b + ")";
            return color;
        }
    
    
        var show = document.querySelector('.show');
        // 1. 创建div(元素节点)
        // 2. 设置div属性(单一css | css类名 | 文本 | 子标签 | 事件 | ...)
        // 3. 添加到(文档结构中)指定位置
    
        /*
        // 注: 所有创建节点的操作只能由document来完成
        var sup = document.createElement('div');  // 创建div一定要写div, 因为是节点名(元素节点名就是标签名)
        sup.className = 'sup';
        show.appendChild(sup);
    
        sup = document.createElement('div');
        sup.className = 'sup';
        sup.style.backgroundColor = randomColor();
        show.insertBefore(sup, show.firstElementChild);
    
        sup = document.createElement('div');
        sup.className = 'sup';
        sup.style.backgroundColor = randomColor();
        show.insertBefore(sup, show.firstElementChild);
        */
    </script>
    <script>
        // var body = document.querySelector('body');
        // // true深拷贝,拷贝自身与内容, false浅拷贝,只拷贝自身标签
        // var cl_body = body.cloneNode(true);
        // console.log(cl_body);
    
        setInterval(function () {
            let sup = document.createElement('div');
            sup.className = 'sup';
            sup.style.backgroundColor = randomColor();
    
    
            let sub = document.createElement('div');
            sub.className = 'sub';
            sub.style.backgroundColor = randomColor();
    
            // sub属于sup, 添加到sup中
            // box.appendChild(ele); 将ele添加到box中最后位置
            sup.appendChild(sub);
    
            // 第一次添加到最后, 除此以外都添加到最前
            if (show.children.length == 0) {
                // 将sup添加到show最后
                show.appendChild(sup);
            } else {
                // 将sup添加到show第一个子级的前名(最前)
                show.insertBefore(sup, show.firstElementChild);
            }
    
    
            // 删除操作: 子级个数>25,将最后一个删除
            if (show.children.length > 25) {
                // 通过父级删除最后一个子级
                show.removeChild(show.lastElementChild);
            }
    
            // 将最中间的元素替换掉 25个满了, 替换第13个
            if (show.children.length == 25) {
                let div = document.createElement('div');
                div.className = 'ele';
                // 用div替换掉show中的索引为12的子元素
                let re_box = show.replaceChild(div, show.children[12]);
                // console.log(re_box.style.backgroundColor);
                show.replaceChild(re_box, show.children[13]);
            }
    
        }, 1000)
    </script>
    </html>

    5,属性

    5.1 HTML标签的属性和元素对象的属性
    
    HTMLElement对象映射了元素的HTML属性
    
    ### 5.2 获取和设置非标准的HTML属性     
    
    * getAttribute(attrname)    获取自定义或内置属性的值
    * setAttribute(attrnane, value)    设置自定义或内置属性
    * hasAttribute(attrname)    判断是否存在该属性
    * removeAttribute()    移出自定义或内置的属性
    
    ### 5.3 作为Attr节点的
    
    * setAttributeNode()
    * getAttributeNode()
    * document.createAttribute()    创建属性节点
    
    ```js
    var attr = document.createAttribute('class');
    attr.value = 'active';
    box.setAttributeNode(attr);

     6 元素的内容 6.1 作为HTML的元素内容

    * innerHTML
    * outerHTML
    
     6.2 作为纯文本的元素内容
    * innerText    会忽略多余空白
    6.3 作为Text节点的元素内容 文本节点的方法 appendData() 向文本节点追加内容 deleteData() 删除文本节点的一部分内容 insertData() 向文本节点中插入内容 replaceData() 替换内容
    创建文本节点 ``` document.createTextNode() ```

    7 创建、插入、删除 元素节点

     7.1 创建节点        
    
    ```
    document.createElement()
    ```
    
    7.2 插入节点        
    
    ```
    appendChild()    在元素的最后追加一个子元素
    insertBefore()    在元素指定的位置插入一个子元素
    ```
    
     7.3 删除节点        
    
    ```
    removeChild()
    ```
    
     7.4 替换节点        
    
    ```
    replaceChild(new_node, old_node)
    ```
    
     7.5 克隆节点        
    
    ```
    cloneNode()
        参数
        true    克隆元素以及所有的厚点节点
        false    仅仅克隆节点本身
    ```

    8,事件target

    ```js
    // ev.target通过父级的事件对象,获取具体相应区域位置的子级元素
    
    // 应用场景
    // 1. 父级的子元素类型不同一,采用循环绑定不方便
    // 2. 父级子元素较多或不确定
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title>事件target</title>
        <style>
            ul {
                background: #333;
                list-style: none;
                padding: 0;
                margin: 0;
            }
            .active {
                color: orange;
                /*background: yellow;*/
            }
        </style>
    </head>
    <body>
    <ul>
        <li>001</li>
        <li>002</li>
        <li>003</li>
        <li>004</li>
    </ul>
    <a href="./05_BOM操作.html">05_BOM操作.html</a>
    </body>
    <script>
        let lis = document.querySelectorAll('li');
        let r_num = parseInt(Math.random() * 4);
        lis[r_num].className = 'active';
    
        // 需求: 单击到ul上, 一定点击到了某个li, 如何确定点击的是否为active
        /*
        for (let i = 0; i < lis.length; i++) {
            lis[i].onclick = function () {
                if (this.className == 'active') {
                    console.log("点击到了")
                } else  {
                    console.log("没有点击到了")
                }
            }
        }
        */
        let ul = document.querySelector('ul');
        ul.onclick = function (ev) {
            // ev.target通过父级的事件对象,获取具体相应区域位置的子级元素
            console.log(ev.target);
            if (ev.target.className == 'active') {
                console.log("点击到了")
            } else  {
                console.log("没有点击到了")
            }
        }
        // 应用场景
        // 1. 父级的子元素类型不同一,采用循环绑定不方便
        // 2. 父级子元素较多或不确定
    </script>
    </html>

    9,Document对象

    每个载入浏览器的 HTML 文档都会成为 Document 对象。
    Document 对象使我们可以从脚本中对 HTML 页面中的所有元素进行访问。

     9.1 属性
    
    ```
    URL        获取当前页面的url 只读
    domain        获取域名
    referrer        获取上一个页面的地址 只读
    title        标签标题
    location    网站地址信息
    lastModified    最后一次修改事件
    cookie        
    ```
    
     9.2 方法
    
    ```
    write()        
    writeln()    
    ```

    二,BOM(浏览器对象模型)

    1. 浏览器对象模型介绍

    BOM(Browser Object Model) 是指浏览器对象模型,是用于描述这种对象与对象之间层次关系的模型,浏览器对象模型提供了独立于内容的、
    可以与浏览器窗口进行互动的对象结构。BOM由多个对象组成,其中代表浏览器窗口的Window对象是BOM的顶层对象,其他对象都是该对象的子对象。 **BOM的左右** * 弹出新浏览器窗口的能力; * 移动、关闭和更改浏览器窗口大小的能力; * 可提供WEB浏览器详细信息的导航对象; * 可提供浏览器载入页面详细信息的本地对象; * 可提供用户屏幕分辨率详细信息的屏幕对象; * 支持Cookies;

    2,.1window

    window对象是客户端JavaScript的全局对象
    是所有客户端JavaScript特性和API的主要接入点
    它表示Web浏览器的一个窗口或窗体,并且用标识符window来引用它

    #### window 对象属性
    
    | 属性            | 描述                                                         |
    | --------------- | ------------------------------------------------------------ |
    | **document**    | 对 Document 对象的只读引用。                                 |
    | **history**     | 对 History 对象的只读引用。                                  |
    | **location**    | 用于窗口或框架的 Location 对象。                             |
    | **navigator**   | 对 Navigator 对象的只读引用。                                |
    | **screen**      | 对 Screen 对象的只读引用。                                   |
    | frames          | 返回窗口中所有命名的框架。该集合是 Window 对象的数组,每个 Window 对象在窗口中含有一个框架。 |
    | length          | 设置或返回窗口中的框架数量。                                 |
    | parent          | 返回父窗口。                                                 |
    | top             | 返回最顶层的父窗口。                                         |
    | name            | 设置或返回窗口的名称。                                       |
    | opener          | 返回对创建此窗口的窗口的引用。                               |
    | closed          | 返回窗口是否已被关闭。                                       |
    | defaultStatus   | 设置或返回窗口状态栏中的默认文本。                           |
    | status          | 设置窗口状态栏的文本。                                       |
    | self            | 返回对当前窗口的引用。等价于 Window 属性。                   |
    | **innerHeight** | 返回窗口的文档显示区的高度。                                 |
    | **innerWidth**  | 返回窗口的文档显示区的宽度。                                 |
    | **outerHeight** | 返回窗口的外部高度,包含工具条与滚动条。                     |
    | **outerWidth**  | 返回窗口的外部宽度,包含工具条与滚动条。                     |
    | pageXOffset     | 设置或返回当前页面相对于窗口显示区左上角的 X 位置。          |
    | pageYOffset     | 设置或返回当前页面相对于窗口显示区左上角的 Y 位置。          |
    | screenLeft      | 返回相对于屏幕窗口的x坐标                                    |
    | screenTop       | 返回相对于屏幕窗口的y坐标                                    |
    | screenX         | 返回相对于屏幕窗口的x坐标                                    |
    | screenY         | 返回相对于屏幕窗口的y坐标                                    |
    | **scrollX**     | 返回窗口水平滑动的距离                                       |
    | **scrollY**     | 返回窗口垂直滑动的距离                                       |
    
    #### window对象方法
    
    | 方法            | 描述                                               |
    | --------------- | -------------------------------------------------- |
    | **alert()**         | 显示带有一段消息和一个确认按钮的警告框。           |
    | **confirm()**      | 显示带有一段消息以及确认按钮和取消按钮的对话框。   |
    | **prompt()**        | 显示可提示用户输入的对话框。                       |
    | focus()         | 把键盘焦点给予一个窗口。                           |
    | blur()          | 把键盘焦点从顶层窗口移开。                         |
    | **open()**      | 打开一个新的浏览器窗口或查找一个已命名的窗口。     |
    | close()         | 关闭浏览器窗口。                                   |
    | print()         | 打印当前窗口的内容。                               |
    | createPopup()   | 创建一个 pop-up 窗口。                             |
    | **setInterval()** | 按照指定的周期(以毫秒计)来调用函数或计算表达式。 |
    | **setTimeout()** | 在指定的毫秒数后调用函数或计算表达式。             |
    | **clearInterval()** | 取消由 setInterval() 设置的 timeout。              |
    | **clearTimeout()** | 取消由 setTimeout() 方法设置的 timeout。           |
    | moveBy()        | 可相对窗口的当前坐标把它移动指定的像素。(仅IE)     |
    | moveTo()        | 把窗口的左上角移动到一个指定的坐标。(仅IE)      |
    | resizeBy()      | 按照指定的像素调整窗口的大小。(仅IE)               |
    | resizeTo()      | 把窗口的大小调整到指定的宽度和高度。(仅IE)         |
    | scrollBy()      | 按照指定的像素值来滚动内容。                     |
    | scrollTo()      | 把内容滚动到指定的坐标。                           |

    2.2Localtion

    Location 对象包含有关当前 URL 的信息。

    Location 对象是 window 对象的一部分,可通过 window.Location 属性对其进行访问。

    #### Location 对象属性
    
    | 属性     | 描述                          |
    | -------- | ----------------------------- |
    | href     | 返回完整的URL                 |
    | protocol | 返回一个URL协议               |
    | host     | 返回一个URL的主机名和端口     |
    | hostname | 返回URL的主机名               |
    | port     | 返回一个URL服务器使用的端口号 |
    | pathname | 返回的URL路径名。             |
    | search   | 返回一个URL的查询部分         |
    | hash     | 返回一个URL的锚部分           |
    
    
    #### Location 对象方法
    
    | 方法      | 说明                   |
    | --------- | ---------------------- |
    | assign()  | 载入一个新的文档       |
    | reload()  | 重新载入当前文档       |
    | replace() | 用新的文档替换当前文档 |
    要求掌握:
    ```js // location => url信息 console.log(location); // 域名:端口号 console.log(location.host); // 域名 console.log(location.hostname); // 端口号 console.log(location.port); // 查询信息 console.log(location.search); ```

    2.3History

    History 对象包含用户(在浏览器窗口中)访问过的 URL。

    History 对象是 window 对象的一部分,可通过 window.history 属性对其进行访问

    ### History 对象属性
    
    | 属性   | 说明                   |
    | ------ | ---------------------- |
    | length | 返回历史列表中的网址数 |
    
    #### History 对象方法
    
    | 方法      | 说明                              |
    | --------- | --------------------------------- |
    | back()    | 加载 history 列表中的前一个 URL   |
    | forward() | 加载 history 列表中的下一个 URL   |
    | go()      | 加载 history 列表中的某个具体页面 |

    2.4Navigator

    #### Navigator 对象属性
    
    | 属性          | 说明                                     |
    | ------------- | ---------------------------------------- |
    | appCodeName   | 返回浏览器的代码名                       |
    | appName       | 返回浏览器的名称                         |
    | appVersion    | 返回浏览器的平台和版本信息               |
    | cookieEnabled | 返回指明浏览器中是否启用 cookie 的布尔值 |
    | platform      | 返回运行浏览器的操作系统平台             |
    | **userAgent** | 返回浏览器用于 HTTP 请求的用户代理头的值 |
    
    #### Navigator 对象方法
    
    | 方法           | 描述                                      |
    | -------------- | ----------------------------------------- |
    | javaEnabled()  | 指定是否在浏览器中启用Java                |
    | taintEnabled() | 规定浏览器是否启用数据污点(

    2.5 Screen

    Screen 对象包含有关客户端显示屏幕的信息。

    #### Screen 对象属性
    
    | 属性        | 说明                                     |
    | ----------- | ---------------------------------------- |
    | availHeight | 返回屏幕的高度(不包括Windows任务栏)    |
    | availWidth  | 返回屏幕的宽度(不包括Windows任务栏)    |
    | colorDepth  | 返回目标设备或缓冲器上的调色板的比特深度 |
    | height      | 返回屏幕的总高度                         |
    | pixelDepth  | 返回屏幕的颜色分辨率(每象素的位数)     |
    | width       | 返回屏幕的总宽度                         |
  • 相关阅读:
    Android笔记(ImageView、BaseLine、进度条ProgressBar)
    Android笔记(dp、sp、px、多选按钮CheckBox、单选按钮RadioButton)
    Android笔记(简介)
    Android Studio安装后Fetching android sdk component information超时的解决方案
    解决The environment variable JAVA_HOME does not point to a valid JVM installation
    使用Genymotiont调试出现错误INSTALL_FAILED_CPU_ABI_INCOMPATIBLE解决办法
    Android Studio导入第三方jar包及.so动态库
    数据库知识记录
    CentOS7.5下yum安装MySQL8.0.11笔记
    MyBatis的mapper.xml中判断集合的size
  • 原文地址:https://www.cnblogs.com/ye-hui/p/10176204.html
Copyright © 2011-2022 走看看