2013-06-13 7 views
105

Gibt es eine Möglichkeit in jQuery zu überprüfen, ob eine Eltern, Großelternteil, Urgroßelternteil hat eine Klasse.Überprüfen Sie, ob ein Vorgänger eine Klasse mit jQuery hat

Ich habe eine Markup-Struktur, die mich tun diese Art der Sache im Code hinterlassen hat:

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

jedoch für die Lesbarkeit des Codes ich möchte diese Art der Sache zu vermeiden. Gibt es eine Möglichkeit zu sagen, "irgendein Elternteil/Großelternteil/Urgroßelternteil hat diese Klasse"?

Ich benutze jQuery 1.7.2.

Antwort

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

} 
+11

Danke, genau das, was ich brauche: nur eine CSS-Regel verwenden! Während die Praxis, '.length 'als Truthy-Wert zu behandeln, in JS recht produktiv ist, ist es viel klarer und leichter zu verstehen.' .length> 0' – dooleyo

+0

Hier ist der Link zu jQuery [.parents()] (https://api.jquery.com/parents/) Dokumentation –

6

Sie können parents Methode mit dem angegebenen .class Selektor verwenden und überprüfen, ob einer von ihnen sie paßt:

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

Es gibt viele Möglichkeiten für das Element Vorfahr zu filtern.

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

Vorsicht, closest()Verfahren Element selbst umfasst, während für die Wählverbindung zu überprüfen.

Alternativ, wenn Sie einen einzigartige Wähler haben die Abstimmung die $elem, zB #myElem, können Sie verwenden:

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

Wenn Sie ein Element passen nur eines seiner Vorfahren Klasse für Styling Zweck abhängig

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

Ich könnte sagen (ohne dies zu testen), dass diese Methode besser ist. Elem.parents durchqueren die gesamte elterliche Domstruktur, wobei engste() (wahrscheinlich) aufhören sollte, sobald sie das nächste Elternteil mit diesem Element findet und daher effizienter ist. Dies ist eine ungebildete Vermutung. Normalerweise verwende ich am nächsten(). Klingt so, als hätte ich ein neues Thema für meinen Blog gefunden! : P – dudewad

+0

@dudewad ja es ist, aber es ist ziemlich neu. Ich meine, in älteren jq-Versionen, AFAIK, war das nicht der Fall. Die Eltern-Schleife war nicht mit dem ersten übereinstimmenden Elternteil, der engste() verwendet, unterbrochen, aber jetzt ist es. (weiß nicht, seit welcher Version jq, aber ich bin mir ziemlich sicher, auf dieser Aussage richtig zu sein) –

+0

Gut zu wissen, danke für die Info. Seltsam, dass sie den Einbruch von der ersten Version nicht gebaut hätten. – dudewad