2012-04-07 8 views
14

¿Se recomienda que, cuando necesito acceder al resultado de un selector de jQuery más de una vez en el alcance de una función, ejecuto el selector una vez y lo asigno a una variable local?Rendimiento de los selectores de jQuery frente a las variables locales

Perdona mi ejemplo trillado aquí, pero creo que ilustra la pregunta. Por lo tanto, este código se realice más rápido:

var execute = function(){ 
    var element = $('.myElement'); 
    element.css('color','green'); 
    element.attr('title','My Element'); 
    element.click(function(){ 
     console.log('clicked'); 
    }); 
} 

de este código:

var execute = function(){ 
    $('.myElement').css('color','green'); 
    $('.myElement').attr('title','My Element'); 
    $('.myElement').click(function(){ 
     console.log('clicked'); 
    }); 
} 

Si no hay diferencia, ¿Puede alguien explicar por qué? ¿JQuery guarda en caché los elementos después de seleccionarlos para que los selectores posteriores no tengan que molestarse en buscar el dom nuevamente?

+0

Gracias a todos por sus respuestas, me gustaría poder aceptarlas todas – KodeKreachor

Respuesta

18

Reutilizando la referencia de selección, el primer caso, es definitivamente más rápido. Aquí está una prueba que hice como prueba:

http://jsperf.com/caching-jquery-selectors

El último caso, la redefinición de los selectores, se reporta como ~ 35% más lento.

+0

Prueba genial, muy agradable, pero estoy confundido ... ¿la barra roja representa el ejemplo de la "variable local", como lo dice la etiqueta? Parece que eso tomó más tiempo? – KodeKreachor

+0

Sí, el rojo es la variable local. Es un poco confuso, más tiempo es mejor en el gráfico. Representa cuántas operaciones se podrían ejecutar por segundo. – weotch

+0

Gracias por presentarme a ese sitio. ¡Es fantástico! – tsherif

3

Almacenar la referencia en una variable local será más rápido que ejecutar el código de selección cada vez. Es simplemente una cuestión de no tener que ejecutar CUALQUIER código para encontrar el elemento apropiado cuando lo almacena en una variable. Mi regla de oro es almacenar los resultados de la búsqueda jQuery en una variable si voy a usarlo más de una vez.

1

Otra opción es utilizar un each en vez de repetir el selector, y que está asociado el trabajo, una y otra vez

var execute = function(){ 
    $('.myElement').each(function() { 
     var elem = $(this); 
     elem.css('color','green'); 
     elem.attr('title','My Element'); 
     elem.click(function(){ 
     console.log('clicked'); 
     }); 
    }); 
} 
+1

Si está interesado en el rendimiento, reasignando repetidamente la memoria para objetos y realizando llamadas a funciones innecesarias (concedidas, son bastante rápidas) haciendo ' $ (esto) 'una y otra vez para el mismo elemento es menos que ideal. –

+1

* "La diferencia está en la función' attr'. Si la aplica a una colección, solo afecta al primer elemento de la colección. "* No, eso solo es cierto en * get *. En * set *, lo establece para todos ellos: http://api.jquery.com/attr/#attr2 –

+0

@ T.J.Crowder my bad, no miré la firma del método para el que estaba leyendo los documentos. – tvanfosson

8

No se olvide de éste:

var execute = function(){ 
    $('.myElement') 
     .css('color','green') 
     .attr('title','My Element') 
     .click(function(){ 
      console.log('clicked'); 
     }); 
} 
+0

@weotch Genial. No fui lo suficientemente rápido como para cancelar mi respuesta idéntica ... Pero es genial saber con certeza que esta es una opción. ¿Podría añadir esto a su prueba de velocidad? –

+1

+1. Esta es la solución que jQuery habría imaginado ya que la mayoría de sus ejemplos tienden a encadenar llamadas de esta manera. Tal vez no sea más rápido que guardar en variables locales, pero ciertamente es más rápido que las selecciones múltiples y yo diría que es más elegante. – Neil

+2

Agregó esa prueba. ¡Parece atado para el primero! – weotch

0

En realidad estás olvidando el verdadero enfoque en caché.

Lo que ocurre con jQuery es que la búsqueda inicial: $('.selector') es costosa. Pero después de eso, encadenar tus acciones en él o asignarlo a una variable y ejecutar tus acciones sobre la variable no importa demasiado. La ganancia de rendimiento principal que puede obtener es almacenar en caché el elemento aún más, y no asignar el selector jQuery a cada iteración de su llamada de función.

var element = $('.myElement'); 
var execute = function(){ 
    element.css('color','green'); 
    element.attr('title','My Element'); 
    element.click(function(){ 
     console.log('clicked'); 
    }); 
} 

Este enfoque es casi dos veces más rápido que la versión más rápida de los otros enfoques sugeridos.

Ver http://jsperf.com/caching-jquery-selectors/17

Nota: Si cambia de DOM durante su vida útil, se puede actualizar la variable con el element una selección fresca de elementos.

Cuestiones relacionadas