2012-07-02 22 views
13

Estoy acostumbrado a usar .click() y delegate('click'), así que cuando leí ambos quedaron obsoletos en las versiones recientes de jQuery, pensé que Lo leí, pero estoy rascándome la cabeza un poco.jQuery .on ('clic') vs. .click() y .delegate ('clic')

La documentación here parece sugerir que esta es una gota en el reemplazo para .live() y .delegate(), pero .click() y .bind() tenido un comportamiento diferente, a saber vinculantes a los objetos existentes en la actualidad, donde los otros ligados a los objetos que coinciden con el selector patrón a lo largo de la vida útil del DOM.

En la mayoría de los casos, esto no supondría una gran diferencia, pero al agregar dinámicamente elementos a su DOM, esta es una distinción importante. Los objetos nuevos que coincidan con el patrón anterior serían no tienen oyentes vinculados al evento click usando .click(), pero serían con .delegate().

Mi pregunta es, ¿cómo se usa el método .on() para duplicar el comportamiento tanto del .delegate() preexistente como del .bind()? ¿O todo va en el futuro hacia el estilo .delegate()?

+0

Lea la [documentación] (http://api.jquery.com/click/) para 'click() '. ** No está en desuso. ** _ "... este método es ** acceso directo ** para ...' .on ("click", handler) 'a partir de jQuery 1.7." _ – Sparky

+0

... ok, permítanme reformular: se reutiliza. Solía ​​ser un atajo para '.bind()', y ahora no lo es. –

+0

Ahora es un atajo para '.on()', que ha reemplazado a '.bind()' para enlazar eventos a elementos existentes. También se sustituye '.delegate()' para la delegación de eventos en elementos estáticos (sin documentos) y '.live()' para la delegación de eventos en todo el documento. –

Respuesta

32

Ambos modos todavía son compatibles.

La siguiente llamada a bind():

$(".foo").bind("click", function() { 
    // ... 
}); 

Se puede convertir directamente en la siguiente llamada a on():

$(".foo").on("click", function() { 
    // ... 
}); 

Y la siguiente llamada a delegate():

$("#ancestor").delegate(".foo", "click", function() { 
    // ... 
}); 

puede ser convertido en el siguiente ing llamada a on():

$("#ancestor").on("click", ".foo", function() { 
    // ... 
}); 

Para completar, la siguiente llamada a live():

$(".foo").live("click", function() { 
    // ... 
}); 

se puede convertir en la siguiente llamada a on():

$(document).on("click", ".foo", function() { 
    // ... 
}); 
+0

Excelente. Esto es lo que sospechaba, pero la documentación no estaba clara para mí. Gracias. –

+4

Curiosamente, parece que el delegado es mucho más rápido que los demás: http: // jsperf.com/on-vs-bind-vs-delegate-vs-native, actualice con deleted on(), tan rápido como delegate ... – Simon

+0

Con 'delegate()' Si elimino el elemento ".foo" y luego vuelvo a agregar ".foo" el enlace inicial persiste. con 'on()' este comportamiento es el mismo? Estoy probando jquery 2.2.4 y parece eliminar el enlace. – ontananza

2

Puede deducir el uso de los alias del código fuente.

console.log($.fn.delegate); 
function (a, b, c, d) { 
    return this.on(b, a, c, d); 
} 

console.log($.fn.bind); 
function (a, b, c) { 
    return this.on(a, null, b, c); 
} 

El documentation también proporciona los ejemplos de uso:

$(elements).delegate(selector, events, data, handler); // jQuery 1.4.3+ 
$(elements).on(events, selector, data, handler);  // jQuery 1.7+ 
4

El método on puede reemplazar ambos bind y delegate dependiendo de cómo se usa (y también click como bind puede reemplazar eso):

.click(handler) == .on('click', handler) 

.bind('click', handler) == .on('click', handler) 

.delegate('click', '#id', handler) == .on('click', '#id', handler) 

Ni el click, delegate o bind métodos han llegado a la deprecated page todavía. Dudo que el método click lo haga.