【发布时间】:2011-08-20 07:30:36
【问题描述】:
在直接的 javascript 中(即没有 jQuery 等扩展),有没有一种方法可以在不迭代和比较所有子节点的情况下确定子节点在其父节点内的索引?
例如,
var child = document.getElementById('my_element');
var parent = child.parentNode;
var childNodes = parent.childNodes;
var count = childNodes.length;
var child_index;
for (var i = 0; i < count; ++i) {
if (child === childNodes[i]) {
child_index = i;
break;
}
}
有没有更好的方法来确定孩子的索引?
【问题讨论】:
-
对不起,我是个十足的傻瓜吗?这里有很多看似学到的答案,但要获得所有子节点,您不需要做
parent.childNodes,而不是parent.children?。后者仅列出Elements,特别不包括Text节点...这里的一些答案,例如使用previousSibling,基于使用所有子节点,而其他人只关心Elements ...(!) -
@mikerodent 我不记得我最初问这个问题的目的是什么,但这是一个我不知道的关键细节。除非你小心,否则绝对应该使用
.childNodes而不是.children。正如您所指出的,前 2 个发布的答案会给出不同的结果。 -
当计划对 1000 多个节点进行数千次查找时,然后将信息附加到节点(例如通过 child.dataset)。目标是将 O(n) 或 O(n^2) 算法转换为 O(1) 算法。不利的一面是,如果定期添加和删除节点,则附加到节点的相关位置信息也必须更新,这可能不会带来任何性能提升。偶尔的迭代不是什么大问题(例如单击处理程序),但重复迭代是有问题的(例如 mousemove)。
标签: javascript dom