2008-11-30 5 views
6

jQuery selectores son maravillosos, pero a veces me encuentro tipeando una y otra vez, y se pone un poco molesto.¿Siempre usa selectores de jquery o los almacena en caché en variables?

$('#mybutton').click(function() { 
    $('#message-box').doSomething(); 
    $('#message-box').doSomethingElse(); 
    $('#message-box').attr('something', 'something'); 
}); 

Muy a menudo me gusta para almacenar en caché los objetos de mi en las variables:

$('#mybutton').click(function() { 
    var msg = $('#message-box'); 
    msg.doSomething(); 
    msg.doSomethingElse(); 
    // you get the idea 
}); 

¿Hay pros o contras entre estos dos modelos? A veces se siente como crear las variables es trabajo extra, pero a veces me ahorra un montón de mecanografía. ¿Hay algún problema de memoria del que tenga que preocuparse? ¿Los selectores se limpian bien después de ser utilizados, mientras que mis malos hábitos de codificación tienden a mantener los vars en la memoria más tiempo?

Esto no me mantiene despierto por la noche, pero tengo curiosidad. Gracias.

EDITAR: Consulte this question. En esencia, pregunta lo mismo, pero me gusta la respuesta mejor.

Respuesta

14

Usted debe ellas cadena:

$('#mybutton').click(function() { 
    $('#message-box').doSomething().doSomethingElse().attr('something', 'something'); 
}); 

Si necesita hacer algo una y otra vez y las funciones no devuelven el objeto jQuery guardándolos en una var es más rápido.

+0

Eso definitivamente parece ser el camino jQuery para hacerlo. – ayaz

+0

especialmente guardarlos en una var y eliminarlos después de su uso permite que el uso de ram disminuya un poco, ya que $ ('selector') siempre crea un nuevo objeto ... – Guntram

2

Digo que lo hagas!

Hago lo mismo que usted.

Hace que mi código sea más legible, lo que me hace feliz.

3

Normalmente los encadenar según la respuesta de Pims, sin embargo a veces, cuando hay muchas operaciones por hacer a la vez, el encadenamiento puede causar problemas de legibilidad. En esos casos, guardo en caché los objetos jQuery seleccionados en una variable.

0

En realidad, la pregunta es mucho más compleja.

  1. Chaining no siempre es posible, porque las cadenas de selector o instancias selector jQuery en caché pueden ser almacenados en nueva función() propiedades, se accede por varias funciones de prototipo, no la única pieza de código.

  2. Puede encadenar cadenas de selector y selectores jQuery en caché. Supongo que usar cadenas de selector como 'this' propiedades debería traer código más lento pero menos consumo de RAM, mientras que el uso de selectores en caché debería traer más rápido aún más código que consume RAM. ¿Estoy en lo cierto?

estoy a punto de cambiar mucho de la nueva función() inmuebles de cuerdas selector para selectores en caché, es por eso que estoy pidiendo.

0

Pim Jager es 100% correcto para esta situación específica, pero podría ser útil señalar que hay situaciones en las que el almacenamiento en caché es más apropiado.

En primer lugar, cada vez que llame $ ('algo') está volviendo a crear una instancia de un objeto jQuery completo, por lo que se necesita encadenar o almacenar cada vez que vaya a realizar más de una acción en un objeto jQuery.

Si todo lo que vas a hacer en un cierre es actuar sobre el objeto, encadenar es tu amigo y el código de Pim Jager es perfecto.Pero si va a evaluar una parte de ese objeto, no podrá encadenar esas acciones y el almacenamiento en caché, como lo muestra el segundo bloque de código del póster original, es realmente el camino a seguir. Por ejemplo:

$('#mybutton').click(function() { 
    var msg = $('#message-box'); 
    msg.doSomething(); 
    if (msg.hasClass('.something')) { 
     msg.dosomethingElse(); 
    } 
}); 

recurso interesante: http://jsperf.com/jquery-chaining-vs-caching

Cuestiones relacionadas