首页 web前端 js教程 高效的获取当前元素是父元素的第几个子元素_javascript技巧

高效的获取当前元素是父元素的第几个子元素_javascript技巧

May 16, 2016 pm 05:19 PM
子元素 父元素

例如处理事件的时候,有时候需要知道当前点击的是第几个子节点,而HTML DOM本身并没有直接提供相应的属性,需要自己来计算。

从一个索引序号,很容易得到该索引对应的子节点或者子元素,直接用parentNode.childNodes[index] 或 parentNode.children[index] 就行。

但反过来,已知一个节点或元素对象,要知道它的索引序号则没有那么直接了。

一些特殊的元素,HTML DOM有对应的属性表示其索引序号,主要是表格的TD 和 TR 元素。

表格单元格TD元素有 cellIndex 属性。

表格行TR元素有rowIndex属性。

如果你的处理目标刚好就是表格,则优先使用这两个属性。

但一般的节点或元素并没有 childNodeIndex 或者 childElementIndex 之类的属性。

解决方案主要分为两类:

一、预先计算并缓存节点的索引号(可以存在节点属性或者js变量中)。

二、实时计算,需要遍历部分节点。

应用中,可根据不同的实际情况,选用上述两类方案之一。

适用方案一的情形:

当DOM结构不会变化,并且需要频繁的获取个别节点的索引,可采用方案一。

优点是后续读取快,缺点是初始化需要开销,DOM结构变化后需要重新初始化。

适用方案二的情形:

DOM结构可能会变化,并且不是特别频繁的获取个别节点的索引,可采用方案二。

优点是不受DOM结构变化的影响,不会污染DOM结构,没有初始化开销。缺点是不适合高频率调用。

一般而言,采用方案二是更好的,因为通常DOM树规模是比较有限的,一轮的循环并不会导致显著降低整体性能,而其优点则是显著的。

对于IE浏览器,则有更直接的方法。

从IE4到IE11,都有sourceIndex属性,这个属性表示了元素在DOM树的顺序,比较元素和父元素的sourceIndex的差值就很容易知道元素是第几个子元素了。

我写了一段函数来区分处理,在IE下采用sourceIndex高效判断,非IE则采用一般遍历。

复制代码 代码如下:

function getChildrenIndex(ele){
//IE is simplest and fastest
if(ele.sourceIndex){
return ele.sourceIndex - ele.parentNode.sourceIndex - 1;
}
//other browsers
var i=0;
while(ele = ele.previousElementSibling){
i ;
}
return i;
}

上面的函数只是计算元素Element,也就是nodeType为1的节点,文本节点、注释节点等将不被统计。如果需要计算所有节点在内,则不能适用sourceIndex,因为该属性只针对Element. previousElementSibling也要相应的改为previousSibling. 那就要写成如下的函数了:
复制代码 代码如下:

function getNodeIndex(node){
var i=0;
while(ele = ele.previousSibling){
i ;
}
return i;
}

后记:在非IE下,有 compareDocumentPosition 方法用于比较节点的位置关系,但经过测试该方法的性能非常差,其内部的实现机制肯定不是像IE那样缓存了资源索引号的,如果这个方法极高效,那就可采用二分法进行计算,从而提高效率,但目前还不可能。

最后的总结:

对于表格TD和TR元素优先使用cellIndex和rowIndex属性。

对于IE优先使用sourceIndex属性。

其它情形使用previousElementSibling 或 previousSibling 进行遍历。

compareDocumentPosition 方法的性能非常差。
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

如何在jQuery中删除最后一个子元素? 如何在jQuery中删除最后一个子元素? Feb 19, 2024 pm 09:40 PM

jQuery是一个流行的JavaScript库,用于简化Web开发中的许多任务,包括DOM操作。在网页开发中,经常需要对DOM元素进行增删改查的操作,其中删除最后一个子元素也是一个常见需求。本文将介绍使用jQuery删除最后一个子元素的几种方法。方法一:使用last()方法jQuery提供了last()方法,可以选取当前查询结果的最后一个元素。通过结合这个方

了解事件冒泡机制:为何子元素的点击会影响父元素的事件? 了解事件冒泡机制:为何子元素的点击会影响父元素的事件? Jan 13, 2024 pm 02:55 PM

理解事件冒泡:为什么子元素的点击会触发父元素的事件?事件冒泡是指在一个嵌套的元素结构中,当子元素触发某个事件时,该事件会像冒泡一样逐层传递到父元素,直至最外层的父元素。这种机制使得子元素的事件可以在整个元素树中传递,并依次触发所有相关的元素。为了更好地理解事件冒泡,让我们来看一个具体的示例代码。HTML代码:<divid="parent&q

使用:nth-child(n+3)伪类选择器选择位置大于等于3的子元素的样式 使用:nth-child(n+3)伪类选择器选择位置大于等于3的子元素的样式 Nov 20, 2023 am 11:20 AM

使用:nth-child(n+3)伪类选择器选择位置大于等于3的子元素的样式,具体代码示例如下:HTML代码:&lt;divid="container"&gt;&lt;divclass="item"&gt;第一个子元素&lt;/div&gt;&lt;divclass="item"&

使用jQuery删除元素的最后一个子元素 使用jQuery删除元素的最后一个子元素 Feb 26, 2024 pm 12:39 PM

如何使用jQuery删除最后一个子元素?在前端开发中,经常会遇到需要对页面元素进行增删改查的操作。其中,删除最后一个子元素是一个常见的需求。本文将介绍如何使用jQuery来删除最后一个子元素,并附上具体的代码示例。首先,我们需要在页面中引入jQuery库,确保能够使用其中的功能。在HTML文件中添加以下代码:&lt

使用:nth-child伪类选择器选择特定位置的子元素的CSS样式 使用:nth-child伪类选择器选择特定位置的子元素的CSS样式 Nov 20, 2023 pm 04:43 PM

使用:nth-child伪类选择器选择特定位置的子元素的CSS样式在CSS中,伪类选择器是用于选择HTML文档中特定状态的元素。除了常见的伪类选择器如:hover和:active,还有一个非常有用的伪类选择器是:nth-child,它允许我们选择特定位置的子元素。:nth-child伪类选择器的语法如下:父元素:nth-child(n)其中父元素代表父级元素

如何利用jQuery判断元素是否包含子元素 如何利用jQuery判断元素是否包含子元素 Feb 28, 2024 am 11:03 AM

如何利用jQuery判断元素是否包含子元素在网页开发中,经常会遇到需要判断一个元素是否包含子元素的情况。使用jQuery可以非常方便地实现这个功能。在本文中,将介绍如何利用jQuery判断一个元素是否包含子元素,并给出具体的代码示例。在jQuery中,可以使用children()方法来选择指定元素的所有直接子元素。如果一个元素包含子元素,那么使用childr

jQuery实现判断元素是否存在子元素功能 jQuery实现判断元素是否存在子元素功能 Feb 28, 2024 pm 12:54 PM

jQuery是一个广泛应用于前端开发的JavaScript库,它提供了简洁而强大的API,可以方便地操作DOM元素。在实际开发中,有时候我们需要判断一个元素是否包含子元素,这时就需要使用jQuery来实现。要判断一个元素是否存在子元素,我们可以利用jQuery提供的方法来实现。以下是一个示例代码,演示了如何使用jQuery来判断一个元素是否包含子元素:&lt

jQuery实例:如何利用jQuery删除最后一个子元素? jQuery实例:如何利用jQuery删除最后一个子元素? Feb 20, 2024 pm 07:45 PM

标题:jQuery实例:如何利用jQuery删除最后一个子元素?在Web开发中,经常会遇到需要通过JavaScript操作DOM元素的情况。而jQuery作为一个广泛使用的JavaScript库,提供了许多便捷的方法来操作DOM元素。本文将通过一个实例来介绍如何利用jQuery删除最后一个子元素的方法,并提供详细的代码示例。首先,我们需要在HTML文件中引入

See all articles