返回

DOM 遍历 - 深度优先与广度优先

前端

<!DOCTYPE html>
<html>
<head>
  
</head>
<body>
  <div id="container">
    <p>段落 1</p>
    <p>段落 2</p>
    <div id="child">
      <p>段落 3</p>
      <p>段落 4</p>
    </div>
    <p>段落 5</p>
  </div>

  <script>
    // 深度优先遍历
    function depthFirstTraversal(node) {
      console.log(node.nodeName);
      for (var i = 0; i < node.childNodes.length; i++) {
        depthFirstTraversal(node.childNodes[i]);
      }
    }

    // 广度优先遍历
    function breadthFirstTraversal(node) {
      var queue = [node];
      while (queue.length > 0) {
        var currentNode = queue.shift();
        console.log(currentNode.nodeName);
        for (var i = 0; i < currentNode.childNodes.length; i++) {
          queue.push(currentNode.childNodes[i]);
        }
      }
    }

    // 执行遍历
    var container = document.getElementById("container");
    depthFirstTraversal(container);
    breadthFirstTraversal(container);
  </script>
</body>
</html>

前言

DOM(Document Object Model)是 HTML 和 XML 文档的编程接口。它允许脚本访问、修改和创建 HTML 和 XML 文档。DOM 树是 DOM 的可视化表示,它可以帮助我们更好地理解 DOM 的结构和层次。

深度优先遍历

深度优先遍历是一种从根节点开始,依次遍历每个节点的子节点,直到所有子节点都遍历完毕后才返回父节点的遍历方式。

function depthFirstTraversal(node) {
  console.log(node.nodeName);
  for (var i = 0; i < node.childNodes.length; i++) {
    depthFirstTraversal(node.childNodes[i]);
  }
}

广度优先遍历

广度优先遍历是一种从根节点开始,先遍历所有第一层子节点,然后再遍历所有第二层子节点,以此类推的遍历方式。

function breadthFirstTraversal(node) {
  var queue = [node];
  while (queue.length > 0) {
    var currentNode = queue.shift();
    console.log(currentNode.nodeName);
    for (var i = 0; i < currentNode.childNodes.length; i++) {
      queue.push(currentNode.childNodes[i]);
    }
  }
}

比较

深度优先遍历和广度优先遍历各有优缺点。深度优先遍历的优点是简单易懂,缺点是可能导致栈溢出。广度优先遍历的优点是不会导致栈溢出,缺点是可能需要更多的内存。

总结

深度优先遍历和广度优先遍历都是遍历 DOM 树的常用方法。选择哪种遍历方式取决于具体的需求。