Actualización 2:
En resumen algunos otros comentarios aquí. La respuesta es depende.
jQuery's selector engine Sizzle evalúa el selector de la misma manera que CSS lo hace: from right to left. Entonces, en general, es mejor ser muy específico en el lado derecho y menos específico en el lado izquierdo.
Pero también depende de la estructura del HTML y de qué tan dispersos estén los elementos que desee encontrar.
Así que si usted tiene
a
|
...
|
b
-----------------
| |
d d d c c c c c c c c c c c c c c c c c c c
luego de ser más específico es más rápido $('a b > c')
, debido a que están reduciendo el elemento establecer temprano con b > c
y no tiene que comprobar la herencia a
para cada c
.
Mientras que si usted tiene
a
|
...
|
b
-----------------
| |
e e e e e e e e d d c c c c c c e e e e e e
continuación $('a c')
sería más rápido, ya que el selector es más simple y prueba de c
por ser un hijo de b
es redundante en este caso (por supuesto, usted podría incluso hacer $('c')
).
Respuesta original:
Sin importar cuál de ellos es más rápido, si tiene que acceder a un elemento de una y otra vez, tienda de una referencia a él:
var $element = $('#myId .someElement');
$('some other selector').each(function() {
// access $element here
});
The first selector seems to be a bit faster (en Chrome 8).
En los navegadores más nuevos (que admiten querySelectorAll
), la diferencia probablemente no es tan grande como en los navegadores que no la admiten.
Actualización:
Creo que depende sobre todo de la cantidad de métodos incorporados jQuery puede utilizar.Así que asumiendo querySelector*
no está disponible, el primer selector puede ser traducido a
document.getElementById('myId')[0].getElementsByClassName('someElement')
Para el segundo selector, jQuery tendría que comprobar, además, si un elemento es de hecho un niño o no. Es decir. hay más procesamiento involucrado.
¡No esperaba este resultado, definitivamente esta es la respuesta correcta! Gracias – Michael
@Michael: De nada, y por favor no marque * directamente el botón de respuesta cuando su pregunta esté activa, especialmente cuando personas como @Felix participan ;-) – ifaour
: D Esto lo tomo como un cumplido :) Por cierto. resultados interesantes Pensé que '$ ('# myId .someElement')' sería más rápido en cualquier caso, ya que se puede traducir directamente a 'querySelectorAll ('$ myId .someElement')', pero parece que '$ ('# myId') .find ('. someElement') 'es mucho más rápido. Guau. –