遍历 DOM

  1. <html> = document.documentElement
  2. <body> = document.body
  3. <head> = document.head
  4. 子节点:childNodes,firstChild,lastChild
  5. DOM 集合:childNodes 看起来就像一个数组。但实际上它并不是一个数组,而是一个 集合 —— 一个类数组的可迭代对象。这个性质会导致两个重要的结果:
  6. 兄弟节点和父节点
  7. 兄弟节点(sibling) 是指有同一个父节点的节点。
  8.         
                //<body> 的父节点是 <html>
    alert( document.body.parentNode === document.documentElement ); // true

    // <head> 的后一个是 <body>
    alert( document.head.nextSibling ); // HTMLBodyElement

    // <body> 的前一个是 <head>
    alert( document.body.previousSibling ); // HTMLHeadElement
  9. 纯元素导航:这些链接和上面提到过的类似,只是在词中间加了 Element
  10. parentElement 属性返回的是“元素类型”的父节点,而 parentNode 返回的是“任何类型”的父节点。这些属性通常来说是一样的:它们都是用于获取父节点。
  11. 唯一的例外就是 document.documentElement:
  12.         
                alert( document.documentElement.parentNode ); // document
                alert( document.documentElement.parentElement ); // null
            
        
  13. 因为根节点 document.documentElement()的父节点是 document。但 document 不是一个元素节点,所以 parentNode 返回了 document,但 parentElement 返回的是 null。
  14. 让我们修改上面的一个示例:用 children 来替换 childNodes。现在它只显示元素:
  15.         
                <html>
    <body>
    <div>Begin</div>
    <ul>
    <li>Information</li>
    </ul>
    <div>End</div>
    <script>
    for (let elem of document.body.children) {
    alert(elem); // DIV, UL, DIV, SCRIPT
    }
    </script>
    ...
    </body>
    </html>

总结

给定一个 DOM 节点,我们可以使用导航(navigation)属性访问其直接的邻居。

  1. 对于所有节点:parentNode,childNodes,firstChild,lastChild,previousSibling,nextSibling。
  2. 仅对于元素节点:parentElement,children,firstElementChild,lastElementChild,previousElementSibling,nextElementSibling。