2013-04-23 19 views
5

Dlaczego selektor :odd nie działa, gdy przekazuję go do funkcji remove(selector)? Zgodnie z documentation powinien filtrować już wybrany zestaw elementów, który w tym przypadku jest li.Usuń selektor nie działa

<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 
}); 

Wynik

-One 
-Three 

-One 
-Two 
-Three 
-Four 
+0

[To jsfiddle] (http://jsfiddle.net/nX8s2/) pracował dla mnie. Używam wersji Chrome 26.0.1410.64 m –

+2

@ ThomasC.G.deVilhena: Przełącz na jQuery 1.9.1. – Blender

+0

@Blender: Oh! teraz widzę. wygląda jak błąd ... +1 –

Odpowiedz

6

To rzeczywiście bug: http://bugs.jquery.com/ticket/13721

I została ustalona 17 dni temu w jQuery 2.0.

Problemem było to, że sprawdzając, czy każdy element dopasowany selektora:

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

:odd działa tylko w kontekście zestawu dopasowanych elementów, więc żaden z tych elementów osobno były dziwne. Podobnie, jeśli zmienisz go na :even, wszystkie zostaną usunięte.

+0

Szybka i prosta odpowiedź +1 –

2

Selektor przekazany do remove był używany w locie, czyli testowanie każdego elementu względem selektora i usuwanie go po dopasowaniu, po jednym elemencie. (source code)

To zachowanie zostało zmienione w jQuery 2.0, które teraz stosuje filtr selektora przed wykonaniem usunięcia. Zobacz:

#13721: remove(“:nth-child(1)”) works differently than filter(“:nth-child(1)”).remove()


(edit: korekta na wynikającym z wyjaśnieniem zachowania, @Blender jest poprawna). W tym przypadku nie ma dopasowania, ponieważ każdy element używany do sprawdzenia osobno dla selektora.

Dlatego :odd selector nigdy nie będzie pasować jak wszystkie elementy zostaną uznane za w indeksie obiektu jQuery 0 (czego :odd/:even kontroli), gdy testowano wobec selektora. To wyjaśnia, dlaczego :odd nigdy nie pasuje, a :even pasowałoby do wszystkich elementów.