2013-03-05 17 views
5

Ho questo HTML:Come aggiungere una classe a particolari li?

<ul class="how-long"> 
    <li value="1">Any</li> 
    <li value="1">1 day</li> 
    <li value="2">Week end</li> 
    <li value="7">1 Week</li> 
    <li value="14">2 Week</li> 
    <li value="21">3 Week</li> 
</ul> 

Il documento pronto voglio aggiungere nuova classe al elemento li 4 °.

Questo è quello che ho provato:

$(".how-long li").slice(3).addClass('change-color'); 

Se metto un avviso come:

alert($(".how-long li").slice(3).html()); 

mi dà 1 settimana che è giusto, ma quando ho addClass si aggiunge la classe a tutti i li dopo il 4 ° li.

Desidero questo senza aggiungere ID a ciascun elemento li. Posso classificare hard codice direttamente in li, ma voglio farlo dinamicamente usando jQuery.

risposta

13

di farlo in un selettore, utilizzare nth-child o eq:

nth-child è notevolmente più veloce, vedere il mio jsPerf qui: http://jsperf.com/nth-child-vs-eq

jsperf

nth-child:

$(".how-long li:nth-child(4)").addClass('change-color'); 

eq:

$(".how-long li:eq(3)").addClass('change-color'); 

La differenza fondamentale è che nth-child vi darà il 4 ° elemento della ogni elemento con quella classe (indipendentemente dal fatto che si tratta di un figlio della voce corrente), mentre eq sarà darti i bambini sull'attuale oggetto.

+0

questo selezionerà terzo elemento, non quarta come mi ricordo – karaxuna

+0

@karaxuna Buon posto, a cura :) – mattytommo

+0

@karaxuna Solo per 'nth-child' però. 'eq' è basato su 0. – mattytommo

9
$(".how-long li").eq(3).addClass('change-color'); 
2

slice non restituisce un oggetto jQuery, pertanto non è possibile utilizzare il metodo addClass. Il modo giusto di fare ciò che si intende è:

per indice:

$(".how-long li").eq(3).addClass('change-color'); 

per valore riferimento:

$(".how-long li[value=7]").addClass('change-color'); 
+0

per questo particolare problema facendo riferimento al valore funziona, ma diciamo che se volesse aggiungere una classe al secondo li se dovesse fare '$ (". How-long li [value = 1] ")' questo aggiungerebbe anche classe al primo li quindi vai con l'opzione indice. –

+0

'.slice()' restituisce un oggetto jQuery se è utilizzato su un oggetto jQuery. – JJJ

+1

non sono d'accordo su 'slice' non restituisce l'oggetto jQuery ... http: //api.jquery.com/slice/ – charlietfl

-1

farlo in questo modo

$(".how-long li:nth-child(4)").attr({'class':'test'}); 

Questo aggiungerà classe test al 4 ° li

Spero che questo heps

+0

Perché ho ricevuto un voto (-)? :( – Roger

+1

cattivo esempio, se più tardi c'è una classe esistente sul li verrà sostituito con il tuo metodo, tuttavia il -1 non ero io :) –

1

Se si desidera utilizzare il metodo slice è necessario specificare l'attributo fine, che non trovi il

$(".how-long li").slice(3,4).addClass('change-color'); 
0

È possibile utilizzare il nth-child selector:

$(".how-long li:nth-child(4)").addClass('change-color'); 

alert($(".how-long li:nth-child(4)").html()); 
Problemi correlati