Die Traversal-Methode jQuery find (..) enthält nicht den aktuellen Knoten - sie beginnt mit den untergeordneten Knoten des aktuellen Knotens. Was ist der beste Weg, um eine Suchoperation aufzurufen, die den aktuellen Knoten in ihren Übereinstimmungsalgorithmus einbezieht? Beim Durchsehen der Dokumente springt mir nichts sofort heraus.
134
'selector'
macht meiner Meinung nach die Notwendigkeit, zweimal anzugeben, die Kapselung besonders wünschenswert. YMMV'selector'
zweimal angeben (wie von @ronen erwähnt), könntest du nicht einfachobject.parent().find('selector')
??? - Davon abgesehen mag ich die Idee einer Bibliothek, die das für Sie erledigt.object.parent().find('selector')
enthält Geschwister vonobject
und deren Nachkommen.Sie können dies nicht direkt tun. Ich kann mir nur
.andSelf()
vorstellen.filter()
, Folgendes zu verwenden und anzurufen :Nimmt leider
.andSelf()
keinen Selektor mit, was praktisch wäre.quelle
closest(..)
enthält das aktuelle DOM-Element und den Baum nach oben, während alle Durchlaufmethoden nach unten wiefind(..)
usw. nicht mit dem aktuellen Element übereinstimmen. Es ist, als ob das jQuery-Team diese absichtlich ohne Überlappung implementiert hat, wenn beide Vorgänge zusammen für eine vollständige vertikale Suche verwendet wurden.Definieren
dann benutze
anstatt
Leider verfügt jQuery nicht über diese integrierte Funktion. Wirklich seltsam für so viele Jahre der Entwicklung. Meine AJAX-Handler wurden aufgrund der Funktionsweise von .find () nicht auf einige Top-Elemente angewendet.
quelle
filter()
dort verwendet, was sinnvoller ist.Sie können
$('selector')
zur Beschleunigung in einer Variablen speichern. Sie können sogar eine benutzerdefinierte Funktion dafür schreiben, wenn Sie sie häufig benötigen:quelle
$('selector').find('otherSelector').add($('otherSelector'))
, was Sie jetzt haben, ist gleichbedeutend mit.andSelf()
. Schließlich.andFind()
filtert das nicht basierend auf dem Ausdruck, den Sie benötigen würden.add($(this).filter(expr))
:)$('selector')
es durch eine andere Methode zum Abrufen eines jQuery-Objekts ersetzt wird (wenn Sie damit gemeint haben, nicht mit einem Selektor zu beginnen),add()
kann alles genauso gut wie$()
möglich verarbeiten.$('selector')
möglicherweise$('selector').children('filter').closest('.class').last()
... es sich möglicherweise in einer Kette befindet und Sie keine Ahnung haben, um welches Objekt es sich handelt.this
ist das jQuery-Objekt, für das ein Plugin aufgerufen wurde. Es könnte genauso gut das Ergebnis einer Anrufkette sein.Die akzeptierte Antwort ist sehr ineffizient und filtert den Satz von Elementen, die bereits übereinstimmen.
quelle
Wenn Sie möchten, dass die Verkettung ordnungsgemäß funktioniert, verwenden Sie das folgende Snippet.
Nach dem Aufruf der Endfunktion wird das Element #foo zurückgegeben.
Ohne zusätzliche Plugins zu definieren, bleiben Sie dabei.
quelle
this
mehr als ein Elementthis.is()
bereits erfüllt ist, wenn nur eines von ihnen übereinstimmt.Wenn Sie genau ein Element suchen , entweder das aktuelle Element oder eines darin, können Sie Folgendes verwenden:
Wenn Sie nach mehreren Elementen suchen , können Sie Folgendes verwenden:
Die Verwendung von
andSelf
/andBack
ist ziemlich selten, nicht sicher warum. Vielleicht wegen der Leistungsprobleme, die einige Leute vor mir erwähnt haben.(Mir ist jetzt aufgefallen, dass Tgr diese zweite Lösung bereits gegeben hat)
quelle
Ich weiß, dass dies eine alte Frage ist, aber es gibt einen korrekteren Weg. Wenn die Reihenfolge wichtig ist, zum Beispiel wenn Sie mit einem Selektor wie übereinstimmen
:first
, habe ich eine kleine Funktion geschrieben, die genau das gleiche Ergebnis zurückgibt, als ob siefind()
tatsächlich den aktuellen Satz von Elementen enthält:Es wird keineswegs effizient sein, aber es ist das Beste, was ich mir ausgedacht habe, um die richtige Ordnung aufrechtzuerhalten.
quelle
Ich denke
andSelf
ist was du willst:Beachten Sie, dass dadurch immer der aktuelle Knoten hinzugefügt wird, unabhängig davon, ob er mit dem Selektor übereinstimmt oder nicht.
quelle
Wenn Sie streng nach den aktuellen Knoten suchen, tun Sie dies einfach
quelle
Ich habe versucht, eine Lösung zu finden , die sich nicht wiederholt (dh nicht zweimal denselben Selektor eingibt).
Und diese winzige jQuery-Erweiterung macht es:
Es kombiniert
find()
(nur Nachkommen) mitfilter()
(nur aktuelle Menge) und unterstützt alle Argumente, die beide essen. DaspushStack()
erlaubt.end()
, wie erwartet zu arbeiten.Verwenden Sie wie folgt:
quelle
Hier ist die richtige (aber traurige) Wahrheit:
http://jsfiddle.net/SergeJcqmn/MeQb8/2/
quelle
$(selector)
sich in allen Fällen aus dem Set entfernen .