「可收藏代码01」遍历 DOM 树并打印xxx

1. 遍历 DOM 树并打印节点类型及名称

function consoAllNodeName(parentNode) {
    let nodeType = '';
    parentNode.childNodes.forEach(element => {
        switch (element.nodeType) {
            case 1:
                nodeType = 'Element node:';
                break;
            case 3:
                nodeType = 'Text node:';
                break;
            case 7:
                nodeType = 'XML ProcessingInstruction:';
                break;
            case 8:
                nodeType = 'Comment node:';
                break;
            case 9:
                nodeType = 'Document node:';
                break;
            case 10:
                nodeType = 'DocumentType node:';
                break;
            case 11:
                nodeType = 'DocumentFragment node:';
                break;
            default:
                nodeType = 'Unknown type node:';
                break;
        }
        console.log(nodeType + element.nodeName.toUpperCase());

        if (element.firstChild) {
            consoAllNodeName(element);
        } else {

        }

    })
}

consoAllNodeName(document);
复制代码

2. 遍历 DOM 树并打印所有元素的 tagName

function consoAllTagName(parentNode) {

    let nodeType = '';
    let childNodes = Array.prototype.filter.call(parentNode.childNodes, element => element.tagName);
    childNodes.forEach(element => {
         
        console.log(element.tagName.toUpperCase());
        if (element.firstChild) {
            consoAllNodeName(element);
        } else {

        }

    })
}

consoAllTagName(document);
复制代码

在这段代码中,由于 nodeList 类型并没有 filter 方法,使用 call 函数传入 nodelist 调用该方法。并且将 filter 的处理函数作为第二个参数。

下面这种方法是广度优先遍历。

function consoAllTagName(root){
  const queue = [root];
  while(queue.length) {
    const currentNode = queue.shift();
    const {childNodes, tagName} = currentNode;
    if (tagName) {
      console.log(currentNode.tagName);
    } else {
    }
    Array.prototype.filter.call(childNodes, item=>item.tagName)
    .forEach(itemNode=>{
      queue.push(itemNode)
    })
  }
}
复制代码

这段代码中,通过解构赋值得到 childNodes 和 tageName 属性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值