2012-07-16 13 views
36

¿Cuál es la diferencia entre:.

$(this.el).html 

y

this.$el.html 

Leyendo algunos ejemplos columna vertebral y algunos hazlo de una manera u otra de otra manera.

+0

Compruebe la [documentación Backbone en el y $ el] (http://backbonejs.org/#View-el) – MrOBrian

Respuesta

53

contiene un elemento con jQuery (o Zepto). Por lo tanto, si su vista HTML era la siguiente:

<div id="myViewElement"></div>

... y this.el referenciado que div, entonces $(this.el) sería el equivalente de recuperar directamente a través de jQuery: $('#myViewElement').

this.$el es una referencia en caché del objeto jQuery (o Zepto), por lo que una copia de lo que obtendrías al llamar al $(this.el). La intención es evitarle la necesidad de llamar al $(this.el), lo que puede tener algunos gastos generales y, por lo tanto, problemas de rendimiento.

Tenga en cuenta: los dos NO son equivalentes. this.el solo es una referencia a un objeto host HTMLElement - no hay bibliotecas involucradas. Este es el resultado de document.getElementById. $(this.el) crea una nueva instancia del objeto jQuery/Zepto. this.$el hace referencia a una sola instancia del objeto anterior. No es "incorrecto" utilizar ninguno de ellos, siempre que comprenda los costos de varias llamadas al $(this.el).

En código:

this.ele = document.getElementById('myViewElement'); 
this.$ele = $('#myViewElement'); 

$('#myViewElement') == $(this.ele); 

Además, es importante mencionar que jQuery y Zepto tienen cachés internos parciales, llamadas así adicionales para $(this.el)podría terminar de devolver un resultado almacenado en caché de todos modos, y es por eso que digo "puede tener problemas de rendimiento". También puede que no.

Documentación

+2

Votación hacia arriba para señalar que los dos son realmente diferentes. Ambos hacen referencia a objetos que a su vez hacen referencia al mismo elemento DOM subyacente, y ambos son objetos jQuery, pero son copias de dos objetos jQuery diferentes. Es una diferencia sutil, pero sin embargo, una diferencia. Realmente no veo ningún punto al usar la versión '$ (this.el)', mientras que reutilizar la otra versión es más eficiente. – robmisio

2

Si $el existe en this y es un objeto jQuery, no se debe utilizar $(this.el) porque estaría iniciando un nuevo objeto jQuery cuando ya existe.

+1

buen punto, y eso sería excesivo, pero ganó ' duele –

0

Al envolver un elemento en $() se añaden las extensiones de jQuery al prototipo del objeto. Una vez hecho esto, no es necesario volver a hacerlo, aunque no hay ningún daño que no sea el rendimiento al hacerlo varias veces.

1

suelo ver esto:

var markup = $(this).html(); 
$(this).html('<strong>whoo hoo</strong>'); 

Estoy de acuerdo con Raminon. Tus ejemplos que has visto se ven mal.

Este código se ve típicamente dentro de un bucle jquery, como cada uno() o un controlador de eventos. Dentro del ciclo, la variable 'el' apuntará al elemento puro, no a un objeto jQuery. Lo mismo es válido para 'esto' dentro de un controlador de eventos.

Cuando vea lo siguiente: $ (el) o $ (this), el autor obtiene una referencia de jQuery al objeto dom.

He aquí un ejemplo que acabo de utilizar para convertir los números romanos a numerials: (Nota, yo siempre uso de jQuery en lugar de $ - demasiadas colisiones con mootools ...)

jQuery(document).ready(function(){ 
    jQuery('.rom_num').each(function(idx,el){ 
     var span = jQuery(el); 
     span.html(toRoman(span.text())); 
    }); 
}); 
+0

Perderás los dedos un día escribiendo * jQuery * una y otra vez y preocupándote por las colisiones. simplemente haz: '(function ($) {/ * tus códigos jQuery aquí con '$' * /} a prueba de balas (jQuery);'. –

+1

(¿o dejar de usar jQuery para cosas que no necesitan jQuery?) –

+1

Meh. Tengo otras razones para usar en exceso jQuery y para tipearlo. Lo sobreutilizo porque tiene un gran rendimiento multiplataforma. En cuanto a escribirlo, bueno, algún día compraré dedos biónicos, como los que usan los Ghost in the Shell. Tenemos miles de comerciantes. Me ocupo del código de otras personas todo el día. Pequeños pequeños fragmentos.Cuando tengo que proporcionar código para docenas de sitios al día, y en pequeños fragmentos, me alegra que deletree jQuery cada vez. Y finalmente, creo que se lee más rápido deletreado. Pero a cada uno lo suyo. –

6

los dos son esencialmente * equivalente, con $el siendo cached version de los objetos jQuery o Zepto el, la razón por la que ve ejemplos usando $(this.el) es porque solo se agregó en un release posterior de backbone.js (0.9.0).

* técnicamente como Chris Baker puntos sobre $(this.el) (probablemente) crear un nuevo objeto jQuery/Zepto cada vez que la llame, mientras this.$el hará referencia a la misma cada vez.

Cuestiones relacionadas