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
$('li').click( function(){
$(this).parent().append("
<li>Li nuevo
</li>");
});
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
$("ul").delegate("li", "click", function(){
$(this).remove();
});
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
$('li').live('click', function(){
$(this).remove();
});
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
$('li', $('ul')[0]).live('click', function(){
$(this).remove();
});
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$('li', 'ul').live('click', function(){
$(this).remove();
});
pero si esto
Código HTML:
Ver original
$('ul').each( function(){
$('li', this).live('click', function(){
$(this).remove();
});
});
que vendria a ser lo mismo que esto con delegate
Código HTML:
Ver original
$("ul").delegate("li", "click", function(){
$(this).remove();
});
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
$("div").children('ul').live('click', function(){
$(this).remove();
});
pero con delegate si
Código HTML:
Ver original
$("div").children('ul').delegate("li", "click", function(){
$(this).remove();
});