浅谈DOM数遍历

最近一直在研究DOM遍历以及范围的定义;

其实,JS中DOM模块定义了两个用于辅助完成顺序遍历DOM结构的类型:NodeIterator和TreeWalker。这两个类型能够基于给定的起点对DOM结构执行深度优先的遍历操作;

然,此上出自与“DOM2 级遍历和范围”的内容;不过你们懂得,IE不支持DOM遍历。所以,使用下列代码可以检测浏览器对DOM2级遍历能力的支持情况;

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

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

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

其实,现在好多从事前端的人员对于一些前端框架如Jquery等了如指掌,但是一旦触及到原声JS,却无从下手,原因很简单,就是自己还是没有深入了解JS的运行机制,我们只是简单的像机器一样用着Jquery,因为Jquery已经帮你解决好了一些浏览器兼容性问题;

以及一些潜在的bug;而原声JS对于这些问题还是需要你一步一步去研究的;话题扯远了,继续......

任何节点都可以作为遍历的根节点;主要是看你选择谁为根节点;

一:NodeIterator 是这两个比较简单的一个,可以使用document.createNodeIterator()方法创建它的实例;参数参考:

1,root: 想要作为搜索起点的树中的节点;

2,whatToShow:表示要访问那些节点的数字代码;

3,filter:是一个NodeFilter对象,或者一个表示应该接受还是拒绝某种特定节点的函数;

4,entityReferenceExpansion:布尔值,表示是否扩展实体引用。这个参数在HTML页面中没有用,因为其中的实体引用不能扩展;

这个类型两个主要的方法是nextNode()和previousNode();nextNode()方法用于向前前进一步,而previousNode()用于向后后退一步;

如:

<div id="my1">

  <p><b>Hello</b>Andy!</p>

  <ul>

    <li>Num1</li>

    <li>Num2</li>

    <li>Num3</li>

  </ul>

</div>

若要遍历div元素中所有元素:

var div =document.getElementById("my1");

var itertaor = document.createNodeIterator(div,NodeFilter.SHOW_ELEMENT,null,fasle);

var node = itertaor.nextNode();

while(node !== null){

  alert(node.tagName);

  node = itertaor.nextNode();

}

ps:自己可以试试打印出什么结果?

二:TreeWalker 是NodeIterator的一个更高的版本。除了nextNode()和previousNode()在内的相同的功能之外,这个类型还提供了用于在不同方向上遍历DOM结构的方法;

1,parentNode();遍历到当前节点的父节点;

2,firstChild();遍历到当前节点的第一子节点;

3,lastChild();遍历到当前节点的最后一个子节点;

4,nextSibling();遍历到当前节点的下一个同辈节点;

5,previousSibling();遍历到当前节点的上一个同辈节点;

创建TressWalker对象使用document.createTreeWalker()方法,这个方法接收的4个参数与document.createNodeIterator()方法相同;

时间: 2024-10-21 14:30:21

浅谈DOM数遍历的相关文章

Js之浅谈dom操作

JavaScript之浅谈dom操作 1.理解dom: DOM(Document Object Model ,文档对象模型)一种独立于语言,用于操作xml,html文档的应用编程接口. 怎么说,我从两个角度理解: 对于JavaScript,为了能够使JavaScript操作Html,JavaScript就有了一套自己的dom编程接口. 对于Html,dom使得html形成一棵dom树,类似于一颗家族树一样,一层接一层,子子孙孙. 所以说,有了DOM,在我看来就是相当于JavaScript拿到了钥

【浅谈DOM事件的优化】

浅谈DOM事件的优化 在 JavaScript程序的开发中,经常会用到一些频繁触发的 DOM 事件,如 mousemove.resize,还有不是那么常用的鼠标滚轮事件:mousewheel (在 Firefox 中,滚轮事件为 DOMMouseScroll). 浏览器为了确保这些事件能够及时响应,触发的频率会比较高,具体的触发频率各浏览器虽然有出入,但出入不大.很多时候在需要注重性能的场景下使用这些事件会想各种办法对事件的触发频率进行优化,下面说说我的一些优化方法. mousemove 在拖拽

浅谈DOM基础

DOM:文档对象模型(Document Object Model),实际上是以面向对象方式描述的文档模型. 概念: 表示和处理一个HTML或者XML文档的常用方法.DOM的设计是以对象 管理者组织的规约为基础的,因此可以用于任何编程语言. D:文档可以理解为整个Web加载的网页文档: O:对象调用属性和方法(document对象): M:模型可以理解为网页文档的树形结构. DOM节点:DOM不仅可以查找节点,也可以创建节点.复制.插入删除和替换节点.加载HTML页面时,Web浏览器生成一个树形结

浅谈卡特兰数(Catalan number)的原理和应用

一.卡特兰数(Catalan number) 1.定义 组合数学中一个常出现在各种计数问题中出现的数列(用c表示).以比利时的数学家欧仁·查理·卡特兰的名字来命名: 2.计算公式 (1)递推公式 c[n]=Σc[k]*c[n-k-1],边界条件为c[0]=1; 其递推解为c[n]=C(2n,n)/(n+1),即卡特兰数的通项公式,其中C表示数的组合: (2)另类递推式 c[n]=c[n-1](4n-2)/(n+1),边界条件为c[0]=1; 其递推解为c[n]=C(2n,n)-C(2n,n-1)

浅谈二叉树的遍历(先序遍历、中序遍历、后序遍历)

先序遍历:根-左儿子-右儿子(根左右) 中序遍历:左儿子-根-右儿子(左根右) 后序遍历:左儿子-右儿子-根(左右根) 通常来说这都记得住. 这时MY大神来一句:"我记不住" 记不住的话可以这么理解:先序遍历根在先,中序遍历根在中,后序遍历根在后,左儿子永大于右儿子 现在来看一张图 这张图的遍历: 中序遍历:4251637 4,2,5--左根右嘛这可以理解,可是后面为什么是1? 我们把425看做一个整体,再把637看做一个整体.425是1的左儿子(左子树),637就是1的右儿子.是哈.

浅谈JavaScript--函数重载

个人认为重载就是一组具有相同名字.不同参数列表的函数(方法). 从语言角度来说,javascript不支持函数重载,不能够定义同样的函数然后通过编译器去根据不同的参数执行不同的函数. 但是javascript却可以通过自身属性去模拟函数重载. 根据arguments对象的length值进行判断 function overLoading() { // 根据arguments.length,对不同的值进行不同的操作 switch(arguments.length) { case 0: /*操作1的代

浅谈 HTML5 的 DOM Storage 机制 (转)

在开发 Web 应用时,开发者有时需要在本地存储数据.当前浏览器支持 cookie 存储,但其大小有 4KB 的限制.这对于一些 Ajax 应用来说是不够的.更多的存储空间需要浏览器本身或是插件的支持,如 Google Gears 和 Flash.不过开发人员需要通过检测当前浏览器所支持的插件类型来使用对应的接口. HTML5 中新引入了 DOM Storage 机制,通过使用键值对在客户端保存数据,并且提供了更大容量的存储空间.本文将详细论述 HTML5 对本地存储的支持,并对存储事件绑定和数

浅谈图的广度优先遍历

一.广度优先遍历 上次我们浅谈了图的深度优先遍历,接下来我们使用广度优先搜索来遍历这个图: 这五个顶点被访问的顺序如下图所示: 二.实现过程 广度优先搜索过程如下: 首先以一个未被访问过的顶点作为起始顶点,比如以1号顶点为起点. 将1号顶点放入到队列中,然后将与1号顶点相邻的未访问过的顶点,即2号.3号和5号顶点依次放入到队列中. 接下来再将2号顶点相邻的未访问过的4号顶点放入到队列中. 到此所有顶点都被访问过,遍历结束. 广度优先遍历的主要思想: 首先以一个未被访问过的顶点作为起始顶点,访问其

浅谈二叉树遍历的栈方法

  众多周知,对于二叉树的遍历, 一种比较容易理解以及编写的方式就是递归的方式了,下面针对二叉树遍历的中序遍历做一个简单的分析: void travelTree(BiTree T, int deep){ if (T->lchild != NULL) travelTree(T->lchild, ++deep); for (int x = 0; x < deep; x++) { printf("--"); } printf("%c\n", T->