《JS高程(3)》DOM2和DOM3-遍历-第12章笔记(24)
来源:互联网 发布:阿里云二级域名 端口 编辑:程序博客网 时间:2024/05/19 04:27
“DOM2级遍历和范围”模块定义了两个用于辅助完成顺序遍历DOM结构的类型:NodeIterator(迭代节点)
和TreeWalker
;这两个类型能够基于给定的起点对DOM结构执行深度优先(depth-first)的遍历操作。
IE不支持DOM遍历,使用以下代码检测浏览器对DOM2级遍历能力的支持的情况:
var supportsTraversals = document.implementation.hasFeature("Traversal", "2.0");var supportsNodeIterator = (typeof document.createNodeIterator == "function");var supportsTreeWalker = (typeof document.createTreeWalker == "function");
DOM结构执行深度优先,说明移动方向至少有两个。遍历一给定节点为根,不可能向上超出DOM树的根节点。
以HTML页面为例:
<!DOCTYPE html><html lang="en"> <head> <title>Example</title> </head> <body> <p><b>Hello</b>World</p> </body></html>
DOM树:
以document为根节点的DOM树进行深度优先遍历的先后顺序。
NodeIterator
NodeIterator类型,可以使用document.createNodeIterator()
方法创建新的实例,接受4个参数:
whatToShow参数是一个位掩码,通过应用一个或多个过滤器(filter)来确定访问哪些节点。这个参数的值以常量形式在NodeFilter类型中定义:
NodeFilter.SHOW_ALL:所有类型节点;NodeFilter.SHOW_ELEMENT:元素;NodeFilter.SHOW_ATTRIBUTE:特性;NodeFilter.SHOW_TEXT:文本;NodeFilter.SHOW_COMMENT;NodeFilter.SHOW_DOCUMENT;NodeFilter.SHOW_DOCUMENT_TYPE;
filter
可以使用createNodeIterator()方法的filter参数来指定自定义的NodeFilter对象,每个NodeFilter对象只有一个方法,应该访问的节点返回NodeFilter.FILTER_ ACCEPT
;不应该访问的节点返回NodeFilter.FILTER_SKIP
;
var filter = {acceptNode: function(){ return node.tageName.toLowerCase() == "p"? NodeFilter.FILTER_ACCEPT: NodeFilter.FILTER_SKIP; }};var iterator = document.createNodeIterator(root, NodeFilter.SHOW_ELEMENT, filter, false);
第三个函数也可以是一个与acceptNode()方法类似的函数:
var filter = function (){ return node.tagName.toLowerCase() == "p"? NodeFilter.FILTER_ACCEPT: NodeFilter.FILTER_SKIP;};var iterator = document.createNodeIterator(root, NodeFilter.SHOW_ELEMENT, filter, false);
如果不指定过滤器,在第三个参数出传入null。
NodeIterator类型的两个主要方法nextNode()和previousNode()。
nextNode()方法用于向前前进一步,第一调用时会返回根节点,遍历到最后一个节点时,返回null;
previousNode()方法用于后退一步,遍历到最后一个节点时,返回根节点,再次调用返回null。
以下面HTML为例:
<div id="div1"> <p><b>Hello</b>world!</p> <ul> <li>List item1</li> <li>List item2</li> <li>List item3</li> </ul></div>
遍历所有<div>
元素:
var div = document.getElementById("div1");var iterator = document.createNodeIterator(div, NodeFilter.SHOW_ELEMENT, null, false);var node = iterator.nextNode();while(node !== null){ // DIV P B UL LI LI LI LI alert(node.tagName); node = iterator.nextNode();}
只返回<li>
元素:
var div = document.getElementById("div1");var filter = function(node){ return node.tagName.toLowerCaxe() == "li"? NodeFilter.FILTER_ACCEPT: NodeFilter.FILTER_ACCEPT;};var iterator = document.createNodeIterator(div, NodeFilter.SHOW_ELEMENT, filter, false);var node = iterator.nextNode();while(node !== null){ alert(node.tagName); node = iterator.nextNode();};
TreeWalker
TreeWalker是NodeIterator的一个更高级的版本,除了nextNode()和previousNode()在内的相同的功能之外,还提供了其他遍历DOM结构的方法。
创建 TreeWalker对象方法:document.createTreeWalker();
参数:4个;
var div = document.getElementById("div1");var filter = function(node){ return node.tagName.toLowerCase() == "li";? NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP;}var walker = document.createTreeWalker(div, NodeFilter.SHOW_ELEMENT, filter, false);var node = walker .nextNode();while (node !== null){ alert(node.tagName); node = walker .nextNode();}
TreeWalker真正强大的地方在于能够在DOM结构中沿任何方向移动,即使不使用过滤器也可以得到想要的元素:
var div = document.getElementById("div1");var walker = document.createTreeWalker(div, NodeFilter.SHOW_ELEMENT, null, false);walker.firstChild();walker.nextSibling();var node = walker.firstChild();while (node !== null){ alert(node.tagName); node = walker.nextSilbling();}
- 《JS高程(3)》DOM2和DOM3-遍历-第12章笔记(24)
- 《JS高程(3)》DOM2和DOM3-DOM变化-第12章笔记(22)
- 《JS高程(3)》DOM2和DOM3-范围range-第12章笔记(25)
- 《JS高程(3)》DOM2和DOM3-样式、视口尺寸问题-第12章笔记(23)
- 第十二章:DOM2 和 DOM3(遍历)
- 第12章 DOM2和DOM3小结
- 第11章 DOM2 和 DOM3 (一)
- 第11章 DOM2 和 DOM3 (二)
- 第十二章:DOM2 和 DOM3(样式)
- 第十二章:DOM2 和 DOM3(范围)
- js学习笔记:DOM2和DOM3(放弃……)
- js高级程序设计笔记7--DOM2和DOM3
- 红宝书 第12章整理——DOM2和DOM3,非事件
- js--DOM--3.DOM2和DOM3
- JS学习11(DOM2&DOM3)
- 第十二章:DOM2 和 DOM3(DOM变化)
- 《JS高程(3)》DOM扩展-元素遍历-第11章笔记(19)
- JavaScript笔记:DOM2 & DOM3
- 学习实践:使用模式,原则实现一个C++自动化测试程序
- 写入位置 0xCDCDCDCD 时发生访问冲突等
- 前端学习之路html基础(02)——常用标签
- 用Navicat连接Oracle数据库时报错ORA-28547:connection to server failed, probable Oracle Net admin error
- Oracle 之BBED 工具介绍
- 《JS高程(3)》DOM2和DOM3-遍历-第12章笔记(24)
- 从软件开发到软件版本
- makefile 基础学习
- Openjudge程序设计Mooc 5.1拦截导弹
- 常用正则表达式以及oc常用正则匹配方法总结
- 快速排序(Quick Sort)
- webstorm或phpstorm配置CSS或JS压缩
- 递归与试探回溯(1) 简单递归分析
- 内存溢出、内存泄露、栈泄露