zoukankan      html  css  js  c++  java
  • 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>

     

  • 相关阅读:
    iOS很重要的 block回调
    怎样写具体设计文档
    ORM框架
    RapidXml用法
    【Android Training
    ORACLE触发器具体解释
    LeetCode 131 Palindrome Partitioning
    Git管理工具对照(GitBash、EGit、SourceTree)
    Android下将图片载入到内存中
    怎样破解邮箱password
  • 原文地址:https://www.cnblogs.com/yingzi/p/2623815.html
Copyright © 2011-2022 走看看