DOM

头像
shasha
    阅读 5 分钟

    1. DOM 简介

    • DOM全称:Document Object Model 文档对象模型。

      • 文档:表示整个HTML网页文档。
      • 对象:表示将网页中的每一个部分都转换为一个对象。
      • 模型:使用模型来表示对象之间的关系,这样方便我们获取对象。
    • JS中通过DOM来对HTML文档进行操作,只要理解了DOM就可以随心所欲的操作web页面了。

    (1) 节点node

    • 节点是构成我们网页的最基本的组成部分。比如:html标签,属性,文本,注释,整个文档等都是一个节点。
    • 节点分为不同的类型,类型不同,属性和方法也都不尽相同。

      常用的节点分为四类:

      文档节点document:整个HTML文档。document对象作为window对象的属性存在,我们不用获取,可以直接使用。通过该对象,我们可以在整个文档中,查找或创建节点对象。
      元素节点:HTML文档中的HTML标签。

      属性节点:元素的属性。它是元素节点的一部分。我们一般不使用属性节点。

      文本节点:HTML标签的文本内容。
      如图所示:
      image.png

    (2) 事件

    • 指文档或浏览器窗口中发生的一些特定的交互瞬间。即用户和浏览器之间的交互行为。
    • 如:点击某个元素,将鼠标移动至某个元素上方等等。
    • 可以为按钮的对应事件绑定处理函数的形式来响应事件。当事件被触发时,其对应的函数将会被调用。

      举例1:

      <!DOCTYPE html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <title>Title</title>
      </head>
      <body>
      <!-- 方法1:通过标签的属性绑定事件,结构与行为耦合,不方便维护,不推荐使用 -->
      <button id="btn" onclick = "alert('确定');">我是一个按钮</button>
          
      <!-- 方法2:结构与行为分离,方便维护,推荐使用 -->    
      <button id="btn">我是一个按钮</button>
      <script type="text/javascript">
          //将id为"btn"的button元素设置为对象btn
          var btn = document.getElementById("btn");
          alert(btn);//[object HTMLButtonElement]
          //为对象添加属性,绑定一个事件
          //像这种为单击事件绑定的函数,称为单击响应函数
          btn.onclick = function () {
              alert("点击表示确认");
          };   
      </script>
      </body>
      </html>

      说明:如上两种方式。方法2中,将script标签写在了body中,下面会做解释。

    (3) 文档的加载

    • 浏览器在加载一个页面时,是按照自上向下的顺序加载的,读取到一行就运行一行。
    • 如果将script标签写到页面的上边,在运行代码时,DOM对象还没有加载,会导致无法获取到DOM对象。
    • 如下代码:对于alert和button,页面会先运行alert,确定后才会按顺序由上到下加载button。所以在举例1中,将script标签中的内容写在head内,是会报错的,不能为btn添加属性onclick。Uncaught TypeError: Cannot set property 'onclick' of null

      <!DOCTYPE html>
      <html lang="en">
      <head>
         <meta charset="UTF-8">
         <title>Title</title>
         <script type="text/javascript">
             alert("hello");
         </script>
      </head>
      <body>
      <button id="btn">我是一个按钮</button>
      </body>
      </html>

      解决办法:使用window.onload先加载后执行代码。(小小缺点:先加载后执行,会影响html的加载速度。但其实,没有明显区别。)

    • onload事件会在整个页面加载完成之后才触发。为window绑定一个onload事件,该事件对应的响应函数将会在页面加载完成后执行,这样可以确保我们的代码执行时,所有的DOM对象已经加载完毕了。

      举例:当页面加载完后,点击按钮,才会alert。

      <!DOCTYPE html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <title>Title</title>
          <script type="text/javascript">
              window.onload = function () {
                  var btn = document.getElementById("btn");
                  btn.onclick = function () {
                      //innerHTML通过这个属性,可以获取到元素内部的html代码
                      alert(btn.innerHTML);//结果:我是一个按钮
                  }
              };
          </script>
      </head>
      <body>
      <button id="btn">我是一个按钮</button>
      </body>
      </html>

      注意:innerHTML通过这个属性,可以获取到元素内部的html代码。但是对于自结束标签,这个属性没有意义。如果需要读取元素节点属性,直接使用元素.属性名

      例如:元素.id 元素.name 元素.value。但是读取class属性时需要使用 元素.className

    (4) 主要用法:

    通过document对象调用,获取元素节点

    • getElementById()方法

      通过id属性获取一个元素节点对象

    • getElementsByTagName()方法

      通过标签名获取一组元素节点对象。这个方法会返回一个类数组对象,将所有查询到的元素封装到对象中。即使查询到的结果只有一个,也会封装到数组中返回。

    • getElementsByName()方法

      通过name属性获取一组元素节点对象

    通过具体的元素节点调用,获取元素节点的子节点

    • getElementsByTagName()方法

      返回当前节点的指定标签名后代节点

    • childNodes属性

      表示当前节点的所有子节点(包括文本节点在内的),根据DOM标准,标签间的空白,也会当作文本节点。注意:IE8以及以下的浏览器,不会将空白当作文本节点。

    • children属性

      可以获取当前元素的所有子元素

    • firstChild属性

      表示当前节点的第一个子节点(包括文本节点)

    • firstElementChild

      获取当前元素的第一个子元素。但不支持IE8及以下的浏览器

    • lastChild属性

      表示当前节点的最后一个子节点

    通过具体的节点调用,获取父节点和兄弟节点

    • parentNode属性

      表示当前节点的父节点

    • previousSibling属性

      表示当前节点的前一个兄弟节点(可能是空白文本)

    • perviousElementSibling

      获取前一个兄弟元素,IE8及以下不支持

    • nextSibling属性

      表示当前节点的后一个兄弟节点

    其他剩余方法

    • getElementsByClassName()方法

      根据class属性值获取一组元素节点对象。但是该方法不支持IE8及以下的浏览器

    • document.body属性

      保存body的引用,等同于 document.getElementsByTagName("body")[0];默认一个页面只有一个body。

    • document.documentElement属性,保存html根标签

    • document.all属性

      代表页面中所有的元素(不去重复)。
      等同于document.getElementByTagName("*")

    • document.querySeletor()方法

      需要一个选择器的字符串作为参数,可以根据CSS选择器来查询一个元素节点对象。虽然IE8中没有getElementsByClassName(),但是可以使用querySelector()代替。
      使用该方法总会返回唯一的一个元素,如果满足条件的元素有多个,结果只会返回第一个。

      document.querySelector("#box1");
    • documentSelectorAll()

      将符合条件的元素封装到一个数组中返回。即使符合条件的元素只有一个,它也会返回数组。

    • checked:设置或返回checkbox是否应被选中。通过多选框的checkbox属性,可以获取或设置多选框的选中状态。
    • 在事件的响应函数中,响应函数是给谁绑定的,this就是谁。
    //为checkAllBox绑定单击响应函数
    var checkAllBox = document.getElementById("checkedAllBox");
    checkedAllBox.onclink=function(){
    alert(this === checkedAllBox);
    }

    5.DOM的增删改

    • createElement()创建元素节点

    可以用于创建夜歌元素节点。它需要一个标签名作为参数,将会根据标签名创建节点对象,并将创建好的对象作为返回值返回。

    //创建li元素节点
    var li= document.createElement("li");//[objectHTMLIElement]
    • createTextNode()创建文本节点

    可以用来创建一个文本节点对象。需要一个文本内容作为参数,将根据该内容创建文本节点,并将新的节点返回。

    //创建文本内容为“广州”的文本节点
    var gzText= document.createTextNode("广州");//[object Text]
    • appendChild()把新的子节点添加到指定节点

    向一个父节点中添加一个新的子节点。
    用法:父节点.appendChild(子节点)

    //<li>广州</li>   文本节点广州是标签节点li的子节点
    li.appendChild(gzText);
    • insertBefore() 在指定的子节点前面插入新的子节点。

    语法:父节点.insertBefore(新节点,旧节点)

    • replaceChild() 替换子节点

    可以使用指定的子节点替换已有的子节点。
    语法:父节点.replaceChild(新节点,旧节点)

    • removeChild() 删除子节点

    语法:父节点.removeChild(子节点)

      子节点.parentNode.removeChild(子节点)
    var bj = document.getElementById("bj");
    var city = document.getElementById("city");
    //下面两句的等同
    city.removeChild(bj);
    bj.parentNode.removeChild(bj);//不需要知道子节点的父节点
    ........
    <ul id="city">
        <li id="bj">北京</li>
    </ul>

    小结:

    • innerText属性可以获取到元素内部的文本内容,它和innerHTML的区别是,它会自动将标签去掉,只剩文本内容。
    • 使用innerHTML也可以完成DOM的增删改相关操作,一般我们与appendChild结合使用。
    var city = document.getElementById("city");
    //创建li节点
    var li = document.createElement("li");
    //向li中设置文本
    li.innerHTML = "广州";
    //将li添加到city中
    city.appendChild(li);
    
    • 文本框的value属性值,就是文本框中填写的内容
    姓名<input id="username"value ="abc">
    var um = document.getElementById("username");
    //读取um的value属性值
    alert(um.value);
    • window对象的方法:confirm()显示带有一段消息以及确认按钮或者取消按钮的对话框。

    用于弹出一个带有确认和取消按钮的提示框。需要一个字符串作为参数,该字符串将会作为提示文字显示。如果用户点击确认则会返回true,点击取消则返回false。

    • window对象的方法:prompt()显示可提示用户输入的对话框。

    shasha
    28 声望7 粉丝

    « 上一篇
    选择器优先级
    下一篇 »
    HTML