Javascript-15-DOM-3

遍历

“DOM2级遍历和范围”模块定义了两个用于辅助完成顺序遍历DOM结构的类型:NodeIterator和TreeWalker。这两个类型能够基于给定的起点对DOM结构执行深度优先(depth-first)的遍历操作。在于DOM兼容的浏览器中都可以访问到这些类型的对象。IE不支持DOM遍历。使用下列代码可以检测浏览器对DOM2级遍历能力的支持情况。

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

如前所述,DOM遍历是深度优先的DOM结构遍历,也就是说,移动的方向至少有两个(取决于使用的遍历类型)。遍历以给定节点为根,不可能向上超出DOM树的根节点。

NodeIterator

可以使用document.createNodeIterator()方法创建它的新实例。接受以下4个参数。

  • root:想要作为搜索起点的树中的节点。
  • whatToShow:表示想要访问哪些节点的数字代码。
  • filter:是一个NodeFilter对象,或者一个表示应该接受还是拒绝某种特定节点的函数。
  • entityReferenceExpansion:布尔值,表示是否要拓展实体引用。这个参数在HTML中没有用,因为其中的实体引用不能拓展。

whatToShow参数是一个位掩码,通过应用一或多个过滤器(filter)来确定要访问哪些节点。这个参数的值以常量的形式在NodeFilter类型中定义,如下所示:

  • NodeFilter.SHOW_ALL:显示所有类型的节点。
  • NodeFilter.SHOW_ELEMENT:显示元素节点。
  • NodeFilter.SHOW_ATTRIBUTE:显示特性节点。由于DOM结构原因,实际上不能使用这个值。
  • NodeFilter.SHOW_TEXT:显示文本节点。
  • NodeFilter.SHOW_CDATA_SECTION:显示CDATA节点。对HTML页面没用。
  • NodeFilter.SHOW_ENTITY_REFERENCE:显示实体引用节点。对HTML页面没用。
  • NodeFilter.SHOW_ENTITYE:显示实体节点。对HTML页面没用。
  • NodeFilter.SHOW_PROCESSING_INSTRUCTION:显示处理指令节点。对HTML页面没用。
  • NodeFilter.SHOW_COMMENT:显示注释节点。
  • NodeFilter.SHOW_DOCUEMNT:显示文档节点。
  • NodeFilter.SHOW_DOCUMENT_TYPE:显示文档类型节点。
  • NodeFilter.SHOW_DOCUMENT_FRAGMENT:显示文档片段节点。对HTML页面没用。
  • NodeFilter.SHOW_NOTATION:显示符号节点。对HTML页面没用。

除了NodeFilter.SHOW_ALL之外,可以使用按位或操作符来组合多个选项。

可以通过createNodeIterator()方法的filter参数来指定自定义的NodeFilter对象,或者指定一个功能类似节点过滤器(node filter)的函数,每个NOdeFilter对象只有一个方法,即acceptNode();如果应该访问给定的节点,该方法返回NodeFilter.FILTER_ACCEPT,如果不应该访问给定的节点,该方法返回NodeFilter.FILTER_SKIP。由于NodeFilter是一个抽象的类型,因此不能直接创建它的实例。在必要时,只要创建一个包含acceptNode()方法的对象,然后将这个对象传入createNodeIterator()中即可。

NodeIterator类型的两个主要方法是nextNode()和previousNode()。顾名思义,在深度优先的DOM子树遍历中,nextNode()方法主要用于向前前进一步,而previousNode()用于向后后退一步。在刚刚创建的NodeIterator对象中,有一个内部指针指向根节点,因此第一次调用nextNode()会返回根节点。当遍历到DOM子树的最后一个节点时,nextNode()返回null。previousNode()方法的工作机制类似。当遍历到DOM子树的最后一个节点,且previousNode()返回根节点之后,再次调用它就会返回null。

由于nextNode()和previousNode()方法都基于NodeIterator在DOM结构中的内部指针工作,所以DOM结构的变化会反映在遍历的结果中。

TreeWalker

TreeWalker是NodeIterator的一个更高级的版本。除了包括nextNode()和previousNode()在内的相同的功能之外,这个类型还提供了下列用于在不同方向上遍历DOM结构的方法。

  • parentNode():遍历到当前节点的父节点。
  • firstChild():遍历到当前节点的第一个子节点。
  • lastChild():遍历到当前节点的最后一个子节点。
  • nextSibing():遍历到当前节点的下一个同辈节点。
  • previousSibing():遍历到当前节点的上一个同辈节点。

创建TreeWalker对象要使用document.createTreeWalker()方法,这个方法接受的4个参数与document.createNodeIterator()方法相同:作为遍历起点的根节点、要显示的节点类型、过滤器、一个表示是否拓展实体引用的布尔值。

TreeWalker真正强大的地方在于能够在DOM结构中沿任何方向移动。

你可能感兴趣的:(Javascript-15-DOM-3)