2013-06-13 22 views
105

Esiste un modo in jQuery per verificare se qualsiasi genitore, nipote, pronipote genitore, genitore non protagonista, ha una classe.Controlla se un antenato ha una classe che usa jQuery

Ho una struttura di markup che mi ha lasciato fare questo genere di cose nel codice:

$(elem).parent().parent().parent().parent().hasClass('left') 

Tuttavia, per la leggibilità del codice mi piacerebbe evitare questo genere di cose. C'è un modo per dire "qualsiasi genitore/nonno/pronipote ha questa classe"?

Sto usando jQuery 1.7.2.

risposta

214
if ($elem.parents('.left').length) { 

} 
+11

Grazie, proprio quello che mi serviva! Per la cronaca, mentre la pratica del trattamento di '.length' come valore di verità è piuttosto prolifica in JS, è molto più chiara e più facile da capire' .length> 0' – dooleyo

+0

Ecco il link a jQuery [.parents()] (https://api.jquery.com/parents/) documentazione –

6

È possibile utilizzare parents metodo con specificato .class selettore e verificare se qualcuno di loro lo confronta:

if ($elem.parents('.left').length != 0) { 
    //someone has this class 
} 
61

Ci sono molti modi per filtrare per gli antenati degli elementi.

if ($elem.closest('.parentClass').length /* > 0*/) {/*...*/} 
if ($elem.parents('.parentClass').length /* > 0*/) {/*...*/} 
if ($elem.parents().hasClass('parentClass')) {/*...*/} 
if ($('.parentClass').has($elem).length /* > 0*/) {/*...*/} 
if ($elem.is('.parentClass *')) {/*...*/} 

Attenzione, closest()metodo comprende dell'elemento stesso durante il controllo per selettore.

In alternativa, se si dispone di un selettore unico corrispondenti alla $elem, ad esempio #myElem, è possibile utilizzare:

if ($('.parentClass:has(#myElem)').length /* > 0*/) {/*...*/} 
if(document.querySelector('.parentClass #myElem')) {/*...*/} 

Se si desidera far corrispondere un elemento a seconda qualsiasi sua classe antenata solo a scopo styling , basta utilizzare una regola CSS :

.parentClass #myElem { /* CSS property set */ } 
+2

Potrei azzardarmi a dire (senza testare questo) che questo metodo è migliore. Elem.parents attraverserà l'intera dom strucutre padre, dove il più vicino() dovrebbe (probabilmente) fermarsi una volta che trova il genitore più vicino con quell'elemento ed è quindi più efficiente. Questa è un'ipotesi non istruita. Di solito uso il più vicino(). Sembra che abbia trovato un nuovo argomento da ricercare per il mio blog! : P – dudewad

+0

@dudewad sì, ma è abbastanza recente. Intendo nella vecchia versione jq, AFAIK, non era questo il caso. Il ciclo dei genitori non si interrompe sul primo genitore abbinato usando il più vicino(), ma ora lo è. (non so da che versione jq, ma sono abbastanza sicuro di essere corretto su questa affermazione) –

+0

Buono a sapersi, grazie per le informazioni. Strano che non avrebbero costruito l'irruzione dalla prima versione. – dudewad

Problemi correlati