“DOM2级遍历和范围” 定义了两个用于辅助完成顺序遍历的DOM结构类型
NodeIterator 和 TreeWalk
上述两种类型可以基于给定起点的DOM结构执行深度优先的遍历操作
对于检测浏览器对于该功能的实现可以使用以下代码
var supportTraversals = document.implementation.hasFeature("Traversal","2.0"); var supportsNodeIterator = (typeof document.createNodeIterator === "function"); var supportsTreeWalker = (typeof document.createTreeWalker === "function");
所谓深度优先,也就是对于树的深度优先遍历,即先一层一层往子节点深入,深入到最深层次的子节点后才返回上一层进行相同的遍历操作
其遍历顺序如上所示
NodeIterator类型是两者中较为简单的那个
该类型可以使用 document.createNodeIterator() 方法创建
该方法接收以下四个参数
var filter = { acceptNode:function(node){ return node.tagName.toLowerCase() === "p" ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP; } }
函数:
var filter = function(node){ return node.tagName.toLowerCase() === "p" ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP; }
·
若希望使用该类型遍历文档中的元素最主要的两个方法就是 nextNode() 和 previousNode() 用于实现遍历的上一步和下一步,返回一个指向当前遍历节点的指针,若已经遍历完成回到起始节点则返回null
var div = document.getElementById("div1"); var iterator = document.createNodeIterator(div,NodeFilter.SHOW_ELEMENT,null,false); var node = iterator.nextNode(); while(node !=== null){ alert(node.tagName); node = iterator.nextNode(); }
可使用上方代码遍历下方的文档
<div id ="div1"> <p><b>hello</b>World!</p> <ul> <li>1</li> <li>2</li> <li>3</li> <ul> </div>
TreeWalker是NodeIterator 的高级版本
其创建方式和 NodeIterator 一致
除了 NodeIterator 所拥有的 nextNode、previousNode之外
TreeWalker还拥有以下方法
其构建方法为: document.createTreeWalker()
还有一点不同在于 TreeWaler 可以使用 NodeFilter.FILTER_REJECT
其与 Node FIlter.FILTER_SKIP 的区别在于 SKIP 只会跳过当前节点,而REJECT会跳过当前节点及其子树
除此而外 TreeWalk 还有一个 currentNode 属性可以修改起始节点
关于遍历部分需要注意的是IE似乎并没有类似的遍历节点的解决方案,所以跨浏览器的遍历方法十分少见
Javascript高级编程学习笔记(53)—— DOM2和DOM3(5)遍历
原文:https://www.cnblogs.com/lhyxq/p/10351597.html