DOM2级遍历和范围NodeIterator

可以用document对象的createNodeIterator()方法来创建NodeIterator对象,基本形式如下:
var iterator=document.createNodeIterator(root,whatToShow,filter,entityReferanceExpansion);

用到的四个参数的意义如下:

root: 从树的哪个节点开始搜索
whatToShow: 一个数值代码,代表哪些节点需要搜索
filter: NodeFilter对象,用来决定需要忽略哪些节点
entityReferanceExpansion:布尔值,表示需要扩展的实体引用

whatToShow 的参数可以有以下取值
SHOW_ALL:显示所有元素节点
SHOW_ELLEMENT:显示元素节点
SHOW_ATRRIBUTE:显示特性节点
SHOW_TEXT:显示文本节点
SHOW_ENTITY_REFERENCE:
SHOW_ENTITY:
SHOW_PROCESSING_INSTRUCTION:
SHOW_COMMENT:显示注释节点
SHOW_DOCUMENT:显示文档节点
SHOW_DOCUMENT_TYPE:显示文档类型节点
SHOW_DOCUMENT_FRAGMENT:
SHOW_NOTATION:

可使用二进制操作来组合多个值
var whattoshow = NodeFilter.SHOW_ELEMENT|NodeFilter.SHOW_TEXT;

常用的有按位或运算"|"和按位取补运算"~"

filter参数可以指定一个自定义的NodeFilter对象,但如果不想使用它的话,也可以留空;

要创建最简单的访问所有节点的NodeFilter对象,可以使用以下代码

var iterator = document.createNodeIterator(document,NodeFilter.SHOW_ALL,null,false);

要在搜索过程中前进或者后退,可以使用nextNode()和previousNode()

例如,想列出某个区域内指定<div />中包含的所有元素。下列代码可以完成这个任务:

<html>
<head>
<title>dom中的NodeIterator对象示例</title>
<script>
function makelist()
{
   var divnode = document.getElementById("div1");
   
   var iterator = document.createNodeIterator(divnode, NodeFilter.SHOW_ELEMENT, null, false);
   var oput = document.getElementById("textarea1");
   var node = iterator.nextNode();
   while(node)
   {
      oput.value += node.TagName +"\n";
      node = iterator.nextNode();
   }
}
</script>
</head>
<body>
<div id="div1">
   <p>你好<b>读者!</b></p>
   <ul>
      <li>列表项一</li>
      <li>列表项二</li>
      <li>列表项三</li>
      <li>列表项四</li>
   </ul>
</div>
<textarea id="textarea1" rows="10"></textarea><br />
<input type="button" value="生成列表" onclick="makelist()" />
</body>
</html>

但假设不想在结果中包含<p />元素。这就不能公用whatToShow参数来完成。这种情况下,就要用到filter参数,而filter参数需要自定义一个NodeFilter对象,该对象只有一个方法acceptNode()。如果应该访问给定的节点,那么该方法返回NodeFilter.FILTER_ACCEPT;如果不应该访问该节点并且其子节点也没兴趣,则返回NodeFilter.FILTER_REJECT;如果不应该访问该节点但仍对其子节点有兴趣,则返回NodeFilter.FILTER_SKIP。代码如下:

<html>
<head>
<title>dom中的NodeIterator对象示例</title>
<script>
function makelist()
{
   var divnode = document.getElementById("div1");
   var filter = new Object();
   filter.acceptNode = function(node)
   {
      return (node.TagName == "P") ? NodeFilter.FILTER_REJECT : NodeFilter.FILTER_ACCEPT;
   }
   var iterator = document.createNodeIterator(divnode, NodeFilter.SHOW_ELEMENT, filter, false);
   var oput = document.getElementById("textarea1");
   var node = iterator.nextNode();
   while(node)
   {
      oput.value += node.TagName +"\n";
      node = iterator.nextNode();
   }
}
</script>
</head>
<body>
<div id="div1">
   <p>你好<b>读者!</b></p>
   <ul>
      <li>列表项一</li>
      <li>列表项二</li>
      <li>列表项三</li>
      <li>列表项四</li>
   </ul>
</div>
<textarea id="textarea1" rows="10"></textarea><br />
<input type="button" value="生成列表" onclick="makelist()" />
</body>
</html>

 

原文地址:https://www.cnblogs.com/yingzi/p/2623815.html