遍历DOM的方式

本文介绍两种DOM遍历方法:递归函数与ES6生成器,展示如何高效地遍历DOM树并处理节点。

以如下html代码为例:

<div id="content">
    <h3>我是标题</h3>
    <p>
      <span>我是span内容1</span>
      <span>我是span内容2</span>
    </p>
  </div>

1.比较常见的是使用递归的方式

   function traversalDom(element, callback) {
      callback(element);
      element = element.firstElementChild;
      while(element) {
        traversalDom(element, callback);
        element = element.nextElementSibling;
      }
    }
    const subTree = document.getElementById('content');
    const callback = subTree => {
      console.log(element.innerText, element.tagName, '子元素的个数:', element.childElementCount)
    }
    traversalDom(subTree, callback)

2.使用es6的生成器。 

   function* traversalDom(element) {
      yield element;
      element = element.firstElementChild;
      while (element) {
//用yield将迭代控制转移到另一个DomTraversal生成器实例上
        yield* traversalDom(element); 
        element = element.nextElementSibling;
      }
    }
    const subTree = document.getElementById('content');
    for( let element of traversalDom(subTree)) {
      console.log(element.innerText, element.tagName, '子元素的个数:', element.childElementCount)
    }

输出结果如下图:

不同于在下一层递归处理每个访问过的节点子树,使用生成器的方式为每个访问过的节点创建了一个生成器并将执行权交给它,从而使我们能够以迭代的方式书写概念上递归的代码。它的好处在于我们能够不凭借回调函数,仅仅以一个简单的for-of循环就能处理生成的节点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值