2010-12-10 11 views
5

Ich hatte das Gefühl, dass $('.class:first') schneller läuft als $('.class'). Also wenn ich weiß, dass es nur eine .class in der Teilmenge gibt, habe ich es benutzt.Optimieren jQuery Selektor mit: ersten

Führt :first die Abfrage schneller ausführen, oder ist es unnötig?

+0

Wenn es nur ein '.class' Element gibt, sollte es keinen Unterschied machen. (* eher schlechter, in dem Sinne, dass es eine zusätzliche Auswahl treffen muss, anstatt nur alles zurückzugeben *) –

+3

http://jsperf.com/does-first-boost-your-selector – jAndy

+0

@jAndy, danke für die jsperf Link. Ich wusste nichts davon. –

Antwort

4

es tatsächlich auf dem Browser abhängt, :first kein CSS-Selektor ist, es ist ein jQuery-Filter - so dass einige zusätzliche Parsing Arbeit erfordert ... wo als .class von selbst zu einem nativen Browser-Auswahlmethode übergeben werden kann (zB document.querySelectorAll() hier).

würde Jede dieser tatsächlich schneller:

$('.class').first() 
//or... 
$('.class').eq(0) 
//or fastest: 
$('.class').slice(0, 1) 

... da sie dann nehmen nativen Code ausführen nur den ersten Eintrag in diesem Satz.

+0

Ich dachte, es gäbe keine Möglichkeit, Elemente nach Klassen zu bekommen, außer über sie zu iterieren. Daher meine Annahme, dass ': first' es schneller machen würde. Sie können tatsächlich CSS-Selektoren mit der Selektormethode des Browsers verwenden? Ich muss wirklich über JS nachlesen. – Znarkus

+0

@Znarkus - yup, einige native Methoden sind in den letzten Jahren aufgetaucht, etwas getrieben von diesen Selektor-basierten Frameworks :) Und für ': first' ... wenn du darüber nachdenkst, muss es laufen * last * Wie auch immer, da jQuery (oder Sizzle eher) alle anderen Selektoren anwenden muss, um die Elemente zuerst zu filtern, * dann * wähle den ersten (über einen Positionsfilter in Sizzle). –

+0

Cool, danke für den Link! – Znarkus

2

Wenn überhaupt, sollte das Parsen und dann das Ausführen des Filters auf dem :first es langsamer machen. Wenn Sie sich für ein einzelnes Element suchen, tun:

$('.class', context).eq(0) 

diese Weise können Sie den Umfang der Suche nach context begrenzen können und nehmen Sie den einzigen (oder keinen) Gegenstand mit .eq(0).