2012-07-28 22 views
21

Esperaba $('#childDiv2 .txtClass') o $('#childDiv2 input.txtClass') funcionan mejor al seleccionar elemento <input type="text" id="txtID" class="txtClass"/>. Pero de acuerdo con esto performance analysis$('.txtClass'); es el mejor selector entre esto. Estoy usando JQuery 1.7.2 ¿Alguien tiene una explicación para esto?Jquery elemento + selector de clase rendimiento

Performance analysis for class selectors

HTML

<div class="childDiv2"> 
    <input type="text" id="txtID" class="txtClass"/> 
    <p class="child">Blah Blah Blah</p> 
</div>​ 

JS

$('.txtClass'); 
$('#childDiv2 .txtClass') 
$('#childDiv2 > .txtClass') 
$('input.txtClass') 
$('#childDiv2 input.txtClass') 
+0

Como los identificadores tienen que ser únicos, la forma más rápida sería '$ (" # txtID ")' – Andreas

+0

Mi preocupación es seleccionar por escenarios de clases? – Lanka

+0

Gran pregunta. No tengo la respuesta, pero es curioso ver que incluso dando un contexto $ ('. TxtClass', '# childDiv2') es aún más lento que el selector de clase. –

Respuesta

36

navegadores modernos exponen un método muy eficiente getElementsByClassName() que devuelve los elementos que tienen una clase dada. Es por eso que un solo selector de clase es más rápido en su caso.

dar más detalles sobre sus ejemplos:

$(".txtClass")     => getElementsByClassName() 

$("#childDiv2 .txtClass")  => getElementById(), 
            then getElementsByClassName() 

$("#childDiv2 > .txtClass")  => getElementById(), 
            then iterate over children and check class 

$("input.txtClass")    => getElementsByTagName(), 
            then iterate over results and check class 

$("#childDiv2 input.txtClass") => getElementById(), 
            then getElementsByTagName(), 
            then iterate over results and check class 

Como se puede ver, es bastante lógico para la primera forma de ser el más rápido en los navegadores modernos.

+0

Entonces, lo que puedo decir es que casi todos los tutoriales de rendimiento de jquery encontrados en la web son incorrectos. Incluso tutoriales de algunos chicos de jquery como [Addy Osmani] (http://addyosmani.com/jqprovenperformance/) – Lanka

+3

@Lanka, tal vez no * incorrecto *, solo * desactualizado *. La tecnología avanza y el mejor consejo de rendimiento hoy podría ser incorrecto el próximo año. Los puntos de referencia, por otro lado, le darán números actualizados. –

+0

Sí, eso es correcto. En realidad, estaba equivocado en mi comentario anterior. Ese tipo lo ha explicado en las diapositivas. – Lanka

5

Los selectores CSS se analizan de derecha a izquierda. Entonces su ejemplo

$('#childDiv2 .txtClass') 

tomará dos acciones para completar. Primero busca todos los elementos con la clase txtClass. A continuación, compruebe cada elemento para ser un elemento secundario del elemento con el id childDiv2.

$('.txtClass') 

Este selector solo realizará una acción. Encuentra todos los elementos con la clase txtClass

un vistazo a this article en css-tricks.com

+0

Como sé sizzle, optimiza esta consulta. Entonces, el trabajo es diferente a tu explicación. Primero, seleccione childDiv2 y luego busque txtClass en sus hijos. – Lanka

+0

en realidad, la primera línea de código que se muestra requiere revisar cada elemento .txtClass para ver si es un DESCENDENTE de # childDiv2. Eso requiere examinar TODOS los antepasados ​​de cada .txtClass. – ToolmakerSteve

1

parece que también depende de la densidad de los elementos con la clase entre los elementos del tipo.

Ejecuté las pruebas con la versión 30.0.1599.69 de Google Chrome usando JQuery 1.10.1. No dude en probarlo en otro navegador y/o utilizando otra versión de JQuery.

Me trataron de ejecutar las siguientes pruebas:

  1. Disperso (10% de los divs tiene la clase) link to the test on jsbin

  2. denso (el 90% de los divs tiene la clase) link to the test on jsbin

Parece que en los casos densodiv.class victorias, pero en el Caso disperso.class gana.

+0

Al igual que los comentarios que mencionan denso/disperso, esto a menudo se pasa por alto. No hay ninguna bala de plata aparte de usar una identificación si puedes. –