2013-04-23 67 views
5

爲什麼:odd選擇器在我將它傳遞到remove(selector)函數時不起作用?根據documentation它應該篩選已經選擇的項目,在這種情況下是li的項目。移除選擇器不工作

<ul id='list1'> 
    <li>One</li> 
    <li>Two</li> 
    <li>Three</li> 
    <li>Four</li> 
</ul> 
<ul id='list2'> 
    <li>One</li> 
    <li>Two</li> 
    <li>Three</li> 
    <li>Four</li> 
</ul> 

$(document).ready(function() { 
    $('#list1').children(':odd').remove(); // works as expected 
    $('#list2').children().remove(':odd'); // does not work 
}); 

結果

-One 
-Three 

-One 
-Two 
-Three 
-Four 
+0

[This jsfiddle](http://jsfiddle.net/nX8s2/)爲我工作。我正在使用Chrome版本26.0.1410.64 m – 2013-04-23 02:02:13

+2

@ ThomasC.G.deVilhena:將其切換到jQuery 1.9.1。 – Blender 2013-04-23 02:02:43

+0

@Blender:哦!現在我明白了。看起來像一個bug ... +1 – 2013-04-23 02:03:49

回答

6

它實際上是一個錯誤:http://bugs.jquery.com/ticket/13721

,並固定10天以前在jQuery 2.0

的問題是,它檢查以查看是否每個元素匹配的選擇:

for element in matched_elements: 
    if element matches the selector: 
     remove element 

:odd僅工作在一組匹配的元素的上下文中,所以沒有這些元素的單獨是奇數。同樣,如果您將其更改爲:even,它們全部都會被刪除。

+0

快速和直接的答案+1 – 2013-04-23 02:23:14

2

傳遞給remove的選擇器用於在運行中匹配,即對照選擇器測試每個元素,並在匹配時刪除它,每次一個元素。 (source code

此行爲在jQuery 2.0中進行了更改,該行爲現在在執行刪除操作之前應用選擇器篩選器。請參閱:

#13721: remove(「:nth-child(1)」) works differently than filter(「:nth-child(1)」).remove()


編輯:上產生的行爲解釋修正,@Blender是正確的)。在這種情況下,沒有匹配,因爲每個元素都用於單獨檢查選擇器。

因此:odd selector將不會匹配,因爲所有元件將jQuery對象的索引0在被視爲(這是:odd/:even檢查)時對選擇器進行測試。這解釋了爲什麼:odd從未匹配,並且:even將匹配所有元素。