遍历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

相关文章
相关标签/搜索