Durchlaufen der DOM mit jQuery .am nächsten()
Was ich dachte wäre ein leichtes für die .closest()
zu behandeln, stellte sich heraus, nicht zu sein (oder vielleicht mache ich einen BLÖDEN Fehler).
Was ich versuche zu tun, ist der Zugang der <label>
element aus der <div>
mit dem text: I AM HERE
:
<li>
<label>I WANT TO ACCESS THIS ELEMENT</label>
<div>...</div>
<div>
<input/>
<input/>
<input/>
<div id="start">I AM HERE</div>
</div>
</li>
Meine erste Vermutung wäre gewesen, zu versuchen, diese:
$('#start').closest('label')
Aber nichts zurück.
- Wenn
.closest()
scheint nicht richtig zu arbeiten, warum nicht Blick auf die.closest()
doco? Oder die Liste der traversal-Methoden: api.jquery.com/category/traversing/tree-traversal zu finden, eine geeignete Methode... - nnnnnn - ich schaue in die Dokumentation, und das ist, wie ich kam mit meinem test. Die Dokumentation sagt ausdrücklich "Holen Sie sich das erste element entspricht dem Selektor, der Anfang bei dem aktuellen element und schreitet durch den DOM-Baum." Ich dachte, das Etikett ich versuche, Zugriff auf den DOM-Baum.
- Gute Frage! Ich habe nicht verwendet closest() noch nicht, aber jetzt weiß ich, ich brauche zu tun. Großartiges Beispiel für seine Verwendung.
- Sorry Allen, so viele Leute hier posten, anstatt die doco (oder Google) und ich denke, ich nahm an, Sie waren eine solche. Sorry nochmal. "Durch den DOM-Baum" bedeutet gerade nach oben, nicht seitwärts. I. e., Eltern, Großeltern, Urgroßeltern, etc., aber keine Tanten/Onkel, cousins, Geschwister.
- Dank nnnnnn. Ich verstehe, was Sie versuchen zu sagen =) Einige von uns sind nur so gut wie das, was wir verstehen können, aus der docs.
Du musst angemeldet sein, um einen Kommentar abzugeben.
.closest()
sieht nur für Vorfahren-Elemente, um die anfängliche Auswahl. Sie wollen eine Kombination von.closest()
und.siblings()
oder.children()
:Update
Sehr schnell Selektor zu verwenden
.prev()
zweimal.parent()
wie diese:$('#start').parent().prev().prev();
<input></input
, der richtige Weg ist:<input />
(self-closing tag).$('#start').parent().prev().prev();
ist doppelt so schnell wie mit anderen Methoden zu integrieren, strings: jsperf.com/jquery-string-selector-vs-function-selector.parent().prev().prev()
kann, sparen Sie eine Millisekunde oder zwei, es müssen aktualisiert werden, wenn ein element Hinzugefügt wird, dassli
nach derlabel
oder wenn#start
verschoben wird. Ich denke, das ist der Preis der micro-Optimierung..children()
statt.find()
..closest
findet nur die Eltern der ausgewählten Elemente. Versuchen Sie dies:Update
geändert
.children
, die"> label"
selector abgeschrieben..find("> label")
erfordert mucking um mit Zeichenfolgen, die Sie tun könnten:.children('label')
oder sogar schneller.children().first()
..children("label")
ist schneller als meine Methode, und meiner Meinung nach einfacher zu Lesen.Nächsten beginnen um das aktuelle element und Fortschritt der DOM-Baum, aber da
<label>
ist nicht ein Elternteil von Ihrem aktuellen Elements, die Sie brauchen, um zu verwenden, 2 findet:Dies ist Ihre effizienteste traversal.
Ich weiß, das ist alt, aber hier ist der Schnellste Weg ...
find()
verwendet native browser-Methodenchildren()
verwendet JavaScript vom browser interpretiert