例如,在
处理事件时,有时需要知道当前的单击是几个子节点。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方法的性能很差。