遍历

“DOM2级遍历和范围” 定义了两个用于辅助完成顺序遍历的DOM结构类型

NodeIterator 和 TreeWalk

上述两种类型可以基于给定起点的DOM结构执行深度优先的遍历操作

对于检测浏览器对于该功能的实现可以使用以下代码

var supportTraversals = document.implementation.hasFeature("Traversal","2.0");

var supportsNodeIterator = (typeof document.createNodeIterator === "function");

var supportsTreeWalker = (typeof document.createTreeWalker === "function");

所谓深度优先,也就是对于树的深度优先遍历,即先一层一层往子节点深入,深入到最深层次的子节点后才返回上一层进行相同的遍历操作

其遍历顺序如上所示

NodeIterator

NodeIterator类型是两者中较为简单的那个

该类型可以使用 document.createNodeIterator() 方法创建

该方法接收以下四个参数

  1. root:作为搜索起点的节点
  2. whatToShow:要访问节点的数字代码
    • 这些值以常量的形式定义在 NodeFilter 类型
    • NodeFilter.SHOW_ALL:显示所有类型的节点
    • NodeFilter.SHOW_ELEMENT:显示元素节点
    • NodeFilter.SHOW_ATTRIBUTE:显示特性节点(由于DOM结构的原因在实际使用时并不能使用该值)
    • NodeFilter.SHOW_TEXT:显示文本节点
    • NodeFilter.SHOW_CDATA_SETCTION:显示CDATA节点对HTML页面没有作用
    • NodeFilter.SHOW_ENTITY_REFERENCE:显示实体引用节点,对HTML页面不起作用
    • NodeFilter.SHOW_ENTITY:显示实体节点,对HTML页面不起作用
    • NodeFilter.SHOW_PROCESSING_INSTRUCTION:显示指令处理节点对HTML页面不起作用
    • NodeFilter.SHOW_COMMENT:显示注释节点
    • NodeFilter.SHOW_DOCUMENT:显示文档节点
    • NodeFilter.SHOW_DOCUMENT_TYPE:显示文档类型节点
    • NodeFilter.SHOW_DOCUMENT_FRAGMENT:显示文档片段节点,对HTML页面无效
    • NodeFilter.SHOW_NOTATION:显示符号节点
    • 以上常量可以使用位操作符来组合(除SHOW_ALL外),如 NodeFilter.SHOW_TEXT | NodeFilter.SHOW_COMMENT
  3. filter:一个Node Filter对象,或一个表示接受或拒绝节点的函数
    1. NodeFilter对象:

      var filter = {
      acceptNode:function(node){
      return node.tagName.toLowerCase() === "p" ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP;
      }
      }
    2. 函数:

      var filter = function(node){
      return node.tagName.toLowerCase() === "p" ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP;
      }

        

  4. entityReferenceExpansion:布尔值,是否拓展实体引用,HTML中不起作用,因为其中的实体不能拓展

·

若希望使用该类型遍历文档中的元素最主要的两个方法就是 nextNode() 和 previousNode() 用于实现遍历的上一步和下一步,返回一个指向当前遍历节点的指针,若已经遍历完成回到起始节点则返回null

var div = document.getElementById("div1");
var iterator = document.createNodeIterator(div,NodeFilter.SHOW_ELEMENT,null,false);
var node = iterator.nextNode();
while(node !=== null){
alert(node.tagName);
node = iterator.nextNode();
}

可使用上方代码遍历下方的文档

<div id ="div1">
<p><b>hello</b>World!</p>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<ul>
</div>

TreeWalker

TreeWalker是NodeIterator 的高级版本

其创建方式和 NodeIterator 一致

除了 NodeIterator 所拥有的 nextNode、previousNode之外

TreeWalker还拥有以下方法

  • parent Node():得到当前节点的父节点
  • first Child():得到当前节点的第一个子节点
  • last Child():当前节点的最后一个子节点
  • nextSibling():当前节点的下一个同辈节点
  • previousSibling():当前节点的上一个同辈节点

其构建方法为: document.createTreeWalker()

还有一点不同在于 TreeWaler 可以使用 NodeFilter.FILTER_REJECT

其与 Node FIlter.FILTER_SKIP 的区别在于 SKIP 只会跳过当前节点,而REJECT会跳过当前节点及其子树

除此而外 TreeWalk 还有一个 currentNode 属性可以修改起始节点

关于遍历部分需要注意的是IE似乎并没有类似的遍历节点的解决方案,所以跨浏览器的遍历方法十分少见

Javascript高级编程学习笔记(53)—— DOM2和DOM3(5)遍历的更多相关文章

  1. Javascript高级编程学习笔记(49)—— DOM2和DOM3(1)DOM变化

    DOM变化 我们知道DOM有许多的版本,其中DOM0和DOM2这两个级别以对事件的纳入标准而为人所知 但是呢,这里不讲事件,在后面会有专门和事件有关的部分作为详细讲解 这里就只讲一下DOM2和DOM3 ...

  2. Javascript高级编程学习笔记(1)—— JS简介

    此系列文章,用于记录所学,如有错误欢迎指出. Javascript组成 1.核心(ECMAScript) 2.文档对象模型(DOM) 3.浏览器对象模型(BOM) 1.核心(ECMAScript) E ...

  3. Javascript高级编程学习笔记(54)—— DOM2和DOM3(6)范围选择

    范围 为了让开发人员更加方便地控制页面“DOM2级遍历和范围”模块定义了“范围”接口 通过该接口开发人员可以选择文档中的一个区域,而不必考虑元素的界限 在常规操作不能有效地修改文档时,使用范围往往可以 ...

  4. Javascript高级编程学习笔记(52)—— DOM2和DOM3(4)元素大小

    在日常实践中,我们在使用JS的时候难免会需要获取元素的大小及位置 首先要声明的是,这一部分的内容并不属于DOM2样式规范,因为DOM中并没有对我们如何获取元素大小的相关信息做出规范 偏移量 偏移量及元 ...

  5. Javascript高级编程学习笔记(50)—— DOM2和DOM3(2)样式

    样式 在HTML中定义元素的方式有以下三种: 1.link标签引入外部样式表 2.style标签定义嵌入样式 3.通过JS中对style特性定义元素样式(行内样式) “DOM2级样式”围绕上述样式机制 ...

  6. Javascript高级编程学习笔记(56)—— DOM2和DOM3(8)低版本IE范围

    虽然IE9支持了DOM范围,但是IE8及更早版本并不支持DOM范围 所以IE8以下的更早版本的IE提出了与之类似的概念以供大家使用 也就是 文本范围 var range = document.body ...

  7. Javascript高级编程学习笔记(55)—— DOM2和DOM3(7)操作范围

    操作范围中的内容 在创建范围时,内部会为这个范围创建一个文档片段 范围所属的全部节点都会被添加到这个片段中 虽然选取范围可以不是完整的.良好的DOM结构 但是在这个为范围创建的文档片段中,会自己完缺少 ...

  8. Javascript高级编程学习笔记(51)—— DOM2和DOM3(3)操作样式表

    操作样式表 在JS中样式表用一种类型来表示,以便我们在JS对其进行操作 这一类型就是CSSStyleSheet 即CSS样式表类型,包括了之前 style 对象所不包括的外部样式表以及嵌入样式表 其中 ...

  9. Javascript高级编程学习笔记(57)—— 事件(1)事件流

    事件 JS与HTML的交互是通过事件实现的 而事件指的就是:文档或浏览器窗口特定的交互瞬间 可以通过侦听器来预定事件,以便在事件发生时执行相应的代码 这种模式也是设计模式中的观察者模式 事件流 有了事 ...

随机推荐

  1. 用7ch中断例程完成jmp near ptr s指令的功能,用bx向中断例程传送转移位移。

    应用举例:在屏幕的第12行,显示data段中以0结尾的字符串. assume cs:code data segment db data ends code segment start: mov ax, ...

  2. 201771010134杨其菊《面向对象程序设计(java)》第十六周学习总结

    第十六周学习总结 第一部分:理论知识 1. 程序是一段静态的代码,它是应用程序执行的蓝本.进程是程序的一次动态执行,它对应了从代码加载.执行至执行完毕的一个完整过程.操作系统为每个进程分配一段独立的内 ...

  3. flex布局嵌套之高度自适应

    查遍各大资源无任何flex嵌套布局的例子,经过自己折腾完成了项目中的高度自适应需求(更多应用于前端组件) 效果图: html代码:(关键地方已经用颜色特别标识 ^_^) <!DOCTYPE ht ...

  4. 二、PyQt5基本功能和操作入门

    在这里,我将根据自己的学习历程从初级到高级介绍pyqt5.因为是学到哪里就写道哪里,所以内容排版比较随意.有两点问题需要先说明: 1.虽然界面的设计可以借助qt designer进行拖拽创建,并且可以 ...

  5. Linux学习笔记:Jenkins的使用(二)

    一些插件的使用 Deploy to container Plugin jenkins安装完成之后,添加插件 Deploy to container Plugin ,这个插件可以将打好的war包部署到t ...

  6. 关于python,完善我计算机知识的一步。

    因为身为理科男,所以特别喜欢涉及其他领域的知识.而对我来说,计算机是很有诱惑力的--尤其是程序语言设计,懂得一门“外语”是多么的重要.大一时候接触过包括有计算机的基本知识,c语言,这个新的学期也开始接 ...

  7. Windows 10 专业版 长期服务版 激活

    这个用小白系统之后一段时间显示要求激活,或者更改产品秘钥.网上找了许多秘钥也是没啥用,又不想用激活工具的话,可以试试用win+R 输入cmd : 依次输入:slmgr /skms kms.digibo ...

  8. 异常:No Spring WebApplicationInitializer types detected on classpath

    原因: 启动服务提供者/服务消费者-->去注册中心Zookeeper无法注册这个服务 / 在监控中心无法发现服务 异常提示:No Spring WebApplicationInitializer ...

  9. bp代码

    #电池老化率测定的神经网络模型 import tensorflow as tf import numpy as np import matplotlib.pyplot as plt import pa ...

  10. python微信自动回复

    模块是itchat 下载:命令行输入 pip install itchat import itchat #导入itchat模块 itchat.auto_login() #登陆微信,授权 用命令行发送给 ...