查找DOM节点索引

我想find一个给定的DOM节点的索引。 这就像做的反面

document.getElementById('id_of_element').childNodes[K] 

我想改为提取K的值,因为我已经有了对子节点和父节点的引用。 我如何做到这一点?

所有版本的Safari,FireFox,Chrome和IE> = 9的最简单的方式,没有任何框架:

var i = Array.prototype.indexOf.call(e.childNodes, someChildEl);

稍短一点,期望元素在元素中,返回k。

 for (var k=0,e=elem; e = e.previousSibling; ++k); 

在Justin Dearing的评论之后,我回顾了我的回答,并添加了以下内容:

或者如果你更喜欢“while”:

 var k=0, e=elem; while (e = e.previousSibling) { ++k;} 

原来的问题是如何find一个现有的DOM元素的索引。 在这个答案上面的两个例子都期望elem是一个DOM元素,并且该元素仍然存在于DOM中。 如果你给它们一个null对象或一个没有previousSibling的对象,它们将会失败。 更傻的办法是这样的:

 var k=-1, e=elem; while (e) { if ( "previousSibling" in e ) { e = e.previousSibling; k = k + 1; } else { k= -1; break; } } 

如果enull或者在其中一个对象中缺lesspreviousSibling ,则k为-1。

RoBorg的答案有效…或者你可以尝试…

 var k = 0; while(elem.previousSibling){ k++; elem = elem.previousSibling; } alert('I am at index: ' + k); 

和原来的海报一样,我正在努力

find给定的DOM节点的索引

但是我只是使用一个点击处理程序,并且只是与其兄弟姐妹有关 。 我不可能最终得到上述工作(因为毫无疑问,我试图在这个元素,但它没有奏效)。

我的解决scheme是使用jQuery和使用:

 var index = $(this).parent().children().index(this); 

它不需要指定元素的types,即:“h1”或一个id等。

我认为唯一的方法就是循环父母的孩子,直到find自己。

 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?!'); 

使用像原型的框架,你可以使用这个:

 $(el).up().childElements().indexOf($(el))