2010-02-22 5 views
129

Ecco il codice html di massima ho potuto lavorare con:jquery trovare più vicino fratello precedente con classe

<li class="par_cat"></li> 
<li class="sub_cat"></li> 
<li class="sub_cat"></li> 
<li class="par_cat"></li> // this is the single element I need to select 
<li class="sub_cat"></li> 
<li class="sub_cat"></li> 
<li class="sub_cat current_sub"></li> // this is where I need to start searching 
<li class="par_cat"></li> 
<li class="sub_cat"></li> 
<li class="par_cat"></li> 

Ho bisogno di attraversare dalla .current_sub, trovare il più vicino precedente .par_cat e fare cose ad esso.

.find("li.par_cat") restituisce l'intero carico di .par_cat (ne ho circa 30 nella pagina). Ho bisogno di scegliere il singolo.

Sarebbe davvero apprezzare qualche consiglio :)

+4

Wow, i gatti sono davvero tutti su Internet! Ora abbiamo anche gatti par e gatti sub. –

risposta

225

Prova:

$('li.current_sub').prevAll("li.par_cat:first"); 

provato con il vostro codice:

$('li.current_sub').prevAll("li.par_cat:first").text("woohoo"); 

riempiranno il più vicino precedente li.par_cat con "Woohoo".

+0

grazie Karim. Anche questo ha funzionato bene, ma presumo che il .prev() possa consumare meno risorse, poiché .prevAll otterrebbe TUTTI gli elementi corrispondenti precedenti e quindi filtrerebbe quello di cui ho bisogno. Accettare la risposta di Ed. – daulex

+3

In realtà, dopo un po 'di sms, il .prev() non è riuscito in alcune istanze. .prevTutto con: prima, ha funzionato ogni volta. Grazie. – daulex

+1

.prev() controlla solo l'elemento immediatamente precedente. Ho aggiunto il commento alla risposta in basso insieme al jsFiddle esemplificativo. Dopo aver guardato intorno, questa è la migliore risposta in quanto, sebbene debba scorrere tutti gli elementi, non richiede due funzioni per afferrare tutto, quindi filtrare per trovarlo. –

18

Prova

$('li.current_sub').prev('.par_cat').[do stuff]; 

+0

doh, ha funzionato perfettamente, è stato molto più facile di quanto pensassi. Grazie. – daulex

+0

Nessun problema: tutti noi abbiamo quei momenti;) –

+15

Aspetta, cosa? Questo non controlla solo l'elemento immediatamente precedente? Quindi il tuo codice restituirebbe null?- Qui è testato su jsFiddle: http://jsfiddle.net/Y2TEH/ –

10

Utilizzando prevUntil() ci permetterà di ottenere un fratello lontano senza dover ottenere tutto. Ho avuto un set particolarmente lungo che richiedeva troppo CPU usando prevAll().

var category = $('li.current_sub').prev('li.par_cat'); 
if (category.length == 0){ 
    category = $('li.current_sub').prevUntil('li.par_cat').last().prev(); 
} 
category.show(); 

Questo diventa il primo fratello precedente se corrisponde, altrimenti si ottiene il fratello precedente a quello che corrisponde, quindi abbiamo di nuovo di prendere il largo con prev() per ottenere l'elemento desiderato.

3

Credo che tutte le risposte mancano qualcosa. Preferisco l'utilizzo di qualcosa di simile

$('li.current_sub').prevUntil("li.par_cat").prev(); 

Salva non aggiungere: prima all'interno del selettore ed è più facile da leggere e capire. metodo prevUntil() ha una prestazione migliore pure piuttosto che utilizzare prevAll()