`
cqh520llr
  • 浏览: 509922 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

用JS遍历DOM(使用NodeIterator和TreeWalker) (转)

 
阅读更多
声明NodeFilter在IE中不能使用

第一种方法:使用NodeIterator

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


用到的四个参数意义如下:
1、root:从树中的哪个节点开始搜索;
2、whatToShow:一个数值代码,代表哪些节点需要搜索;
3、filter:NodeFilter对象,用来决定需要忽略哪些节点;
4、entityReferenceExpansion:布尔值,表示是否需要扩展实体引用;
whatToShow参数可以有下列这些常量或其组合的取值:
1、NodeFilter.SHOW_ALL:搜索所有节点;
2、NodeFilter.SHOW_ELEMENT:搜索元素节点;
3、NodeFilter.SHOW_ATRRIBUTE:搜索特性节点;
4、NodeFilter.SHOW_TEXT:搜索文本节点;
5、NodeFilter.SHOW_ENTITY_REFERENCE:搜索实体引用节点;
6、NodeFilter.SHOW_ENTITY:搜索实体节点;
7、NodeFilter.SHOW_PROCESSING_INSTRUCTION:搜索PI节;
8、NodeFilter.SHOW_COMMENT:搜索注释节点;
9、NodeFilter.SHOW_DOCUMENT:搜索文档节点;
10、NodeFilter.SHOW_DOCUMENT_TYPE:搜索文档类型节点;
11、NodeFilter.SHOW_DOCUMENT_FRAGMENT:搜索文档碎片节节;
12、NodeFilter.SHOW_NOTATION:搜索记号节点;

可以使用二进制操作来组合多个值:
var whattoshow = NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_TEXT;
常用的有按位或运算符"|"和按位取补运算符"~";
filter参数可以指定一个自定义的NodeFilter对象,但如果不想使用它的话,也可以留空(null);
要创建最简单的访问所有节点的NodeIterator对象,可以使用下面的代码:
var iterator = document.createNodeIterator(document, NodeFilter.SHOW_ALL, null, false);
要在搜索过程中前进或者后退,可以使用nextNode()和previousNode()方法:
var node1 = iterator.nextNode();
var node2 = iterator.nextNode();
var node3 = iterator.previousNode();
alert(node1 == node3);输出结果为“true”;
例如,想列出某个区域内指定<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>


第二种方法使用TreeWalker遍历DOM文档
TreeWalker有点向NodeIterator的大哥一样:它有NodeIterator所有的功能,并且添加了下面一些遍历方法:
parentNode():进入当前节点的父节点;
firstChild():进入当前节点的第一子节点;
lastChild():进入当前节点的最后一个子节点
nextSibling():进入当前节点的下一个兄弟节点
previousSibling():进入当前节点的前一个兄弟节点
要开始使用TreeWalker,其实完全可以向使用NodeIterator一样,只需要将createNodeIterator()改成createTreeWalker()即可,这个函数接收同样的参数:


<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.createTreeWalker(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>

也可以使用TreeWalker特有的方法来准确的定位DOM文档的某一个节点:如获取<LI>节点

<html>
<head>
<title>dom中的NodeIterator对象示例</title>
<script>
function makelist()
{
    var oDiv = document.getElementById("div1");
     var oFilter = new Object;
     oFilter.acceptNode = function(oNode){
       return (oNode.tagName=="P")?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT;
     };
     var walker = document.createTreeWalker(oDiv,NodeFilter.SHOW_ELEMENT,oFilter,false);
     var oOutput = document.getElementById("text1");
     var oP = walker.firstChild(); //go to <p>
     var oUl = walker.nextSibling(); // go to <ul>
     var oLi = walker.firstChild();  //go to <li>
     while(oLi){
        oOutput.value += oLi.tagName + "\n";
        oLi = walker.nextSibling();
     }
}
</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>
分享到:
评论

相关推荐

    javascript先序遍历DOM树的方法

    TreeWalker与NodeIterator类似,也是DOM2 Traversal模块中用于遍历DOM树的一个接口,但它提供了更多控制节点遍历的选项。与NodeIterator不同,TreeWalker允许我们在遍历过程中跳过某些节点或修改遍历过程。以下是一...

    JavaScript遍历DOM元素的常见方式示例

    在JavaScript中,遍历DOM(文档对象模型)元素是网页动态操作的核心技能之一。DOM是HTML和XML文档的编程接口,允许我们通过脚本访问和修改文档内容、结构和样式。本文将详细介绍几种常见的遍历DOM元素的方法,并通过...

    DOM应用---遍历网页中的元素

    本文将深入探讨如何使用JavaScript来遍历DOM树,并通过实际示例展示其在实际应用中的价值。 1. **理解DOM树** - DOM树是由文档的各个部分组成的,包括元素、属性、文本节点等。每个节点都有父节点、子节点和兄弟...

    经典之作javascript dom编程艺术源码

    9. **DOM遍历与选择**:`NodeIterator`和`TreeWalker`接口提供了一种更高级的遍历DOM的方法,可以根据特定规则选择节点。 10. **DOM变更事件**:DOM操作如添加、删除元素时,会触发DOM事件,如`DOMNodeInserted`和`...

    javascript 操作xml_dom对象整理集合

    `NodeIterator`和`TreeWalker`接口提供了一种更灵活的方式遍历DOM树,可以定制遍历规则,例如只访问特定类型的节点。 9. **JavaScript技巧** - **闭包**:理解闭包有助于编写高效且无副作用的代码,它可以保持...

    JavaScriptDOM高级程序设计

    DOM遍历API(如`NodeIterator`和`TreeWalker`)帮助我们更有效地搜索和处理DOM树。DOM3级事件扩展了事件处理,引入了事件捕获和事件冒泡的概念,以及更多自定义事件的支持。 最后,现代JavaScript库和框架如jQuery...

    UIcourse_lecture9:DOM遍历

    2. 使用`NodeIterator`和`TreeWalker`: 这两个接口提供了一种更高效的方式遍历DOM,可以根据需求过滤节点。 3. 考虑使用`requestAnimationFrame`: 当遍历DOM涉及视觉更改时,使用`requestAnimationFrame`以保证更新...

    关于dom的帮助

    - `querySelectorAll`和`querySelector`用于根据CSS选择器找到匹配的元素集合和单个元素,而`traversal`模块提供`NodeIterator`和`TreeWalker`对象,允许深度优先或广度优先遍历DOM树。 这个“关于DOM的帮助”文件...

    javascript 高级程序设计

    - **DOM遍历工具**:NodeIterator和TreeWalker的使用,高效地遍历DOM树。 #### 高级Web技术 6. **XML与JavaScript**:包括DOM、XPath和XSLT的使用,以及在客户端解析和操作XML数据的方法。 7. **AJAX**:介绍异步...

    XML dom方法的运用,希望对你们有帮助

    7. 遍历DOM树:`NodeIterator`和`TreeWalker`接口提供了更高级别的遍历DOM的方法,可以根据特定条件选择节点。 在"DOMProject"这个压缩包中,可能包含了实现上述DOM操作的示例代码。通过研究这些例子,你可以深入...

    jWalker:W3C规范中针对DOM遍历(DOM级别2)定义的TreeWalker类的经过测试的跨浏览器JavaScript实现

    沃克 jWalker对提供了类的经过测试的跨浏览器JavaScript实现。... 但是,在进一步审查后,我发现NodeIterator由于其而无法在JavaScript中100%准确地实现,这需要对实时DOM进行的任何更新的浏览器级知识。

    Aspose.HTML-for-.NET:.NET的Aspose.HTML示例项目

    您可以使用各种方法(例如元素遍历,文档遍历,XPath查询和CSS选择器查询)浏览HTML文档,以及通过JavaScript处理HTML DOM,将HTML文件转换为图像或固定布局格式,然后转换(X) HTML和EPUB文件转换为其他文件格式...

    节点基础一

    7. **遍历DOM**:通过`childNodes`属性可以获取所有子节点,`firstChild`和`lastChild`指向第一个和最后一个子节点,`nextSibling`和`previousSibling`则用于遍历同胞节点。 8. **DOM更新**:当DOM结构发生变化时,...

    JS高级编程设计.pdf

    - **TreeWalker**:学习如何使用TreeWalker接口遍历DOM子树。 #### 6.6 DOM扩展 - **DOM扩展**:探讨不同浏览器对DOM的扩展和支持情况。 #### 6.7 DOM Level 3 - **DOM Level 3新特性**:介绍DOM Level 3规范中的...

    dom4:Haxe的DOM4实现

    - 遍历:`NodeIterator`和`TreeWalker`接口允许深度优先或广度优先遍历DOM树,有助于查找特定节点或执行复杂的节点操作。 - 拖放API:通过`DragEvent`和相关的接口,可以实现拖放功能,允许用户在页面上移动元素,...

    checkpoint-DOM:检查点DOM

    这可以通过DOM遍历API如`NodeIterator`和`TreeWalker`来完成。 2. **序列化DOM**:捕获到的DOM状态需要被转化为可以存储和恢复的格式,通常是JSON或其他序列化形式。这样可以方便地保存在内存中或持久化到磁盘。 3...

    js代码-frontend written (1) findFirstNode

    - 使用`NodeIterator`或`TreeWalker`接口,它们提供更高效的方式来遍历DOM。 - 如果可能,利用事件委托,而不是在每个匹配的元素上直接添加事件监听器,以减少内存消耗和提升性能。 - 考虑使用`...

    JavaScript-DOM

    `NodeIterator`和`TreeWalker`接口提供更灵活的遍历方式。 6. **DOM修改**:包括插入、删除、替换和移动节点。如`appendChild`、`insertBefore`、`removeChild`、`replaceChild`等方法。 7. **CSS操作**:DOM与CSS...

    js代码-NodeTraverse

    此外,`NodeIterator`和`TreeWalker` API也可以帮助我们更方便地遍历DOM。 在Node.js环境中,`fs`模块提供了文件系统的操作接口,这与前端的DOM操作不同。`README.txt`文件可能是项目说明,包含关于如何运行、配置...

    JavaScript

    - `NodeIterator` 和 `TreeWalker` 接口可以帮助遍历XPath结果。 5. **XPath与DOM遍历的比较** - DOM遍历涉及使用`getElementsByTagName()`, `getElementById()`, `querySelectorAll()`, `childNodes`等方法,而...

Global site tag (gtag.js) - Google Analytics