DOM2级提供的对DOM结构执行深度优先遍历 笔记
NodeIterator和TreeWalker这2个类型可以基于给定的起点对DOM结构执行深度优先遍历。(我测试用的浏览器是Chrome,介绍说IE不支持DOM遍历,但是不知道最新的IE支持不支持)
1、NodeIterator
使用document.createNodeIterator()方法创建新实例,该方法接受4个参数:
(1)、root:要访问的树的根节点。
(2)、whatToShow:要访问的节点的数字代码。
(3)、filter:是一个NodeFilter对象,或者一个表示过滤特定节点的函数。
(4)、entityReferenceExpansion:布尔值,表示是否要扩展实体引用。
whatToShow参数是一个位掩码,通过应用1或多个过滤器来确定要访问哪些节点。这个参数的值以常量的形式在NodeFilter类型中定义,具体的可以搜一下,同事可以使用"||"操作符来组合多个选项。
Filter参数用来自定义NodeFilter对象,或者指定一个过滤特定节点的函数。每个NodeFilter对象只有一个方法,即acceptNode();如果访问了给定的节点,该方法返回NodeFilter.FILTER_ACCEPT,如果访问了未给定的节点,该方法返回NodeFilter.FILTER_SKIP。由于NodeFilter是一个抽象的类型,因此不能直接创建它的实例。只要创建一个包含acceptNode()方法的对象,然后将这个对象传入createNodeIterator()中即可。
例如,下列代码展示了创建一个只显示<p>元素的节点迭代器:
var filter = {
acceptNode: function(node) {
return node.tagName.toLowerCase() == 'p' ?
NodeFilter.FILTER_ACCEPT :
NodeFilter.FILTER_SKIP;
}
};
var iterator = document.createNodeIterator(root, NodeFilter.SHOW_ELEMENT, filter, false);
第三个参数也可以是一个与acceptNode()方法类似的函数,如下:
var filter = function(node) {
return node.tageName.toLowerCase == 'p' ?
NodeFilter.FILTER_ACCEPT :
NodeFilter.FILTER_SKIP;
}
};
var iterator = document.createNodeIterator(root, NodeFilter.SHOW_ELEMENT, filter, false);
如果不指定过滤器,那么第三个参数就设置为null。
NodeIterator类型的两个主要方法是nextNode()和previousNode()。在新创建的NodeIterator对象中,有一个内部指针指向根节点,第一次调用nextNode()会返回根节点。当遍历到DOM子树的最后一个节点时,nextNode()返回null。同理,当遍历到DOM子树的最后一个节点,且previousNode()返回根节点之后,再次调用它就会返回null。
假设有如下一段代码,我们要去除里面每一个<li>节点
<div id="div1">
<div></div>
<ul>
<li>0</li>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
<li>6</li>
</ul>
</div>
<script>
var div = document.getElementById('div1');
var filter = function(node) {
return node.tagName.toLowerCase() == 'li' ? NodeFilter.FILTER_ACCEPT :NodeFilter.FILTER_SKIP;
}; var iterator = document.createNodeIterator(div, NodeFilter.SHOW_ELEMENT, filter, false); var node = iterator.nextNode();
var nodes = [];
while (node !== null) {
nodes.push(node.tagName.toLowerCase());
node = iterator.nextNode();
}
console.log(nodes);
</script>

2、TreeWalker
TreeWalker是NodeIterator的一个更高级的版本。除了包括nextNode()和previousNode()在内的相同功能之外,该类型还提供了下列方法:
(1)、parentNode():遍历到当前节点的父节点。
(2)、firstChild():遍历到当前节点的第一个子节点。
(3)、lastChild():遍历到当前节点的最后一个子节点。
(4)、nextSibling():遍历到当前节点的下一个兄弟节点。
(5)、previousSibling():遍历到当前节点的上一个兄弟节点。
创建TreeWalker对象要使用document.createTreeWalker()方法,该方法接受4个参数(与document.createNodeIterator()方法相同):作为遍历起点的根节点、要显示的节点类型、过滤器和一个表示是否扩展实体引用的布尔值。
基础的使用和document.createNodeIterator()很相似:
var filter = {
acceptNode: function(node) {
return node.tagName.toLowerCase() == 'p' ?
NodeFilter.FILTER_ACCEPT :
NodeFilter.FILTER_SKIP;
}
};
var iterator = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT, filter, false);
filter的返回值除了NodeFilter.FITLER_ACCEPT和NodeFilter.FILTER_SKIP之外,还可以使用NodeFilter.FILTER_REJECT。在使用NodeFitler对象时,NodeFilter.FILTER_SKIP和NodeFitler.FILTER_REJECT的作用相同:跳过指定节点。但在使用TreeWalker对象时,NodeFilter.FILTER_SKIP会跳过相应节点继续前进到该节点的子树的下一个节点;而NodeFilter.FILTER_REJECT则会跳过相应节点及该节点的整个子树。
当然,TreeWalker真正强大的地方在于能够在DOM结构中沿任何方向移动。
<div id="div1">
<div></div>
<ul>
<li>0</li>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
<li>6</li>
</ul>
</div> <script>
var div = document.getElementById('div1');
var walker = document.createTreeWalker(div, NodeFilter.SHOW_ELEMENT, null, false); walker.firstChild(); //转到<div>
walker.nextSibling(); //转到<ul> var node = walker.firstChild(); //转到第一个<li>
var nodes = [];
while (node !== null) {
nodes.push(node.tagName.toLowerCase());
node = walker.nextSibling();
}
console.log(nodes);
</script>

TreeWalker类型还有一个属性,叫做currentNode,表示任何遍历方法在上一次遍历中返回的节点。通过设置这个属性也可以修改遍历继续进行的起点。
DOM2级提供的对DOM结构执行深度优先遍历 笔记的更多相关文章
- 关于DOM2级事件的事件捕获和事件冒泡
DOM2级事件中addEventListener的执行机制,多个addEventListener同时添加时的执行先后规律: W3C的DOM事件触发分为三个阶段:①.事件捕获阶段,即由最顶层元素(一般是 ...
- js 中用Dom2级事件处理函数(改变样式)
下面这些客户端 javascript代码用到了事件,它给一个很重要的事件--“load" 事件注册了一个事件处理程序.同时展示了注册”click“事件处理函数更高级的一种方法 <!do ...
- 关于DOM事件流、DOM0级事件与DOM2级事件
一.DOM 事件模型 DOM 事件模型包括捕获和冒泡,捕获是从上往下到达目标元素,冒泡是从当前元素,也就是目标元素往上到 window 二.流 流的概念,在现今的 JavaScript 中随处可见.比 ...
- 2015-03-12——简析DOM2级事件
DOM2级事件 事件的几种类型:对象事件,鼠标事件,键盘事件,表单事件,W3CDOM事件,以及针对浏览器的事件. 对象事件:window对象,也是javascript对象.load 适用于windo ...
- 测试DOM0级事件和DOM2级事件的堆叠
1. 问题 如果大家看过北风网CJ讲师的Javascript视频教程,就可以看到其封装了一个很强的事件添加和删除函数,如下所示 function addEvent(obj, evtype, fn) { ...
- JavaScript 【非IE DOM2级XML】
DOM2中的XML IE可以实现了对XML字符串或XML文件的读取,其他浏览器也各自实现了对XML处理功能.DOM2级在document.implementaion中引入了createDocument ...
- DOM1级问题与DOM2级事件
前几天有小伙伴问过我一个问题,为什么有DOM 0级事件以及DOM2级事件,但是却没有DOM1级事件呢?那我们今天就来说一说DOM的级别问题. 同时推荐伙伴们可以看看尚学堂有关JavaScript BO ...
- DOM0级与DOM2级
定义: 0级DOM 分为2个:一是在标签内写onclick事件 二是在JS写onlicke=function(){}函数 1) <input id="myButton" t ...
- js DOM0级事件和DOM2级事件
注册事件有两种方式,分别是DOM0级和DOM2级 DOM0级就是通过事件绑定的形式dom元素只能有(绑定)一个事件处理函数,他的特点是同一个元素绑定相同事件, 后面函数会覆盖前面的 绑定: dom.o ...
随机推荐
- java中cookie存取值
cookie存值: Cookie userCookie=new Cookie("loginInfo",loginInfo); userCookie.setMaxAge(30*24* ...
- Python的方法解析顺序(MRO)
mro即method resolution order,主要用于在多继承时判断调的属性的路径(来自于哪个类). http://blog.csdn.net/imzoer/article/details/ ...
- 配置oozie4.10+hadoop2.5.2
终于将这个神秘的寻象人 oozie 安装配置成功了,这个困扰我好几天, 当看到如下的画面, 我觉得值! 废话少说,看我如何编译和安装过程: (已经将hadoop2.5.2HA 的环境搭建起来了,hiv ...
- iOS新手引导页的实现,源码。
/*.在Main.storyboard中找到,ScrollView和PageControl并添加到ViewController中. .在ScrollView中添加ImageView,新手引导页有几个图 ...
- 前端实现图片懒加载(lazyload)的两种方式
在实际的项目开发中,我们通常会遇见这样的场景:一个页面有很多图片,而首屏出现的图片大概就一两张,那么我们还要一次性把所有图片都加载出来吗?显然这是愚蠢的,不仅影响页面渲染速度,还浪费带宽.这也就是们通 ...
- EF不能很好的支持DDD?估计是我们搞错了!
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:最近在ABP项目中尝试纯粹的DDD,然后遇到EF实现的Repository似乎不能很好 ...
- 第二十二篇:在SOUI中使用代码向窗口中插入子窗口
使用SOUI开发客户端UI程序,通常也推荐使用XML代码来创建窗口,这样创建的窗口使用方便,当窗口大小改变时,内部的子窗口也更容易协同变化. 但是最近不断有网友咨询如何使用代码来创建SOUI子窗口,特 ...
- collection of vim vim tutorial for beginner
在linux命令行下编辑文档 http://blog.csdn.net/niushuai666/article/details/7275406 http://linuxconfig.org/vim-t ...
- 前端js调用七牛制作评价页面案例
一.需求 公司所有的上传页面都用七牛,前端不免要直接调用七牛的代码进行上传,以下是一个实现七牛上传的案例,制作一个常见的商品评价页面,页面需求很常见当上传到第五章图片的时候,上传按钮消失,上传需要显示 ...
- 学习微信小程序之css10外边距
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...