Ver Mensaje Individual
  #10 (permalink)  
Antiguo 23/12/2010, 22:35
Dany_s
 
Fecha de Ingreso: diciembre-2009
Ubicación: Misiones
Mensajes: 867
Antigüedad: 10 años, 1 mes
Puntos: 65
Respuesta: JQUERY - Live provoca memory leaks?

Cita:
12 li con live asignarias 12 event handlers
1 nomás que delega a la raiz del documento pero en la versión 1.4 se le puede indicar un contexto delegate.



Cita:
no entiendo la diferencia entre delegate y live
Es sutíl y confusa pero con el fireQuery lo podés ver. Hace una cosa para ver estos ejemplo, bajate el plugin firebug y el firequery para ver a que elementos se le asigna eventos y de que tipo. Eso lo hice yo para ver que cosa hace porque tampoco encontré material en español y no entiendo inglés je

Entonces te muestro esto con el evento click:
Código HTML:
Ver original
  1. <html><head><script src="jquery.js"></script></head>
  2.     <ul>
  3.         <li>Uno</li>
  4.         <li>Dos</li>
  5.         <li>Tres</li>
  6.         <li>Cuatro</li>
  7.         <li>Cinco</li>
  8.     </ul>
  9.  
  10.     $('li').click( function(){
  11.         $(this).parent().append("<li>Li nuevo</li>");
  12.     });
  13.  
  14. </body>
  15. </html>
Fijate en la solapa html (del firebug) que cada li tiene un evento click.


Ahora lo mismo pero con delegate:
Código HTML:
Ver original
  1. <html><head><script src="jquery.js"></script>
  2.     <ul>
  3.         <li>Uno</li>
  4.         <li>Dos</li>
  5.         <li>Tres</li>
  6.         <li>Cuatro</li>
  7.         <li>Cinco</li>
  8.     </ul>
  9.  
  10.     $("ul").delegate("li", "click", function(){
  11.         $(this).remove();
  12.     });
  13.  
  14. </body>
  15. </html>
Si miras el html ves que se le asigna un evento al ul, en realidad parece que son los li quien tiene los eventos pero se le delega al 'ul' como se le indicó y es ahi donde se ve si se hizo click en el selector que indicaste que puede ser un li con alguna clase o id o que contenga algún elemento etc

Con el evento click con pocos elementos no pasa nada pero si hay miles tiene que ir uno por uno para asignarle un evento pero con delegate no porque le asigna a un elemento pero este tiene que ver en que elemento se lanzó el evento y en el click no, asi que para uno o para lo otro cada uno tiene ventajas y desventajas jeje

Pero también está live
Live hace lo mismo que delegate (delegate usa a live) pero delegate mejora lo que hace live. Fijate en firequery ves que se le asigna un evento live

Por ejemplo
SI no le indicas un contxto lo hace en la raiz del documento, con esto no se ve que tiene asignado a los li ni al ul
Código HTML:
Ver original
  1. <html><head><script src="jquery.js"></script>
  2.     <ul>
  3.         <li>Uno</li>
  4.         <li>Dos</li>
  5.         <li>Tres</li>
  6.         <li>Cuatro</li>
  7.         <li>Cinco</li>
  8.     </ul>
  9.  
  10.     $('li').live('click', function(){
  11.         $(this).remove();
  12.     });
  13.  
  14. </body>
  15. </html>
Pero en la versión 1.4 se le puede indicar un contexto

entonce esto es lo mismo que con delegate
Código HTML:
Ver original
  1. <html><head><script src="jquery.js"></script>
  2.     <ul>
  3.         <li>Uno</li>
  4.         <li>Dos</li>
  5.         <li>Tres</li>
  6.         <li>Cuatro</li>
  7.         <li>Cinco</li>
  8.     </ul>
  9.  
  10.     $('li', $('ul')[0]).live('click', function(){
  11.         $(this).remove();
  12.     });
  13.  
  14. </body>
  15. </html>

pero que pasa si tenemos 2 listas, el anterior no va a funcionar porque le indicamos el primer ul como contexto

esto tampoco funciona para indicarle el contexto
Código Javascript:
Ver original
  1. $('li', 'ul').live('click', function(){
  2.         $(this).remove();
  3.     });

pero si esto
Código HTML:
Ver original
  1. <html><head><script src="jquery.js"></script>
  2.     <ul>
  3.         <li>Uno</li>
  4.         <li>Dos</li>
  5.         <li>Tres</li>
  6.         <li>Cuatro</li>
  7.         <li>Cinco</li>
  8.     </ul>
  9.     <ul>
  10.         <li>Uno2</li>
  11.         <li>Dos2</li>
  12.         <li>Tres2</li>
  13.         <li>Cuatro2</li>
  14.         <li>Cinco2</li>
  15.     </ul>
  16.  
  17.     $('ul').each( function(){
  18.         $('li', this).live('click', function(){
  19.             $(this).remove();
  20.         });
  21.     });
  22.  
  23. </body>
  24. </html>

que vendria a ser lo mismo que esto con delegate
Código HTML:
Ver original
  1. <html><head><script src="jquery.js"></script>
  2.     <ul>
  3.         <li>Uno</li>
  4.         <li>Dos</li>
  5.         <li>Tres</li>
  6.         <li>Cuatro</li>
  7.         <li>Cinco</li>
  8.     </ul>
  9.     <ul>
  10.         <li>Uno2</li>
  11.         <li>Dos2</li>
  12.         <li>Tres2</li>
  13.         <li>Cuatro2</li>
  14.         <li>Cinco2</li>
  15.     </ul>
  16.  
  17.     $("ul").delegate("li", "click", function(){
  18.         $(this).remove();
  19.     });
  20.  
  21. </body>
  22. </html>

Siempre en cada uno fijate con el firequery

Y también fijate las cantidad de llamadas y tiempo, lo podes ver usando la opción perfilar


ah y el encadenamiento no funciona con live
Código HTML:
Ver original
  1. <html><head><script src="jquery.js"></script>
  2.     <div>
  3.         <ul>
  4.             <li>Uno</li>
  5.             <li>Dos</li>
  6.             <li>Tres</li>
  7.             <li>Cuatro</li>
  8.             <li>Cinco</li>
  9.         </ul>
  10.     </div>
  11.  
  12.     $("div").children('ul').live('click', function(){
  13.         $(this).remove();
  14.     });
  15.  
  16. </body>
  17. </html>

pero con delegate si
Código HTML:
Ver original
  1. <html><head><script src="jquery.js"></script>
  2.     <div>
  3.         <ul>
  4.             <li>Uno</li>
  5.             <li>Dos</li>
  6.             <li>Tres</li>
  7.             <li>Cuatro</li>
  8.             <li>Cinco</li>
  9.         </ul>
  10.     </div>
  11.  
  12.     $("div").children('ul').delegate("li", "click", function(){
  13.         $(this).remove();
  14.     });
  15.  
  16. </body>
  17. </html>

Última edición por Dany_s; 23/12/2010 a las 22:48