DOM

76 阅读2分钟

  DOM树   

DOM(文档对象模型)是 HTML 和 XML 的应用程序接口(API)。DOM 将把整个页面规划成由节点层级构成的文档。HTML 或 XML 页面的每个部分都是一个节点的衍生物。例如下面的html代码就会被解析成后图中的树型结构:

<!DOCTYPE html>
<html lang="en">
<head>
<title>文档标题</title>
</head>
<body>
    <a href="#">我的链接</a>
    <h1>我的标题</h1>
</body>
</html>

这里的每一对标签,都是dom树上的一个节点

  使用JS操作DOM

    获取元素的方法

  1. document.getElementById(),getElementById是Document上的一个方法,用元素Id把单个元素整块抠出来(包括其孩子)
  2.  document.getElementsByTagName(), element.getElementsByTagName()通过标签名把元素及其孩子抠出来(包括其孩子)
  3. document.getElementsByClassName(), element.getElementsByClassName()通过元素类名把元素整块抠出(包括其孩子)
  4. document.querySelector(), element.querySelector()通过类名,id名,标签名把单个元素整块抠出来类名 (.), id名 (#), 标签名 (div)
  5. document.querySelectorAll(), element.querySelectorAll()通过类名,id名,标签名把多个元素整块抠出来类名 (.), id名 (#), 标签名 (div)

html,body的获取方法

console.log(document.body);
console.log(document.documentElement);

示例代码:

    <!-- 示例代码 -->
    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="UTF-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>getElement</title>
      </head>
      <body>
        <ul class="myUl">
          <li id="myLiId">1-1</li>
          <li id="myLiId">2-1</li>
          <li id="myLiId">3-1</li>
        </ul>
        <hr />
        <ul class="myUl">
          <li id="myLiId">2-1</li>
          <li id="myLiId">2-2</li>
          <li id="myLiId">2-3</li>
        </ul>
        <hr />
        <ul class="myUl">
          <li id="myLiId">3-1</li>
          <li id="myLiId">3-2</li>
          <li id="myLiId">3-3</li>
        </ul>
        <script>
          console.log("getElementById:");
          var myLiId = document.getElementById("myLiId");
          console.log(myLiId);
          console.log("------------------------------------");
          console.log(" ");

          console.log("getElementsByClassName:");
          var myUls = document.getElementsByClassName("myUl");
          console.log(myUls);
          console.log("------------------------------------");
          console.log(" ");

          console.log("element.getElementsByTagName:");
          var myLis = myUls[0].getElementsByTagName("li");
          console.log(myLis);
          console.log("------------------------------------");
          console.log(" ");

          console.log("document.getElementsByTagName:");
          console.log(document.getElementsByTagName("li"));
          console.log("------------------------------------");
          console.log(" ");

          console.log("document.querySelectorAll:");
          console.log(document.querySelectorAll("li"));
          console.log("------------------------------------");
          console.log(" ");

          console.log("document.querySelectorAll:");
          console.log(document.querySelectorAll(".myUl"));
          console.log("------------------------------------");
          console.log(" ");

          console.log("document.querySelector:");
          console.log(document.querySelector("#myLiId"));
          console.log(document.querySelector("#myLiId").innerHTML);
          console.log("------------------------------------");
          console.log(" ");

          console.log(document.body);
          console.log(document.documentElement);
        </script>
      </body>
    </html>

    元素节点操作

      父子节点

  • node.parentNode
    • parentNode属性返回当前节点的最近父节点 (元素节点)
    • 如果没有父节点,返回null
  • body.children
    • 只返回元素的子节点中的元素节点(不是文本节点,也不是属性节点)
  • node.childNodes
    • 返回元素的所有子节点(包括元素节点,文本节点)        
  • 示例代码:
    <!-- 示例代码 -->
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>父子节点</title>
    </head>
    <body>
    <div>
        <h2><a href="#">日常</a></h2>
        <ul>
            <li value="yummy">吃饭</li>
            <li>睡觉</li>
            <li>打豆豆</li>
        </ul>
    </div>
    <script>
    var ul = document.querySelector("ul");
    console.log(ul.parentNode);
    console.log(ul.children);
    console.log(ul.childNodes);
    </script>
    </body>
    </html> 

      第一个子节点和最后一个子节点

  • node.children[0]----node.children[node.children.length - 1]----元素节点
  • firstChild----lastChild----元素节点和文本节点
  • firstElementChild----lastElementChild----元素节点(不兼容旧浏览器)

      兄弟节点

  • node.nextSibling----node.previousSibling----所有节点
  • node.nextElementSibling----node.previousElementSibling----元素节点(不兼容旧浏览器)

      创建、追加、删除节点

  • document.createElement("tagName")----创建节点(标签)
  • node.appendChild(child)----把child追加到node子节点列表末尾
  • node.insertBefore(newChild, child)----Node.insertBefore()
  • node.removeChild(child)----删除child,返回值为被删除的child节点

      复制节点(拷贝节点,克隆节点)

  • node.cloneNode()
  • 括号内可传入false, true,不传默认为浅拷贝,false为浅拷贝,true为深拷贝,浅拷贝就是只克隆标签,抛弃内容,深拷贝就是克隆标签以及内层的所有东西。返回值就是克隆出来的节点。