遍歷DOM元素

前置知識

快速獲取html元素方法:html

document.documentElement

// js高級程序設計一書中有段這樣的代碼:
let html = document.documentElement; //取得對<html>的引用
html === document.childNodes[0]; //true
html === document.firstChild; //true

// 實測新版Chrome瀏覽器(版本 75.0.3770.100 64位)
html === document.childNodes[1]; // true
document.childNodes[0] === document.firstChild // true
document.doctype === document.childNodes[0]; // true

複製代碼

快速獲取body元素方法:node

document.body
複製代碼

ParentNode.children 和 Node.childNodes 區別瀏覽器

  • node.children:返回一個 Node 的子元素的集合,類型是 HTMLCollection(即html元素的集合)。
  • node.childNodes:返回一個 node 子節點的集合,類型是 NodeList,該集合包含有更多的信息,好比元素與元素之間的換行符,頁面中的註釋等。

若是咱們想遍歷元素的話,選擇 ParentNode.children 應該是會更方便一些以上兩個屬性返回的元素集合都是實時的,所以不用擔憂因爲js腳本修改dom致使須要從新獲取元素信息。dom

代碼

function ergodicDom(elem) {
    let domTreeObj = {}; //使用對象來展示dom樹
    !function innerFun(elem, obj, i) {
        if (elem.nodeName === 'SCRIPT' || elem.nodeName === 'STYLE') {
            return;
        }
        let name = i ? elem.nodeName + i : elem.nodeName;
        obj[name] = {};
        if (elem.children.length > 0) {
            [].forEach.call(elem.children, (element, i)=>{
                innerFun(element, obj[name], i)
            })
        }

    }(elem, domTreeObj)
    return domTreeObj;
}
複製代碼

隨手寫的,發現用了 ParentNode.children 的話就不須要判斷 nodeType 了,有不足之處歡迎補充ui

相關文章
相關標籤/搜索