2010-12-10 12 views
5

He tenido la sensación de que $('.class:first') se ejecuta más rápido que $('.class'). Entonces, cada vez que sé que solo hay un .class en el subconjunto, lo he usado.Optimizar jQuery selector con: primero

¿:first hace que la consulta se ejecute más rápido, o es innecesario?

+0

si solo hay un elemento '.class', no debería hacer ninguna diferencia. (* es más probable que tenga un peor rendimiento, en el sentido de que debe hacer una selección adicional en lugar de simplemente devolver todo *) –

+3

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

+0

@jAndy, gracias por el jsperf enlace. no sabia sobre eso. –

Respuesta

4

De hecho, depende del navegador, :first no es un selector de CSS, es un filtro jQuery, por lo que requiere algún trabajo de análisis adicional ... donde como .class puede transferirse a un método de selección de navegador nativo (por ejemplo, document.querySelectorAll() aquí).

Cualquiera de ellos sería en realidad más rápido:

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

... ya que corren el código nativo luego tomar la primera entrada en ese conjunto.

+0

Pensé que no había forma de obtener elementos por clase, aparte de iterar sobre ellos. Por lo tanto, mi suposición de que ': first' lo haría más rápido. ¿Realmente puede usar selectores de CSS con el método de selección del navegador? Realmente necesito leer sobre JS. – Znarkus

+0

@Znarkus - yup, algunos métodos nativos han aparecido en los últimos años, algo impulsados ​​por estos marcos basados ​​en selector :) Y para ': primero' ... cuando lo piensas, tiene que ejecutarse * último * de todos modos, dado que jQuery (o Sizzle más bien) necesita aplicar todos los demás selectores para filtrar los elementos primero, * luego * elige el primero (a través de un filtro de posición dentro de Sizzle). –

+0

Cool, gracias por el enlace! – Znarkus

2

En todo caso, analizar y ejecutar el filtro en el :first debería hacerlo más lento. Si usted está buscando un solo elemento, hacer:

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

De esta manera se puede limitar el alcance de la búsqueda a context y acaba de tomar hacia fuera el artículo único (o no) usando .eq(0).