对当前元素的有效访问是父元素的子元素的数目。

对当前元素的有效访问是父元素的子元素的数目。
例如,在处理事件时,有时需要知道当前的单击是几个子节点。HTML DOM本身不直接提供相应的属性,它需要自己计算。

从一个指数,很容易得到相应的子节点或子元素的索引,直接使用parentNode。子{ }或{指数parentNode。儿童指数}。

然而,反过来,一个节点或元素对象知道它的索引号不是那么直接。

一些特殊的元素,HTML DOM有相应的属性来表示它的索引号,主要是表的TD和TR元素。

表格单元格的td元素有一个cellindex属性。

表行tr元素具有RowIndex属性。

如果您的处理目标仅仅是一个表,那么首先使用这两个属性。

但总的节点或元素没有属性如childnodeindex或childelementindex。

解决方案主要分为两类:

1。预先计算和缓存节点的索引号(可以有一个节点的属性或一个js变量)。

两。在实时计算中,需要遍历一些节点。

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

申请案1:

当DOM结构不改变时,需要频繁地获取各个节点的索引,可以采用该索引。

其优点是如下读取速度快,缺点是初始化成本,DOM结构需要在结构改变后重新初始化。

方案二的应用:

DOM结构可能会发生变化,单个节点的索引不是很频繁,可以使用两个方案。

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

一般来说,采用计划二是比较好的,因为通常DOM树的规模比较有限,一轮循环不会导致整体性能显著下降,但其优势是显著的。

对于IE浏览器,有一种更直接的方法

从IE4到IE11,有sourceindex属性。此属性表示DOM树中元素的顺序。比较元素和父元素的sourceindex使得它很容易知道元素是前几个元素之间的差异。

我写了一个函数来区分处理,sourceindex在伊江,和一般的遍历非IE。
复制代码代码如下所示:
功能getchildrenindex(ELE){
IE是最简单、最快的
如果(ELE。sourceindex){
返回ele.sourceindex ele.parentnode.sourceindex - 1 -;
}
其他浏览器
var I=0;
而(元=元。previouselementsibling){
++;
}
还我;
}

上述功能仅仅是一个计算的元素,这是一个1节点的节点类型,和文本节点、注释等节点,将不被计算。如果你需要计算所有节点,无法将sourceindex,因为属性是唯一的元素。previouselementsibling,而且PreviousSibling ..
复制代码代码如下所示:
功能getnodeindex(节点){
var I=0;
而(元=元。PreviousSibling){
++;
}
还我;
}

后记:在非IE,comparedocumentposition方法用于节点间的位置关系,但性能测试的方法后很差,不知道它的内部实现机制如IE缓存资源指数,如果该方法是非常有效的,它可以用来计算的二分法,以提高效率,但这是不可能的。

最后总结:

cellindex RowIndex属性的,为td和tr元素优先。

的sourceindex属性先使用IE浏览器。

其他情况下采用遍历previouselementsibling或PreviousSibling。

comparedocumentposition方法的性能很差。
免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部