为什么这个jQuery返回3的索引?

时间:2011-12-08 00:19:33

标签: javascript jquery

HTML:

<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索引:

  

返回值是一个整数,表示第一个的位置   jQuery对象中的元素相对于其兄弟元素。

强调first element。但上面的代码返回3。根据文档,此代码不应返回0

您可以在此处看到它:http://jsfiddle.net/Zf9Vv/

注意:

我的选择器匹配两个元素:第一个和最后一个LI

3 个答案:

答案 0 :(得分:5)

修改(见评论) 原来的答案是不正确的......我现在要把它保留在这里,所以评论是有意义的。

查看index的jQuery源代码,您可以看到following snippet

if ( !elem ) {
    return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1;
}

将此与早期版本1.6.2中的相应(如果非常不同)代码段进行比较。请注意使用this[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() );

似乎在当前版本中this.prevAll部分导致问题。如果将其更改为this.eq(0).prevAll(复制index文档所声明的内容),则会返回正确的值。所以看起来这是一个jQuery错误。

在1.6.2版本中,使用了inArray。该方法返回第二个参数中第一个参数的索引(如果在第二个参数中找不到第一个参数,则返回-1)。由于第一个参数是this[0](匹配集中的第一个元素),我们得到预期的结果。

这是包含修改过的jQuery源的updated fiddle。警告正确的结果。


原始答案(这是不正确的):

仔细阅读文档的引用部分(添加粗体突出显示):

  

返回值是一个整数,表示第一个的位置   jQuery对象中的元素相对于其兄弟元素

仅仅因为已从匹配集中删除了两个兄弟节点,它不会更改index返回的值。换句话说,匹配元素(<li>Fourth Item</li>)将始终具有相对于其兄弟姐妹的索引3(当然,除非在所讨论的元素之前将新兄弟姐妹插入到DOM中)。

答案 1 :(得分:4)

您可能发现实际的jQuery功能与文档所说的内容之间存在差异。

docs

  

如果没有将参数传递给.index()方法,则返回值是一个整数,表示jQuery对象中第一个元素相对于其兄弟元素的位置。

但是,.index()返回jQuery对象中 last 元素的索引。

这可以通过console.log( $("li").index() ); // 3

在你的小提琴中证明(不会引入:not selector的潜在问题)

可能需要关于jQuery的错误报告吗?

答案 2 :(得分:4)

<强>更新

确认,这是jQuery 1.6.3中引入的回归。早期版本显示预期的行为(返回0)。

经过调查,我不情愿地得出结论,除了jQuery中的错误之外,这不可能是其他任何事情。

具体来说,至少在这种情况下,index()返回相对于匹配的第二个元素(裸<li>)的兄弟的索引。这是事实

$("li:not(.disabled,.separator)").get(0)

正确返回<li class="selected">

此外,如果我们将选择器更改为

$("li:not(.disabled,.separator,:last-child)").index()

然后index正确返回0。

使用jQuery 1.7.1进行的测试