DOM节点遍历
"DOM2级遍历和范围"模块定义了两个用于辅助完成顺序遍历DOM结构的类型:NodeIterator 和 TreeWalker 。这两个类型能够根据给定的节点对DOM结构进行深度优先(depth-first)遍历操作。
浏览器支持:Firefox、Safari、Opera、Chrome、IE9+。
1、NodeIterator
使用 document.createNodeIterator(root, whatToShow, filter, entityReferenceExpansion),创建 NodeIterator 实例。
1)root:搜索起始节点
2)whatToshow:表示要访问那些节点,有下列值,
NodeFilter.SHOW_ALL:所有节点
NodeFilter.SHOW_ELEMENT:元素节点
NodeFilter.SHOW_ATTRIBUTE:特性节点,实际不能使用改值
NodeFilter.SHOW_TEXT:文本节点
NodeFilter.SHOW_CDATA_SECTION: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_FRAGMENT:文档片段节点,对HTML页面没有用
NodeFilter.SHOW_NOTATION:符号节点,对HTML页面没有用
除了 NodeFilter.SHOW_ALL外,可以使用按位或操作来组合多个选项,如 var whatToShow = NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_TEXT.
3)filter:一个NodeFilter对象,或者是一个表示接受或拒绝的函数。NodeFilter 对象只有一个方法,acceptNode(),定义可访问的情况,返回 NodeFilter.FILTER_ACCEPT 或 NodeFilter.FILTER_SKIP(跳过当前节点)。并且 NodeFilter 是一个抽象类型,不能直接创建它的实例,可以创建一个包含acceptNode()
方法,直接传入 document.createNodeIterator() 中。如果不指定过滤器,传入 null 即可。
var filter = {
acceptNode:function (node) {
return node.tagName.toLowerCase() == "p"? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP;
}
}
var filter1 = function(node){
return node.tagName.toLowerCase() == "p" ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP;
}
var iterator = document.createNodeIterator(table,NodeFilter.SHOW_ELEMENT,filter,false);
以上 filter 和 filter1 都表示只访问 <p>元素。
4)entityReferenceExpansion
布尔值,表示是否要扩展实体应用,在HTML页面中没有用
NodeIterator 主要有两个方法:
1)nextNode(),迭代器内部指针往下移动一位,并返回下一个遍历的节点。一开始迭代器内部指针指向根节点,所以第一次遍历调用返回根节点,当遍历到最后一个节点时返回 null
2)previousNode(),迭代器内部指针往上移动一位,并返回上一个遍历的节点,第一次遍历调用返回根节点
2、TreeWalker
使用document.createTreeWalker()创建实例,接受四个参数,与document.createNodeIterator()相同。
1)TreeWalker 包含了 NodeIterator 所有功能,还提供了几个新方法,用于移动遍历位置:
patentNode():跳转到当前节点的父节点
firstChild():跳转到当前节点的第一个字节点
lastChild():跳转到当前节点的最后一个节点
nextSibling():跳转到当前节点的后一个同胞节点
previousSibling():跳转到当前节点的前后一个同胞节点
currentNode():当前迭代器内部指针所指向的节点,可以设置,改变继续遍历迭代的起点
2)filter 返回值除了 NodeFilter.FILTER_ACCEPT 或 NodeFilter.FILTER_SKIP,还可以是 NodeFilter.FILTER_REJECT(跳过当前节点及该节点的整个子树)。
3、示例
<table id="filesTable">
<colgroup>
<col style="width: 25%" />
<col style="width: 35%" />
<col style="width: 15%" />
<col style="width: 25%" />
</colgroup>
<thead>
<tr>
<th>Date</th>
<th>File name</th>
<th>File size</th>
<th>Operation</th>
</tr>
</thead>
<tbody>
<tr>
<td>Date</td>
<td>File name</td>
<td>File size</td>
<td><button class="button-list downloadBtn" data="">Download</button></td>
</tr>
<tr>
<td colspan="4">No data</td>
</tr>
</tbody>
</table> var table = document.getElementById("filesTable");
var iterator = document.createNodeIterator(table,NodeFilter.SHOW_ELEMENT,null,false);
var node = iterator.nextNode(); // 返回table,迭代器内部指针往下移
var node1 = iterator.previousNode(); // table,造成迭代器中table迭代两次
while(node != null){
console.log(node.tagName); // (2)TABLE、COLGROUP、(4)COL、THEAD、TR、(4)TH、TBODY、TR、(4)TD、BUTTON、TR、TD
node = iterator.nextNode();
} var walker = document.createTreeWalker(table,NodeFilter.SHOW_ELEMENT,null,false);
walker.firstChild(); // 转到<colgroup>
walker.nextSibling(); // 转到 <thead>
node = walker.firstChild(); // 转到 <thead>中的<tr>
while(node != null){
console.log(node.tagName); // TR、(4)TH、TBODY、TR、(4)TD、BUTTON、TR、TD
node = walker.nextNode();
}
DOM节点遍历的更多相关文章
- childNodes遍历DOM节点树
childNodes遍历DOM节点树 var s = ""; function travel(space,node) { if(node.tagName){ s += space ...
- 深入理解DOM节点类型第五篇——元素节点Element
× 目录 [1]特征 [2]子节点 [3]特性操作[4]attributes 前面的话 元素节点Element非常常用,是DOM文档树的主要节点:元素节点是html标签元素的DOM化结果.元素节点主要 ...
- jquery 源码解析 节点遍历
jquery遍历,用于根据其相对于其他元素的关系来查找或选取html元素,以某项选择开始,并沿着这个选择移动,知道移动被称为对dom进行遍历 ☑ <div> 元素是 <ul> ...
- JS 操作Dom节点之CURD
许多优秀的Javascript库,已经封装好了丰富的Dom操作函数,这可以加快项目开发效率.但是对于非常注重网页性能的项目来说,使用Dom的原生操作方法还是必要的. 1. 查找节点 document. ...
- jQuery删除DOM节点
jQuery删除DOM节点 <%@ page language="java" import="java.util.*" pageEncoding=&quo ...
- 获取DOM节点的几种方式
DOM 是一个树形结构,操作一个DOM节点,实际上就是这几个操作:更新.删除.添加.遍历 在操作DOM节点之前,需要通过各种方式先拿到这个DOM节点,常用的方法有: 一.通过元素类型的方法来操作: d ...
- jacascript DOM节点——元素节点、属性节点、文本节点
前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! DOM节点的三个种类:元素节点.文本节点.属性节点: 元素节点 元素节点就是 HTML 标签元素,元素节点 ...
- js学习总结:DOM节点二(dom基本操作)
一.DOM继承树 DOM——Document Object Model DOM定义了表示修改文档所需要的方法.DOM对象即为宿主对象,由浏览器厂商定义,用来操作html和xml的一类厂商定义,也有人称 ...
- DOM 节点node
DOM可以将任何HTML或XML文档描绘成一个有多层节点构成的结构,即在HTML中所有内容都是节点.文档节点是每个文档的根节点,文档节点有一个子节点,称为文档元素.每个文档只能有一个文档元素.在HTM ...
随机推荐
- <ROS> NodeHandle句柄
作者:jack_20 原文:https://blog.csdn.net/jack_20/article/details/70746736 1.句柄可以让你通过构造函数指定命名空间 ros::NodeH ...
- 工控随笔_15_西门子_WinCC的VBS脚本_05_变量类型之三_VBS数组
数组是一种复杂数据类型,不但有数组本身的数据类型: 数组,还有数组元素中存储的数据的类型. 一.vbs中的数组类型 在VBS中提供了两种数组类型,一种是固定数组,一种是动态数组. 1.固定数组 就是在 ...
- vim汇总
跳到100行 100gg :100
- 安装git-review
参考 https://blog.csdn.net/qq18340811755/article/details/80965188 当yum install git-review安装失效,没有安装包时,只 ...
- 微信小程序云函数Windows下安装wx-server-sdk
第一次上传部署云函数时,会提示这个,建议在这之前先安装一下node.js. https://nodejs.org/en/ 下载nodejs,然后直接安装,在cmd控制台输入node -v和npm -v ...
- Busybox镜像
使用docker多少还是要知道一些Busybox的知识,下面转载自https://blog.csdn.net/chengqiuming/article/details/79313539 一 简介 Bu ...
- js中的数据类型、以及浅拷贝和深拷贝
一.js中的数据类型 1.基本类型(值类型):Undefined.Boolean.String.Number.Symbol 2.引用类型:函数.数组.对象.null.new Number(10)都是对 ...
- 工作中拓展的加密解密传输方式. DES对称加密传输.
系统间通过xml传输, 不能采用明文, 就加密传输. 秘钥(真正有效的是前8位)存储于配置中. public static string EncryptStr(this string content, ...
- WinForm-简单21点纸牌小游戏
纸牌游戏有很多种玩法,C#代码写的纸牌游戏,网上也能找到不少,从中也能学习到不少知识,自己动手也写一个,算是记录下学习过程吧. 纸牌21点的玩法也比较简单,就是看谁手中的所有牌相加是21点,或是离21 ...
- 记录4-Ubuntu 16.04用gparted调整分区
几天在安装双系统时,没注意居然把swap分区设置成了50G.今天才发现,于是用gparted重新分区. 1. sudo apt-get install gparted 2. 重新用u盘启动进入ubun ...