JavaScript DOM深度遍历(2种方法)和广度遍历

DOM深度优先遍历

1. API方法creatNodeIterator(ele,whatToShow,filter,boolean)
参数介绍:
  • whatToShow:待显示的节点类型,值有
    • NodeFilter.SHOW_ALL
    • NodeFilter.SHOW_ELEMENT
    • NodeFilter.SHOW_ELEMENT
    • NodeFilter.SHOW_ATTRIBUTE
  • filter 表示过滤待显示的节点
  • boolean表示实体扩展,在HTML页面没用,为false
    其内部包含nextNode(),previousNode()
代码举例
var body = document.getElementsByTagName('body')[0];
    var filter = function (node) {
        return node.tagName.toLocaleLowerCase() === 'li' || node.tagName.toLocaleLowerCase() === 'p'? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP;
    }
    var iterator = document.createNodeIterator(body,NodeFilter.SHOW_ELEMENT,null,false);
    var node = iterator.nextNode();
    while(node !== null){
        console.log(node.tagName);
        node = iterator.nextNode();
    }

2. API方法creatNodeTreeWalker(ele,whatToShow,filter,boolean)

参数和creatNodeIterator一样,但包含的功能更多,可以直接跳到对应的节点:

  • parentNode()
  • firstChild()
  • lastChild()
  • nextSibling()
  • previousSibling()
代码举例
 var body = document.getElementsByTagName('body')[0];
    var walker = document.createTreeWalker(body,NodeFilter.SHOW_ELEMENT,null,false);
    var node = walker.firstChild();
        node = walker.nextSibling();
    while(node !== null){
        console.log(node.tagName);
        node = walker.nextNode();
    }

3.递归方法实现
  function deepFirstSearch (node) {
        console.log(node.tagName);
        if(node.children.length){
            Array.from(node.children).forEach(function (el) {
                deepFirstSearch (el);
            })
        }
    }

DOM广度优先遍历

原理:先将node节点push进queue中,每次处理一个出队的元素直到queue中无元素待处理,每次处理完一个节点后,将其子节点全部push进数组queue中

   function wideFirstSearch(node) {
        var queue = [];
        while(node){
            console.log(node.tagName);
            Array.from(node.children).forEach(function (el) {
                queue.push(el);
            });
            node = queue.shift();
        }
    }
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值