Wie kann ich in reinem JavaScript den Vorfahren eines Elements finden, der dem Baum mit einer bestimmten Klasse am nächsten liegt ? Zum Beispiel in einem Baum wie diesem:
<div class="far ancestor">
<div class="near ancestor">
<p>Where am I?</p>
</div>
</div>
Dann möchte div.near.ancestor
ich, wenn ich das probiere p
und suche ancestor
.
javascript
html
dom
rvighne
quelle
quelle
p
Elements. Wenn Sie tatsächlich nur den übergeordneten Knoten erhalten möchten, können Sie dies tunele.parentNode
.Antworten:
Update: Wird jetzt in den meisten gängigen Browsern unterstützt
Beachten Sie, dass dies mit Selektoren übereinstimmen kann, nicht nur mit Klassen
https://developer.mozilla.org/en-US/docs/Web/API/Element.closest
Für ältere Browser, die keine Unterstützung bieten,
closest()
aber übermatches()
eine solche verfügen , kann eine Selektoranpassung erstellt werden, die der Klassenanpassung von @ rvighne ähnelt:quelle
closest
vielen erweiterten DOM-Traversal-Funktionen. Sie können diese Implementierung selbst abrufen oder das gesamte Bundle einschließen, um viele neue Funktionen in Ihren Code aufzunehmen.Das macht den Trick:
Die while-Schleife wartet, bis
el
sie die gewünschte Klasse hat, und setztel
beiel
jeder Iteration auf 's übergeordnetes Element, sodass Sie am Ende den Vorfahren mit dieser Klasse oder habennull
.Hier ist eine Geige , wenn jemand sie verbessern will. Es funktioniert nicht mit alten Browsern (z. B. IE). In dieser Kompatibilitätstabelle finden Sie Informationen zu classList .
parentElement
wird hier verwendet, daparentNode
mehr Arbeit erforderlich wäre, um sicherzustellen, dass der Knoten ein Element ist.quelle
.classList
finden Sie unter stackoverflow.com/q/5898656/218196 .parentElement
ist eine ziemlich neue Eigenschaft (DOM Level 4) undparentNode
existiert seit ... für immer. Funktioniert alsoparentNode
auch in älteren Browsern, wohingegen diesparentElement
möglicherweise nicht der Fall ist . Natürlich könnten Sie das gleiche Argument für / gegen vorbringenclassList
, aber es gibt keine einfache Alternative wieparentElement
zuvor. Ich frage mich eigentlich, warumparentElement
es überhaupt existiert, es scheint keinen Mehrwert zu bietenparentNode
.while (!el.classList.contains(cls) && (el = el.parentElement));
Verwenden Sie element.closest ()
https://developer.mozilla.org/en-US/docs/Web/API/Element/closest
Siehe dieses Beispiel DOM:
So würden Sie element.closest verwenden:
quelle
Basierend auf der Antwort von the8472 und https://developer.mozilla.org/en-US/docs/Web/API/Element/matches ist hier eine plattformübergreifende Lösung für 2017:
quelle
@rvighne Lösung funktioniert gut, aber wie in den Kommentaren identifiziert
ParentElement
undClassList
beide haben Kompatibilitätsprobleme. Um es kompatibler zu machen, habe ich verwendet:parentNode
Eigentum anstelle desparentElement
EigentumsindexOf
Methode auf derclassName
Eigenschaft anstelle dercontains
Methode auf derclassList
Eigenschaft.Natürlich sucht indexOf einfach nach dem Vorhandensein dieser Zeichenfolge. Es ist egal, ob es sich um die gesamte Zeichenfolge handelt oder nicht. Wenn Sie also ein anderes Element mit der Klasse 'Ahnen-Typ' hätten, würde es immer noch als 'Ahnen' gefunden zurückkehren. Wenn dies ein Problem für Sie ist, können Sie möglicherweise Regexp verwenden, um eine genaue Übereinstimmung zu finden.
quelle