Wie kann man jQuery anweisen, die Suche nach DOM zu beenden, wenn das erste Element gefunden wird?

Lesezeit: 4 Minuten

Benutzer-Avatar
serg

Von dem, was ich verstehe, hinzufügen .first() oder :first zu einer Abfrage stoppt die DOM-Suche nicht nach der ersten Übereinstimmung. Es weist jQuery nur an, das erste Element aus der übereinstimmenden Sammlung zu nehmen.

Wenn das stimmt, gibt es dann eine Möglichkeit, die DOM-Suche nach der ersten Übereinstimmung zu stoppen? Wenn ich beispielsweise weiß, dass das Ergebnis dieser Abfrage immer ein einzelnes Element sein wird, wie kann jQuery dann angewiesen werden, keine Zeit mit der weiteren Suche zu verschwenden?

  • Interessant, sie könnten sich wirklich verbessern :first Wähler. Aber ich glaube nicht, dass es viel kostet, ich bekomme 3 ms in diesem Beispiel, das einen nicht nativen Selektor hat: jsfiddle.net/W8u64

    – BrunoLM

    16. Oktober 2010 um 22:44 Uhr

  • Als Referenz gab es eine kurze Diskussion darüber in den jQuery-Foren. forum.jquery.com/topic/…

    – Kevin B

    28. März 2013 um 20:11 Uhr

  • und nach dieser Diskussion sieht es nicht so aus, als würde jQuery selbst etwas dagegen unternehmen; Fahrkarte Nr. 11785

    – Haschbraun

    30. September 2013 um 0:42 Uhr

Soweit ich weiß, gibt es im Moment keine Möglichkeit, dies in jQuery zu tun. Das Beste, was Sie tun können, ist $(selector).first()wo selector ist ein Standard-CSS-Selektor, der keine Sizzle-spezifischen Selektoren enthält (verwenden Sie also nicht :first). In diesem Fall verwendet jQuery das schnelle DOM querySelectorAll Methode in modernen Browsern.

Sie können die Optimierung manuell abrufen, indem Sie das DOM verwenden querySelector Methode, die so aufgebaut ist, dass nur die erste Übereinstimmung ausgewählt wird:

$.getFirst= function(selector) {
    if ('querySelector' in document)
        return $(document.querySelector(selector));
    else
        return $(selector).first();
}

Der Betrag, den Sie auf diese Weise sparen, ist jedoch viel geringer als der Betrag, den Sie sparen, wenn Sie dies sicherstellen querySelectorAll kann verwendet werden.

  • Was wäre wenn querySelector funktioniert auch wie first – bekommt das erste Element aus einer Sammlung? 🙂 Seltsam, dass jquery nicht verwendet querySelector überall, wäre es nicht eine klare Verbesserung für :first Selektor-Implementierung?

    – serg

    16. Oktober 2010 um 22:00 Uhr

  • Ja, bei manchen Browsern querySelector könnte tatsächlich mit implementiert werden querySelectorAll! Ich habe das nicht wirklich einem Stresstest unterzogen, aber ich würde so oder so keinen großen Unterschied erwarten. querySelectorAll ist im Vergleich zu allen anderen JS-Selector-Engines, die davor kamen, bereits viel schneller.

    – Bobin

    16. Oktober 2010 um 22:03 Uhr

  • jQuerys Verwendung von querySelectorAll ist eine kurzschließende Schicht über Sizzle, ein bisschen wie die obige Funktion. Man könnte vielleicht eine Optimierung hinzufügen, um zu erkennen :first am Ende des Selektors und schalte das ein (muss testen, ob sich das wirklich lohnt!), aber der allgemeine Fall, wo :first in der Mitte eines Selektors sein könnte, ist nicht ohne weiteres machbar (aufgrund verschiedener Probleme mit bereichsbezogenen Selektoren, die jQuery bereits oft stoppen querySelectorAll).

    – Bobin

    16. Oktober 2010 um 22:07 Uhr

Benutzer-Avatar
Moin Zamann

:first stimmt nur mit einem einzigen Element überein. sein Äquivalent zu :eq(0).

.first() reduziert die Menge der übereinstimmenden Elemente auf das erste in der Menge.

also verwenden :first scheint das zu sein, was Sie brauchen, aber bei näherer Betrachtung verwenden beide zuerst Selektoren, um ein Set zu finden, und verwenden dann das erste.

Es gibt einige Kommentare und Diskussionen hier und hier das scheint darauf hinzudeuten :first() hört nicht beim ersten Element auf.

Verweise:

http://api.jquery.com/first-selector/

http://api.jquery.com/first/

  • Beide :first Selektor und die .first() -Methode erstellt eine Liste aller übereinstimmenden Elemente und nimmt dann nur das erste Ergebnis und verwirft den Rest. Das OP sucht nach einer Optimierung, um zu vermeiden, dass die überflüssigen Elemente überhaupt gesammelt werden.

    – Bobin

    16. Oktober 2010 um 21:42 Uhr

  • @bobince: danke Kumpel, hat mich veranlasst, mehr zu recherchieren und herauszufinden, was wirklich dahinter steckt.

    – Moin Zaman

    16. Oktober 2010 um 21:55 Uhr

  • :first und .first() mögen sich gleich verhalten, aber intern sind sie unterschiedlich. :first ruft nie an .eq()

    – BrunoLM

    16. Oktober 2010 um 22:32 Uhr

Ich bin kein Experte für die Innereien von jQuery, aber ich verstehe, dass die Reihenfolge, in der jQuery Dinge findet, nicht unbedingt die Reihenfolge ist, in der sie im DOM erscheinen. Um sicherzustellen, dass Sie das erste Element im DOM erhalten, ruft jQuery alles ab und sortiert das Ergebnis so, dass das erste Element zurückgegeben wird.

Wie Sie bemerkt haben, handelt es sich hierbei um ein Leistungsproblem. Ich glaube jedoch nicht, dass Sie dieses Verhalten deaktivieren können.

Was Sie tun können, ist, Ihre Abfragen spezifischer zu gestalten, sodass weniger ausgewählt wird und weniger Elemente für jQuery zu sortieren sind, um das erste zu finden. Zum Beispiel ist $(‘li:first’) nicht sehr spezifisch und wird langsam sein. $(‘#myList>li:first’) wird theoretisch viel schneller sein (obwohl ich es nicht überprüft habe), weil a) es nur in einer einzelnen Liste sucht und b) Unterlisten ebenfalls ausgeschlossen werden.

Wenn Sie irgendwann alle Elemente in einer Auswahl für etwas verwenden, aber nur das erste an einem bestimmten Punkt benötigen, ist es sinnvoll, den Selektor auszuführen, um alle Ihre Elemente zu erhalten und sie in einer var zu speichern, und verwenden Sie sie dann .first(), um das erste Element zu erhalten, wenn Sie es brauchen.

var elems = $('li'), firstElem = elems.first ();

Jetzt enthält elems den vollständigen Satz, und firstElem enthält nur das erste Element.

Natürlich könnten Sie auch einfach dem ersten Element in jeder Gruppe, die Sie auswählen möchten, eine bestimmte Klasse zuweisen, aber dies könnte als unelegante Lösung angesehen werden.

1093160cookie-checkWie kann man jQuery anweisen, die Suche nach DOM zu beenden, wenn das erste Element gefunden wird?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy