`
zzc1684
  • 浏览: 1229482 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

常用的遍历节点方法

    博客分类:
  • Js
 
阅读更多

[常用的遍历节点方法]
取得匹配元素的所有子元素组成的集合: children(). 该方法只考虑子元素而不考虑任何后代元素.
取得匹配元素后面紧邻的同辈元素的集合(但集合中只有一个元素): next()
取得匹配元素前面紧邻的同辈元素的集合(但集合中只有一个元素): prev()
取得匹配元素前后所有的同辈元素: siblings()

查找相关元素的前一个兄弟元素的函数
elem = elem.previousSibling;
查找相关元素的下一个兄弟元素的函数
elem = elem.nextSibling;
查找元素第一个子元素的函数
elem = elem.firstChild;
查找元素最后一个子元素的函数
elem = elem.lastChild;
返回当前元素的父元素,类似parentNode元素属性。你可以一次用一个数字来操纵多个父元素,例如parent(elem,2)就等同于parent(parent(elem))。
查找元素父元素的函数
elem.parentNode;

 

代码清单5-2 XML文档空格bug的补救方案

function cleanWhitespace( element ) {

// 如果不提供参数,则处理整个HTML文档

element = element || document;

// 使用第一个子节点作为开始指针

var cur = element.firstChild;

// 一直到没有子节点为止

while ( cur != null ) {

    // 如果节点是文本节点,并且只包含空格

    if ( cur.nodeType == 3 && ! /\S/.test(cur.nodeValue) ) {

      // 删除这个文本节点

      element.removeChild( cur );

      // 否则,它就是一个元素

    } else if ( cur.nodeType == 1 ) {

      // 递归整个文档

      cleanWhitespace( cur );

    }

    cur = cur.nextSibling; // 遍历子节点

}

}

假设你要在前面例子中使用这个函数来查找位于<h1>元素后的元素。那么代码应该类似这样:

cleanWhitespace();

// 查找H1元素

document.documentElement

.firstChild // 查找Head元素

.nextSibling // 查找<body>元素

.firstChild // 得到H1元素

.nextSibling // 得到相邻的段落(p)

该技术有优点也有缺点。最大的优点在于,你可以保证DOM文档的遍历在一定程度上的稳定性。但明显性能太差,想想必须遍历每个DOM元素和文本节点,目的只是为了找出包含空格的文本节点。假设你有一个包含大量内容的文档,它可能会严重降低网站的加载速度。此外,每次为文档注入新的HTML,你都需要重新扫描DOM中的新内容,确保没有增加新的有空格填充的文本节点。

此外此函数重要的方面是节点类型的使用。节点的类型可以由检查它的nodeType属性来确定。可能会出现好几种值,但你经常会碰到的是以下3个:

l    元素(nodeType=1):匹配XML文件中的大部分元素。比如,<li>、<a>、<p>和<body>元素都有一个值为1的nodeType。

l    文本(nodeType=3):匹配文档内的所有文本块。当使用previousSibling和nextSibling来遍历DOM结构时,你会经常碰到元素内和元素间的文本块。

l    文档(nodeType=9):匹配文档的根元素。比如,在HTML文档内,它是<html>元素。

此外,你可以用常量来表明不同的DOM节点类型(但只是对非IE浏览器有用)。与其去记住1、3或9,还不如直接直观地使用document.ELEMENT_NODE、document.TEXT_NODE或者document.DOCUMENT_NODE。因为经常清空DOM的空格会让人感到厌烦,所以你应该探索其他遍历DOM结构更有效的方法。

5.2.2 简单的DOM遍历

可以使用纯粹的DOM遍历规则(每个遍历方向都有指针)来开发一些更适合你的HTMLDOM文档遍历函数。大部分Web开发者在大多数情况下仅仅需要遍历DOM元素而非相邻的文本节点,该规则就是基于这样的事实而制定的。以下一系列的辅助函数可以帮助你,它们能够取代标准的previousSibling、nextSibling、firstChild、lastChild和parentNode。代码清单5-3展示的函数,返回的是当前元素的前一个元素,如果前一个元素不存在则是null,类似于元素的previousSibling属性。

代码清单5-3 查找相关元素的前一个兄弟元素的函数

function prev( elem ) {

do {

    elem = elem.previousSibling;

} while ( elem && elem.nodeType != 1 );

return elem;

}

代码清单5-4展示的函数,返回的是当前元素的下一个元素,如果下一个元素不存在则是null,类似于元素的nextSibling属性。

代码清单5-4 查找相关元素的下一个兄弟元素的函数

function next( elem ) {

do {

    elem = elem.nextSibling;

} while ( elem && elem.nodeType != 1 );

return elem;

}

代码清单5-5展示的函数,返回的是当前元素的第一个子元素,类似于firstChild元素属性。

代码清单5-5 查找元素第一个子元素的函数

function first( elem ) {

elem = elem.firstChild;

return elem && elem.nodeType != 1 ?

next ( elem ) : elem;

}

代码清单5-6展示的函数,返回的是当前元素的最后一个子元素,类似lastChild元素属性。

代码清单5-6 查找元素最后一个子元素的函数

function last( elem ) {

elem = elem.lastChild;

return elem && elem.nodeType != 1 ?

prev ( elem ) : elem;

}

代码清单5-7展示的函数,返回当前元素的父元素,类似parentNode元素属性。你可以一次用一个数字来操纵多个父元素,例如parent(elem,2)就等同于parent(parent(elem))。

代码清单5-7 查找元素父元素的函数

function parent( elem, num ) {

num = num || 1;

for ( var i = 0; i < num; i++ )

if ( elem != null ) elem = elem.parentNode;

return elem;

}

使用这些新函数你就可以迅速遍历DOM文档了,而且不必再为元素间的文本操心。比如,需要查找<h1>元素的下一个元素,现在可以这么做了:

// 查找<h1>元素的下一个元素

next( first( document.body ) )

在这段代码内有两件事值得注意。首先,此处有一个新的引用:document.body。所有的现代浏览器都在HTML DOM文档内通过body属性提供一个对<body>元素的引用。你可以用它来简化你的代码。另一件事情你可能已经注意到,那就是这些函数的书写方式十分违反直觉。一般来说,在遍历时会想:“从<body>元素开始,获取第一个元素,然后获取下一个元素”。但从我们实际编写方式来看,它是按相反的顺序。要解决这个问题,我们将讨论一些可以让自定义的遍历代码更清晰的方式。

 

分享到:
评论

相关推荐

    OSG中用遍历场景的方法获取节点

    在OpenSceneGraph (OSG) 中,遍历场景图是一种常用的技术,用于访问和操作图形场景中的各个节点。OSG 是一个开源的3D图形库,它提供了丰富的功能,包括场景管理、渲染优化、动画支持等。海军教程可能将OSG应用于模拟...

    jQuery遍历节点树方法分析

    本篇文章将重点介绍jQuery遍历节点树的常用方法,并结合实例展示这些方法的应用。 首先,我们需要了解基本的jQuery选择器。jQuery选择器允许我们以特定的模式选取页面中的DOM元素,比如通过id、类名、标签名或属性...

    Jquery遍历节点的方法小集

    JQuery提供了许多方法来进行节点的遍历操作,以下是一些常用的遍历节点的方法及其知识点的详细介绍。 1. next()方法 next()方法用于选取每个匹配元素集合中紧接在后面的兄弟元素。如果没有指定选择器,则选取所有...

    二叉树遍历插入节点

    在计算机科学中,二叉树是一种特殊的图结构,其中每个节点最多有两个子节点,通常称为左子节点和右子节点。...在进行实际编程时,需要根据具体需求选择合适的遍历方法,并正确地插入新节点,以保持二叉树的性质和结构。

    jQuery遍历节点方法汇总(推荐)

    以上介绍了jQuery中常用的一些遍历节点的方法,这些方法都为开发人员提供了高效便捷的工具,以便在DOM操作中实现精确的元素选择和节点遍历。理解和熟练运用这些方法,能够帮助开发者更有效地处理复杂的HTML文档结构...

    无固定节点的TreeView的遍历实例

    在无固定节点的情况下,我们需要一个灵活的方法来动态添加和遍历这些节点。 在实现无限节点遍历时,通常会采用递归的方式。递归是一种算法,它调用自身来解决问题。对于TreeView,我们可以创建一个函数,该函数接收...

    树节点二叉树的遍历运算.doc

    二叉树遍历是计算机科学中处理树结构数据时常用的一种技术,特别是在算法和数据结构领域。二叉树是由节点组成的数据结构,每个节点最多有两个子节点,通常称为左子节点和右子节点。二叉树遍历的目标是按照特定的顺序...

    二叉树各种遍历方法实现

    二叉树的遍历是指按照一定的顺序访问树中的每一个节点,常用的遍历方法有三种:先序遍历、中序遍历和后序遍历,以及层次遍历。这里我们将详细介绍这些遍历方法的递归和非递归实现,以及如何计算二叉树的深度。 1. ...

    每天学点C++(C++实例教程:教程+源码)常用遍历算法.zip

    在提供的压缩包文件“常用遍历算法”中,你可以找到这些遍历方法的具体实现和示例,这对于学习和理解C++的遍历算法非常有帮助。通过实践这些代码,你可以更好地掌握C++中的遍历技术,并将它们应用到实际项目中。记得...

    xml文件的读取,遍历每个子节点,已经节点中的数据设置。

    3. **获取节点数据**:在遍历过程中,我们可以通过QDomElement类的方法来访问节点的各种信息。例如,`nodeName()`获取节点名称,`nodeValue()`获取文本值,`attribute()`获取属性值。 ```cpp QString tagName = ...

    CtreeCtrl控件的遍历和查找

    这个函数将从指定的根节点开始,递归遍历树形控件中的每个节点,并弹出每个节点的文本信息。使用递归函数可以简化遍历树的逻辑,提高代码的可读性和可维护性。 二、查找树控件中的节点 查找树控件中的节点是指根据...

    《数据结构》二叉树建立、前中后序遍历、及节点查找

    链式存储是二叉树最常用的表示方法,每个节点包含一个数据域和两个指针域,分别指向左孩子和右孩子。在实际编程中,可以通过递归或非递归的方式创建二叉树,根据输入的数据序列决定树的形态。 二、前序遍历 前序...

    二叉树的前序中序后序遍历

    根据访问节点的顺序不同,二叉树的遍历可以分为多种类型,其中最常用的三种是前序遍历、中序遍历和后序遍历。 #### 二、二叉树遍历的基本概念 **二叉树遍历**是指按照某种顺序访问二叉树中的所有节点,且每个节点...

    C#父子关系树递归遍历方法(含源码).rar

    "递归遍历"是解决树结构问题时常用的一种技术。通过递归函数,我们可以从根节点开始,逐个访问每个节点及其所有子节点。递归遍历有两种主要类型:前序遍历(先访问根节点,再遍历左子树,最后遍历右子树)、中序遍历...

    c# treeview 获取子节点

    在这个特定的资源中,作者分享了如何在C#中实现获取`TreeView`控件的子节点的方法。下面将详细讲解`TreeView`控件及其获取子节点的相关知识。 1. **TreeView控件简介** `TreeView`控件在Windows Forms应用中广泛...

    图像数据结构图遍历算法四叉树

    在四叉树中,有几种常见的遍历方法,包括前序遍历(先访问根节点,再遍历子节点)、中序遍历(对于二叉树常用,但四叉树中定义不明确)和后序遍历(先遍历子节点,最后访问根节点)。在四叉树中,前序遍历通常是指先...

    二叉树的遍历输出

    这是构建和打印表达式树常用的方法。 2. **中序遍历**(Left-Root-Right):首先递归地访问左子树,然后访问根节点,最后访问右子树。对于二叉搜索树,中序遍历会按照从小到大的顺序输出节点值,因此常用于排序操作...

    二叉树遍历流程图(先序、中序、后序、宽度遍历)

    二叉树遍历是计算机科学中处理树结构数据时常用的一种技术,主要分为四种类型:先序遍历、中序遍历、后序遍历和宽度优先遍历。这些遍历方法各有特点,适用于不同的场景。 1. **先序遍历**: - **递归实现**:先...

    先序中序后序三种方法遍历一棵二叉树

    在计算机科学中,二叉树是一种常用的数据结构,它是由零个或多个节点组成的一种层次化数据结构。每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树具有以下特点: 1. 每个节点最多只有两个子节点。 2. ...

    Q694896 问答问题的回答 C#遍历XML文件节点内容

    3. **遍历节点**:使用`XmlNode`的`ChildNodes`属性获取所有子节点,并用循环遍历它们。对于每个子节点,可以访问其属性和子节点。例如: ```csharp foreach (XmlNode node in root.ChildNodes) { Console....

Global site tag (gtag.js) - Google Analytics