<ul> <li class="selected">First Item</li> <li class="disabled">Second Item</li> <li class="separator">Third Item</li> <li>Fourth Item</li> </ul>
jQuery的:
alert($("li:not(.disabled,.separator)").index());
根据the documentation索引:
the return value is an integer indicating the position of the first
element within the jQuery object relative to its sibling elements.
强调第一要素.但上面的代码返回3.根据文档不应该这个代码返回0?
你可以在这里看到它:http://jsfiddle.net/Zf9Vv/
注意:
我的选择器匹配两个元素:第一个和最后一个LI.
解决方法
原来的答案是错误的…我现在要保留在这里,所以意见是有道理的.
看看jQuery的索引来源,你可以看到following snippet:
if ( !elem ) { return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1; }
与之前版本1.6.2中的相应(如果非常不同)的代码片段进行比较.注意使用这个[0]:
return jQuery.inArray( this[0],// If it receives a string,the selector is used // If it receives nothing,the siblings are used elem ? jQuery( elem ) : this.parent().children() );
看来,在当前版本中,这个.prevAll部分会导致问题.如果将其更改为this.eq(0).prevAll(它会复制索引文档所述),那么您将返回正确的值.所以会出现这是一个jQuery错误.
在1.6.2版本中,使用inArray.该方法返回第二个参数中第一个参数的索引(如果第二个参数中没有找到第一个参数,则返回-1).第一个参数是[0](匹配集合中的第一个元素),我们得到预期的结果.
这是一个包含修改后的jQuery源的updated fiddle.正确的结果是提醒.
原来的答案(这是不正确的):
再次仔细阅读文档的引用部分(加粗加亮):
the return value is an integer indicating the position of the first
element within the jQuery object relative to its sibling elements.
只是因为两个兄弟姐妹已经从匹配的集合中删除,它不会更改索引返回的值.换句话说,匹配的元素(< li>第四项< / li>)将始终具有相对于其兄弟姐妹的索引3(除非当然,新问题的元素之前插入新的兄弟姐妹).