27-JavaScript高级程序设计-DOM2&3遍历

本文介绍了DOM2级遍历模块中的NodeIterator和TreeWalker两种类型,它们可以实现深度优先的DOM结构遍历。文章详细解释了如何创建这两种类型的实例及其主要方法,并提供了浏览器支持情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

三、遍历

“DOM2 级遍历和范围”模块定义了两个用于辅助完成顺序遍历 DOM 结构的类型:NodeIterator 和 TreeWalker。
这两个类型能够基于给定的起点对 DOM 结构执行深度优先(depth-first)的遍历操作。
(遍历以给定节点为根,不可能向上超出 DOM 树的根节点)
浏览器支持:Firefox 1+、Safari 1.3+、Opera 7.6+、Chrome 0.2+,IE不支持 DOM 遍历。

检测浏览器 对 DOM2 级遍历能力的支持:

var supportsTraversals = document.implementation.hasFeature("Traversal", "2.0"); 
var supportsNodeIterator = (typeof document.createNodeIterator == "function"); 
var supportsTreeWalker = (typeof document.createTreeWalker == "function");
1. NodeIterator

创建新实例:document.createNodeIterator(root,whatToShow,filter,entityReferenceExpansion)

参数:

  • root:想要作为搜索起点的树中的节点。
  • whatToShow:表示要访问哪些节点的数字代码。
    是一个位掩码,通过应用一或多个过滤器(filter)来确定要访问哪些节点。
    参数的值以常量形式在 NodeFilter 类型中定义,如NodeFilter.SHOW_ELEMENT。
  • filter:是一个 NodeFilter 对象,或者一个表示应该接受还是拒绝某种特定节点的函数。
    若是对象,只有一个方法 acceptNode(),如果应该访问给定的节点,该方法返回 NodeFilter.FILTER_ACCEPT,如果不应该访问给定的节点,该方法返回 NodeFilter.FILTER_SKIP。
    若是函数,类似 acceptNode()。
  • entityReferenceExpansion:布尔值,表示是否要扩展实体引用。
    这个参数在 HTML 页面中没有用,因为其中的实体引用不能扩展。
var filter = function(node){
  return node.tagName.toLowerCase() == "p" ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP;
 };
var iterator = document.createNodeIterator(root, NodeFilter.SHOW_ELEMENT, filter, false);

NodeIterator 类型的两个主要方法:nextNode() 和 previousNode()。
在深度优先的 DOM 子树遍历中,nextNode() 用于向前前进一步,previousNode() 用于向后后退一步。

在刚刚创建的 NodeIterator 对象中,有一个内部指针指向根节点,因此第一次调用 nextNode() 会返回根节点。当遍历到 DOM 子树的最后一个节点时,nextNode() 返回 null。
previousNode() 方法的工作机制类似。当遍历到 DOM 子树的最后一个节点,且 previousNode() 返回根节点之后,再次调用它就会返回 null。

2. TreeWalker

TreeWalker 是 NodeIterator 的一个更高级的版本。
方法:
nextNode():遍历向前前进一步
previousNode():遍历向后后退一步
parentNode():遍历到当前节点的父节点
firstChild():遍历到当前节点的第一个子节点
lastChild():遍历到当前节点的最后一个子节点
nextSibling():遍历到当前节点的下一个同辈节点
previousSibling():遍历到当前节点的上一个同辈节点
属性:
currentNode:表示任何遍历方法在上一次遍历中返回的节点;设置这个属性也可以修改遍历继续进行的起点

创建 TreeWalker 对象:document.createTreeWalker(root,whatToShow,filter,entityReferenceExpansion)
参数同 createNodeIterator 方法参数:
root:作为遍历起点的根节点;whatToShow:要显示的节点类型;filter:过滤器;entityReferenceExpansion:一个表示是否扩展实体引用的布尔值。

filter 可以返回的值有所不同:
除了 NodeFilter.FILTER_ACCEPT 和 NodeFilter. FILTER_SKIP 之外,还可以使用 NodeFilter.FILTER_REJECT
在使用 NodeIterator 对象时,NodeFilter.FILTER_SKIP 与 NodeFilter.FILTER_REJECT 的作用相同:跳过指定的节点。
在使用 TreeWalker 对象时,NodeFilter.FILTER_SKIP 会跳过相应节点继续前进到子树中的下一个节点,而 NodeFilter.FILTER_REJECT 则会跳过相应节点及该节点的整个子树。

强大之处:能够在 DOM 结构中沿任何方向移动。
配合使用 firstChild()、nextSibling() 等方法。

使用限制:IE 中没有对应的类型和方法,所以使用遍历的跨浏览器解决方案非常少见。


上一篇:26-JavaScript高级程序设计-DOM2&3样式
下一篇:28-JavaScript高级程序设计-DOM2&3范围

全书整理版:《Javascript高级程序设计》第3版(总结版)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值