2013-06-13 16 views
105

Czy jest jakiś sposób w jQuery do sprawdzenia, czyrodzic, grand-rodzic, super-grand-rodzic ma klasę.Sprawdź, czy dowolny element nadrzędny ma klasę używającą jQuery

Mam strukturę znaczników, który opuścił mnie robi tego typu rzeczy w kodzie:

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

Jednakże, dla czytelności kodu Chciałbym uniknąć tego rodzaju rzeczy. Czy jest jakikolwiek sposób, aby powiedzieć "jakikolwiek rodzic/dziadek/pradziadek ma tę klasę"?

Używam jQuery 1.7.2.

Odpowiedz

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

} 
+11

dzięki, tylko to, co potrzebne! Dla zapisu, podczas gdy praktyka traktowania '.length' jako wartości prawdy jest dość płodna w JS, jest o wiele jaśniejsza i łatwiejsza do zrozumienia' .length> 0' – dooleyo

+0

Oto link do jQuery [.parents()] (https://api.jquery.com/parents/) documentation –

6

Można użyć parents metody z określonym .class selektora i sprawdzić, czy któryś z nich pasuje do niego:

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

Istnieje wiele sposobów, aby filtrować przodków elementów.

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 *')) {/*...*/} 

Uwaga, closest()sposób obejmuje sam element podczas sprawdzania selektora.

Ewentualnie, jeśli masz unikalny selektor dopasowując $elem np #myElem, można użyć:

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

Jeśli chcesz dopasować element zależności którekolwiek z jej klasy przodka tylko dla celów stylizacji , wystarczy użyć reguły CSS:

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

Mogę zaryzykować stwierdzenie (bez testowania tego), że ta metoda jest lepsza. Elem.parents przemieści całą strukturę dom macierzystą, gdzie close() powinien (prawdopodobnie) zatrzymać, gdy znajdzie najbliższy rodzic z tym elementem, a zatem jest bardziej wydajny. To jest niewykształcone domysły. Zwykle używam closest(). Wygląda na to, że znalazłem nowy temat do badań na moim blogu! : P – dudewad

+0

@dudewad tak, ale jest całkiem niedawno. Mam na myśli w starszych wersjach jQ, AFAIK, tak nie było. Pętla rodziców nie była zerwaniem pierwszego dopasowanego elementu nadrzędnego za pomocą metody najbliższ(), ale teraz jest. (nie wiem od której wersji jq, ale jestem pewien, że poprawne jest to stwierdzenie) –

+0

Dobrze wiedzieć, dziękuję za informację. Dziwne, że nie zbudowaliby włamania od pierwszej wersji. – dudewad

Powiązane problemy