2011-01-02 20 views
102

He leído algunas publicaciones aquí y en otras partes de la web sobre las diferencias entre live() y delegate(). Sin embargo, no he encontrado la respuesta que estoy buscando (si esto es un engaño, por favor dígame).Jquery live() vs delegate()

Sé que la diferencia entre live y delegate es que live no se puede utilizar en una cadena. También leí en algún lugar que delegate es en algunos casos más rápido (mejor rendimiento).

Mi pregunta es, ¿existe una situación en la que deba usar live en lugar de delegate?

ACTUALIZACIÓN

He configurado un simple test para ver la diferencia en el rendimiento.

También he añadido la nueva .on() que está disponible en jQuery 1.7+

Los resultados prácticamente resumir los problemas de rendimiento como se indica en las respuestas.

  • No utilice .live() a menos que su versión de jQuery no soporta .delegate().
  • No use .delegate() a menos que su versión de jQuery no sea compatible con .on().

La diferencia entre .live() y .delegate() es mucho más grande que entre delegate() y .on().

+0

alguna información aquí http://markupjavascript.blogspot.in/2013/10/bind-live-delegate- on-what-is-difference.html –

+0

Me tomé la libertad de resumir esta excelente publicación y otros comentarios útiles en un solo lugar, para mi propio registro y en caso de que alguien más lo encuentre útil. [** JQuery en vivo vs delegado vs enlace **] (http://www.timacheson.com/Blog/2011/oct/jquery_live_vs_delegate) – Tim

+0

A partir de la versión 1.7, '.live()' se ha ido. En su lugar, encontrará el nuevo método '.on()'. –

Respuesta

147

Nunca uso live; Considero que los beneficios de usar delegate son tan importantes que resultan abrumadores.

El único beneficio de live es que su sintaxis es muy similar a la de bind:

$('a.myClass').live('click', function() { ... }); 

delegate, sin embargo, utiliza una sintaxis un poco más detallado:

$('#containerElement').delegate('a.myClass', 'click', function() { ... }); 

Esto, sin embargo, me parece mucho más explícito sobre lo que realmente está sucediendo. No se da cuenta del ejemplo live de que los eventos se están capturando realmente en document; con delegate, está claro que la captura de eventos ocurre en #containerElement. Puede hacer lo mismo con live, pero la sintaxis se vuelve cada vez más horrible.

Especificar el contexto para la captura de eventos también mejora el rendimiento. Con el ejemplo live, cada clic en el documento completo debe compararse con el selector a.myClass para ver si coincide. Con delegate, eso es solo los elementos dentro de #containerElement. Obviamente, esto mejorará el rendimiento.

Por último, live requiere que su navegador busca a.myClasssi es o no existe en la actualidad. delegate solo busca los elementos cuando se desencadenan los eventos, lo que proporciona una mayor ventaja de rendimiento.


NB delegate utiliza live detrás de las escenas, por lo que se puede hacer cualquier cosa con live que se puede hacer con delegate. Mi respuesta se refiere a ellos ya que se usan comúnmente.

Tenga en cuenta también que ni live ni delegate es la mejor forma de hacer delegación de eventos en jQuery moderno. La nueva sintaxis (a partir de jQuery 1.7) es con la función on. La sintaxis es la siguiente:

$('#containerElement').on('click', 'a.myClass', function() { ... }); 
+4

+1. La reutilización de un selector anterior en 'live()' es confusa, lo que hace que el usuario no entienda lo que está haciendo realmente. 'delegate()' es más claro. Además, aunque 'delegate()' se implementa (actualmente) con 'live()', está usando una versión de cuatro argumentos de 'live()' que no está documentada, por lo que probablemente solo para uso interno. Personalmente, siempre evitaba 'live()' a menos que tuviera que ejecutar jQuery 1.3 por alguna razón (ojalá que no). – bobince

+4

@all: De los documentos de jQuery: 'A partir de jQuery 1.4, los eventos en vivo se pueden vincular a un elemento DOM" contexto "en lugar de a la raíz del documento predeterminado." No sería 'live()' mejor usar ahora desde podemos agregar el contexto del evento. Dado que 'delegate()' llama 'live()' internamente. Entonces creo que 1 llamada menos. ¿O estoy equivocado? – PeeHaa

+0

Gran respuesta. Realmente grandioso. Sin embargo, todavía prefiero en vivo. a menos que mi aplicación sea una gran aplicación js monstruosa, la simplicidad de la vida es mayor que la ganancia de rendimiento. Además, dado que usualmente usaré bind (o una de sus versiones más cortas), la cercanía es genial. Sigue siendo una gran respuesta. Me hizo actaully obtener la diferencia. +1. – frostymarvelous

3

dos situaciones vienen a la mente:

  1. Usted estaría utilizando delegate en el elemento body, por lo que a continuación, puedes utilizar live lugar, ya que es más sencillo.

  2. Debe utilizar una versión anterior de la biblioteca jQuery, donde el evento delegate aún no está implementado.

24

son exactamente los mismos, excepto:

  • .delegate() le permite optimizar la una sección local de la página, mientras que .live() debe procesar eventos en toda la página.
  • .live() se inicia con una selección DOM desperdiciado

Cuando se llama a .delegate(), que sólo se da la vuelta y llama .live(), pero pasa el extra contexto parámetro.

https://github.com/jquery/jquery/blob/master/src/event.js#L948-950

Como tal, siempre usaría .delegate().Si realmente necesita procesar todos los eventos en la página, simplemente dele el body como contexto.

$(document.body).delegate('.someClass', 'click', function() { 
    // run handler 
}); 

antiguas versiones de jQuery en realidad tienen delegate funcionalidad. Solo debe pasar un selector o elemento como propiedad de contexto al llamar al .live(). Por supuesto, debe estar cargado en la página.

$('.someClass', '#someContainer').live('click',function() { 
    // run handler 
}); 

Y tiene el mismo comportamiento que .delegate().

+3

No sé por qué esta respuesta no tiene más votos. '.delegate()' usa '.live()'. En cuanto a rendimiento, '.delegate()' claramente supera '.live()': http://stackoverflow.com/questions/2690370/live-vs-bind/7692651#7692651 –

+1

de acuerdo .live es mucho más lento. –

2

Considere este ejemplo

<ul id="items"> 
    <li> Click Me </li> 
</ul> 

$('#items').delegate('li', 'click', function() { 
    $(this).parent().append('<li>New Element</li>'); 
}); 

Con la aprobación de un elemento DOM como el contexto de nuestro selector, podemos hacer vivo() se comportan (casi) la misma manera que el delegado() hace. Afecta el manejador al contexto, no al documento, que es el contexto predeterminado. El código siguiente es equivalente a la versión de delegado() que se muestra arriba.

$("li", $("#items")[0]).live("click", function() { 
    $(this).parent().append("<li>New Element</li>"); 
}); 

Resource

Pero, es mejor que el uso delegado para un mejor rendimiento see here