2011-12-08 34 views
9

HTML:爲什麼這個jQuery返回索引3?

<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

+2

擊中了要害完成。你已經發現了一個迴歸。 :) – Jon

+1

耶給我!你可以在這裏查看票:http://bugs.jquery.com/ticket/10977 –

+0

根據我的發現(見[答案](http://stackoverflow.com/a/8424662/50079)),我認爲機票誤導。這是1.6.3中引入的迴歸,應該這樣報告。 1.6.3發行說明中沒有(當然)沒有說明「index()」的已記錄行爲會發生變化。 – Jon

回答

5

編輯(查看評論) 原始答案是不正確的...我現在要保留它,所以評論意義合理。

望着jQuery的源index,你可以看到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](匹配集中的第一個元素),我們得到了預期的結果。

這是一個updated fiddle,包含修改後的jQuery源代碼。正確的結果會被警告。


原來的答覆(這是不正確的):

再次仔細閱讀文檔的引用部分(粗體高亮補充):

的返回值是一個整數,指示jQuery對象內的第一個 元素相對於其同級元素的位置。

僅僅因爲其中兩個兄弟姐妹已從匹配集中刪除,它不會更改由index返回的值。換句話說,匹配的元素(<li>Fourth Item</li>)將始終具有索引3,相對於它的同級(除非當前在相關元素之前將新的同級元素插入到DOM中)。

+2

但是,既然第一個和最後一個'LI'匹配,應該選擇第一個(索引爲0)? –

+0

啊,我明白你的意思了。我會研究它,所以我不會刪除我的答案。 –

+0

我現在正在看同樣的權利,發佈事實+1。 – Jon

4

您可能發現實際jQuery功能與文檔內容之間存在差異。

docs狀態

如果沒有參數被傳遞給所述的.index()的方法,所述返回值是指示elements.` jQuery對象相對於其兄弟所述內的第一元素的位置的整數。

然而,.index()將返回jQuery對象內的最後元素的索引。

這可以證明(不引入與一個潛在的問題:沒有選擇器)通過console.log($("li").index()); // 3

也許需要jQuery的bug報告你的小提琴?

+1

**人們,這不是一個文檔問題。這是迴歸。** – Jon

+0

這是針對我嗎?我沒有說這是一個文檔問題,但它是實際功能和文檔之間的差異。 – simshaun

+0

它主要針對牧民的心態,但它也適用於你,因爲答案留下的印象是這應該通過更改文檔來解決。 – Jon

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

+0

是的,經過測試,這確實是jQuery中的一個bug。好決定。 – Alex

+1

@Alex:我測試並確定1.6.3爲有罪釋放。現在讓我們來看看出了什麼問題:) – Jon

+0

@Jon - 出現錯誤的是從'this [0]'改變爲'this'(其他許多變化 - 代碼在最新版本中完全不同)。看到我的(更新)答案。 –