Der geeignetste Weg, dies zu erhalten: $($(.answer”)[0])

Lesezeit: 4 Minuten

Benutzer-Avatar
Miau

Angenommen, ich möchte das erste Element unter allen Elementen der Klasse „.answer“ abrufen.

$($(".answer")[0])

Ich kann das oben genannte tun, aber was ist die beste Balance zwischen Eleganz und Geschwindigkeit?

*Die Frage wurde geändert, um die aktuelle Diskussion widerzuspiegeln

  • Aus eigener Erfahrung habe ich das festgestellt .first kann im IE wirklich ineffizient sein und so $($(foo)[0]) war deutlich schneller. Dies ist nur in kritischem Code von Bedeutung (think .each bei großen Sets)

    – Raynos

    29. Januar 2011 um 16:29 Uhr

  • Ihre Version scheint zwar unelegant, aber bei weitem die effizienteste zu sein.

    – Jahel

    3. Februar 2011 um 17:20 Uhr

  • Komisch, wie aus einer Frage nach Eleganz ein Leistungsbenchmark wurde.

    – David Tang

    4. Februar 2011 um 0:52 Uhr

  • @box9 Dies ist eine erstaunliche Illustration der Kraft von SO

    – Miau

    4. Februar 2011 um 7:05 Uhr

Benutzer-Avatar
Jahel

Ich kann nicht zum Aspekt der Eleganz sprechen, aber der Leistungsaspekt kann hier tatsächlich einen großen Unterschied machen.

Es sieht aus wie, aus einer Reihe von JavaScript-Testsdass Ihre ursprüngliche Methode tatsächlich die ist die meisten effizient, und im Gegensatz zu der Hypothese, dass die akzeptierte Antwort mit Nicht-CSS-Sizzle-Selektoren verknüpft ist viel weniger effizient als Methodenselektoren. Dafür gibt es einen Grund. Das $('.answer') kann den Browser nativ verwenden getElementsByClass() ohne die Ergebnisse manuell durchlaufen zu müssen. Das :first Selektor erschwert das. In diesem Fall scheint die Verwendung der Sizzle-Selektoren die Auswahl um einen Faktor zwischen 4 und 5 zu verlangsamen.

Ich würde argumentieren, dass bei jQuery die Leistung die Eleganz übertrumpfen sollte, und alle Beweise (jeder einzelne Browser, den ich bisher getestet habe!) scheinen darauf hinzudeuten, dass die unelegante Lösung von OP bei weitem die schnellste ist.

Hier die Ergebnisse der Browser mit den meisten Testläufen:

Geben Sie hier die Bildbeschreibung ein

(Die Zahlen sind „Vorgänge pro Sekunde“, höhere Zahlen sind also schneller, niedrigere Zahlen langsamer.)

  • Ich denke, es wäre vorteilhaft, auch Tests mit komplexeren Dokumentbäumen durchzuführen.

    – Çağdaş Tekin

    3. Februar 2011 um 17:25 Uhr

  • Aus Neugier, warum würden Sie argumentieren, dass bei jQuery die Leistung die Eleganz übertrumpft? Ich würde eigentlich das Gegenteil behaupten, besonders wenn der Benutzer den Unterschied nicht erkennen kann.

    – Xavi

    3. Februar 2011 um 17:26 Uhr

  • @Xavi Bei einer Auswahl kann der Benutzer den Unterschied nicht erkennen, aber wenn Sie eine jQuery-lastige Anwendung erstellen, können sich diese Unterschiede summieren, insbesondere in Browsern der unteren Preisklasse. Wenn eine Methode buchstäblich fünfmal schneller ist als eine andere Methode, macht sich dieser Unterschied bemerkbar.

    – Jahel

    3. Februar 2011 um 17:32 Uhr

  • Im Grunde habe ich dies getan, um eine wachsende konventionelle Meinung zu widerlegen, dass die Sizzle-Selektoren effektiver sind. Ich war eigentlich überrascht, dass die Version von OP am schnellsten war; ich habe erwartet .eq(0) oder .first() schneller zu sein.

    – Jahel

    3. Februar 2011 um 17:38 Uhr

  • Nur ein kurzer Hinweis auf yahelcs Hinweis, dass Leistung wichtig ist. In mobilen Browsern macht die Effizienz Ihres js einen RIESIGEN, äußerst spürbaren Unterschied zur UX aus

    – Miau

    16. Juni 2011 um 6:34 Uhr

Benutzer-Avatar
Phrogz

Die folgenden Funktionen sind alle gleichwertig (jedoch nicht in der Geschwindigkeit):

Welches ist das Beste?

Es wurde die Hypothese aufgestellt, dass die Selektorversionen sollte schneller sein als die Methodenversionen (und die Logik macht Sinn), aber ich habe noch keinen zuverlässigen Cross-Browser-Benchmark für mehrere Dokumente gefunden, der dies beweist.

Und in einigen Fällen können Sie den Selektor nicht verwenden, da Sie ein jQuery-Objekt haben, das aus verketteten Ergebnissen resultiert, und es später reduzieren müssen.

Bearbeiten: Basierend auf den hervorragenden Informationen aus den Tests von @yc unten sind die aktuellen (2011-Feb-4) Testergebnisse zusammengefasst und mit einem Ausgangswert von verglichen .answer:first:

          :first  :eq(0)  .first()  .eq(0)  $($('...')[0])
Chrome 8+   100%     92%      224%    266%       367%
   FF 3.6   100%    100%      277%    270%       309%
  FF 4.0b   100%    103%      537%    521%       643%
 Safari 5   100%     93%      349%    352%       467%
 Opera 11   100%    103%      373%    374%       465%
     IE 8   100%    101%     1130%   1246%      1767%
 iPhone 4   100%     95%      269%    316%       403%
=====================================================
 Weighted   100%     92%      286%    295%       405%
    Major   100%     95%      258%    280%       366%
  • Das Gewichtet Linie zeigt die Performance gewichtet nach Anzahl der Tests pro Browser; gängige Browser (darunter Testing) werden stärker gezählt.
  • Das Haupt Zeile zeigt dasselbe, nur einschließlich Nicht-Beta-Versionen der wichtigsten Desktop-Browser.

Zusammenfassend: Die Hypothese ist (derzeit) falsch. Die Methoden sind erheblich schneller als die Sizzle-Selektoren und fast ohne Ausnahme der OP-Code $($('.answer')[0]) ist der schnellste von allen!

  • :eq() ist nullbasiert. Vielleicht hast du an gedacht :ntes Kind()die eins basiert?

    – Frédéric Hamidi

    29. Januar 2011 um 16:31 Uhr

  • Richten Sie einfach ein JSPerf für diese ein jsperf.com/selecting-the-first . Bitte führen Sie es auf Ihren verschiedenen Browsern aus 🙂 Meine ersten Tests scheinen darauf hinzudeuten, dass die Methoden entgegen der Hypothese schneller sind als die Sizzle-Selektoren. Dies ist nicht überraschend, da bekannt ist, dass Nicht-CSS-Sizzle-Selektoren ziemlich langsam sind.

    – Jahel

    3. Februar 2011 um 15:41 Uhr

  • NB: Die Prozentsätze in der Tabelle scheinen die Geschwindigkeit zu sein, nicht die Dauer.

    – LarsH

    19. Oktober 2011 um 21:39 Uhr

Benutzer-Avatar
karim79

Verwenden Sie die :first Selektor oder die .first Filtermethode:

$(".answer:first");

oder:

$(".answer").first();

1217220cookie-checkDer geeignetste Weg, dies zu erhalten: $($(.answer”)[0])

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

Privacy policy