2013-04-23 13 views
5

Perché il selettore :odd non funziona quando lo passo nella funzione remove(selector)? Secondo lo documentation dovrebbe filtrare il gruppo già selezionato di elementi che in questo caso è il li.Il selettore non funziona

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

Risultato

-One 
-Three 

-One 
-Two 
-Three 
-Four 
+0

[Questo jsfiddle] (http://jsfiddle.net/nX8s2/) ha funzionato per me. Sto utilizzando la versione di Chrome 26.0.1410.64 m –

+2

@ ThomasC.G.deVilhena: Passa a jQuery 1.9.1. – Blender

+0

@Blender: Oh! ora vedo. sembra un insetto ... +1 –

risposta

6

In realtà è un bug: http://bugs.jquery.com/ticket/13721

E stato fissato 17 giorni fa in jQuery 2.0.

Il problema era che stava controllando per vedere se ogni elemento corrisponde il selettore:

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

:odd funziona solo nel contesto di un insieme di elementi corrispondenti, in modo che nessuno di questi elementi erano singolarmente dispari. Allo stesso modo, se lo hai cambiato in :even, tutti verranno eliminati.

+0

Risposta rapida e diretta +1 –

2

Il selettore passato a remove utilizzato per essere abbinato al volo, vale a dire, testare ogni elemento contro il selettore e rimuoverlo quando abbinato, un elemento alla volta. (source code)

Questo comportamento è stato modificato in jQuery 2.0, che ora applica il filtro di selezione prima di eseguire la rimozione. Vedere:

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


(edit: correzione sulla spiegazione conseguente comportamento, @Blender è corretto). In questo caso non c'è corrispondenza in quanto ogni elemento utilizzato per essere confrontato con il selettore singolarmente.

Dunque la :odd selector sarebbe mai corrispondere come tutti gli elementi potrebbero essere considerati come all'indice dell'oggetto jQuery 0 (che è quello che :odd/:even controlli) quando testato contro il selettore. Questo spiega perché :odd non corrisponde mai e :even corrisponderebbe a tutti gli elementi.

Problemi correlati