【发布时间】:2010-09-27 13:27:49
【问题描述】:
我想找到给定 DOM 节点的索引。这就像做的相反
document.getElementById('id_of_element').childNodes[K]
我想提取K 的值,因为我已经拥有对子节点和父节点的引用。我该怎么做呢?
【问题讨论】:
标签: javascript dom
我想找到给定 DOM 节点的索引。这就像做的相反
document.getElementById('id_of_element').childNodes[K]
我想提取K 的值,因为我已经拥有对子节点和父节点的引用。我该怎么做呢?
【问题讨论】:
标签: javascript dom
现代原生方法可能包括Array.from(e.children).indexOf(theChild)
不支持 IE,但 Edge 可以工作:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from
【讨论】:
短一点,期望元素在elem中,返回k。
for (var k=0,e=elem; e = e.previousSibling; ++k);
在Justin Dearing 发表评论后,我查看了我的答案并添加了以下内容:
或者如果你更喜欢“while”:
var k=0, e=elem;
while (e = e.previousSibling) { ++k;}
最初的问题是如何找到现有 DOM 元素的索引。我在这个答案中上面的两个示例都期望 elem 是一个 DOM 元素,并且该元素仍然存在于 DOM 中。如果您给它们一个空对象或没有 previousSibling 的对象,它们将失败。更简单的方法是这样的:
var k=-1, e=elem;
while (e) {
if ( "previousSibling" in e ) {
e = e.previousSibling;
k = k + 1;
} else {
k= -1;
break;
}
}
如果 e 为 null 或如果其中一个对象中缺少 previousSibling,则 k 为 -1 .
【讨论】:
for 示例中,您使用previousElementSibling 并获得结果24,但在while 中您使用previousSibling,结果为49。我创建了一个新的testcase 他们都使用 previousElementSibling ,然后至少在我的有限测试中没有太大区别了。实际上,while 在 Win7 上的 FF20 中要快一些。
在所有版本的 Safari、FireFox、Chrome 和 IE >= 9 中,无需任何框架的最短路径:
var i = Array.prototype.indexOf.call(e.childNodes, someChildEl);
【讨论】:
e.childNodes 替换为e.children 以在其兄弟元素中查找元素的索引 - 而不是兄弟节点,其中包括文本和评论节点。
e.parentNode.childNodes.indexOf(e) 的事情?编辑:我刚刚测试过。 NodeList 不是真正的Array,所以我们必须通过它的原型引入Array 对indexOf 的实现。令我惊讶的是,Array 的 indexOf 在 NodeLists 上起作用,无论这是有意还是巧合。
indexOf 函数是故意通用的;它不要求其 this 值是 Array 对象。因此它可以转移到其他类型的对象中用作方法。indexOf 函数能否成功应用于宿主对象取决于实现。"
[].indexOf.call(children, el),除非这不符合浏览器兼容性声明(虽然我觉得这很令人惊讶)。
与原始海报一样,我正在尝试
查找给定 DOM 节点的索引
但是我刚刚使用了一个点击处理程序,并且仅与它的兄弟姐妹有关。我最终无法让上述工作(因为毫无疑问,因为菜鸟,我尝试在 'this' 中替换 elem 但它没有工作)。
我的解决方案是使用 jquery 并使用:
var index = $(this).parent().children().index(this);
它无需指定元素的类型即可工作,即:'h1' 或 id 等。
【讨论】:
使用原型之类的框架,您可以使用它:
$(el).up().childElements().indexOf($(el))
【讨论】:
RoBorg 的回答有效...或者您可以尝试...
var k = 0;
while(elem.previousSibling){
k++;
elem = elem.previousSibling;
}
alert('I am at index: ' + k);
【讨论】:
while(elem=elem.previousSibling){k++;}替换while(elem.previousSibling){k++;elem = elem.previousSibling;}吗?
我认为这样做的唯一方法是遍历父母的孩子,直到找到自己。
var K = -1;
for (var i = myNode.parent.childNodes.length; i >= 0; i--)
{
if (myNode.parent.childNodes[i] === myNode)
{
K = i;
break;
}
}
if (K == -1)
alert('Not found?!');
【讨论】: