En jQuery v1.7 , on
se agregó un nuevo método . De la documentación:
'El método .on () adjunta controladores de eventos al conjunto de elementos actualmente seleccionado en el objeto jQuery. A partir de jQuery 1.7, el método .on () proporciona toda la funcionalidad necesaria para adjuntar controladores de eventos '.
¿Cuál es la diferencia con live
y bind
?
Respuestas:
on()
es un intento de fusionar la mayoría de las funciones de enlace de eventos de jQuery en una sola. Esto tiene la ventaja añadida de poner en orden las ineficiencias conlive
vsdelegate
. En futuras versiones de jQuery, estos métodos serán eliminados y solamenteon
yone
serán dejados.Ejemplos:
Internamente, jQuery asigna todos estos métodos y configuradores de controladores de eventos abreviados al
on()
método, lo que indica que debe ignorar estos métodos de ahora en adelante y simplemente usaron
:Ver https://github.com/jquery/jquery/blob/1.7/src/event.js#L965 .
fuente
$(document.body).delegate("click", ".mySelector", fn);
debería ser$(document.body).delegate(".mySelector", "click", fn);
on
está en la naturaleza muy cerca dedelegate
. Entonces, ¿por qué no usar delegado? Es porqueon
no viene solo. hayoff
, para desvincular un evento yone
crear un evento que se ejecutará solo una vez. Este es el "paquete" de un nuevo evento.El problema principal
live
es que se adhiere a la "ventana", forzando un evento de clic (u otro evento) en un elemento en el interior de la estructura de la página (dom), para "subir" a la parte superior de la página para encontrar un evento controlador dispuesto a lidiar con eso. En cada nivel, todos los controladores de eventos deben verificarse, esto puede sumar rápidamente, si realiza una imbricación profunda (<body><div><div><div><div><table><table><tbody><tr><td><div><div><div><ul><li><button> etc etc etc...
)Entonces,
bind
comoclick
, como otras carpetas de eventos de acceso directo, se adjuntan directamente al destino del evento. Si tiene una tabla de, digamos, 1000 líneas y 100 columnas, y cada una de las 100'000 celdas incluye una casilla de verificación en la que desea hacer clic. Adjuntar 100.000 controladores de eventos llevará mucho tiempo en la carga de la página. Crear un solo evento a nivel de tabla y usar la delegación de eventos es más eficiente en varios órdenes de magnitud. El objetivo del evento se recuperará en el momento de la ejecución del evento. "this
" será la tabla, pero "event.target
" será su habitual "this
" en unaclick
función. Ahora lo buenoon
es que "this
" siempre será el destino del evento, y no el contenedor al que está conectado.fuente
con el
.on
método es posible hacerlo.live
,.delegate
y.bind
con la misma función pero con.live()
solo.live()
es posible (delegar eventos al documento).jQuery("#example").bind( "click", fn )
=jQuery( "#example").on( "click", fn );
jQuery("#example").delegate( ".examples", "click", fn )
=jQuery( "#example" ).on( "click", ".examples", fn )
jQuery("#example").live( fn )
=jQuery( document ).on( "click", "#example", fn )
Puedo confirmar esto directamente desde la fuente jQuery:
jQuery (this.context)?
this.context
===document
en la mayoría de los casosfuente
(Mi oración de apertura tenía más sentido antes de que cambiaras la pregunta. Originalmente habías dicho "¿Cuál es la diferencia
live
?")on
es más parecidodelegate
a lo que eslive
, es básicamente una forma unificada debind
ydelegate
(de hecho, el equipo dijo que su propósito es "... unificar todas las formas de adjuntar eventos a un documento ..." ).live
está básicamenteon
(odelegate
) adjunto al documento en su conjunto. Está en desuso a partir de v1.7 a favor de usaron
odelegate
. En el futuro, sospecho que veremos el código usandoon
únicamente, en lugar de usarbind
odelegate
(olive
) ...Entonces, en la práctica, puedes:
Usar
on
comobind
:Use
on
likedelegate
(delegación de evento enraizada en un elemento dado):Use
on
likelive
(delegación de evento enraizada en el documento):fuente
on
es una combinación debind
ydelegate
, como dije, no me gusta mucholive
. Puede usaron
likebind
(adjuntar un controlador directamente a un elemento), o puede usaron
likedelegate
(adjuntar un controlador a un elemento, pero dispare el evento solo si el elemento real al hacer clic coincide con un selector, y como si ese elemento fuera el que el el evento ocurrió en, por ejemplo, delegación de evento), o puede usarlo comolive
(delegate
usando el documento como raíz). Es la delegación de eventos lo que lo hace útil si agrega elementos dinámicamente.$("#id", ".class").live(fn)
=$(".class").delegate("#id", fn );
En realidad, en la antigua fuente jQuery usaban live como el caso general y delegar como un caso especial, lo que hizo que esto fuera aún más confuso cuando lo piensas.delegate
rápidamente, pero aún así. :-)live es el acceso directo para .on () ahora
También esta publicación puede ser útil para usted http://blog.jquery.com/2011/11/03/jquery-1-7-released/
fuente
No hay uno para el caso de uso básico. Estas dos líneas son funcionalmente iguales.
.on () también puede hacer delegación de eventos, y es preferible.
.bind () es en realidad solo un alias para .on () ahora. Aquí está la definición de la función de enlace en 1.7.1
La idea para agregar .on () era crear una API de evento unificada, en lugar de tener múltiples funciones para el evento de enlace; .on () reemplaza .bind (), .live () y .delegate ().
fuente
Algo que debe tener en cuenta si desea obtener los controladores de eventos asociados con el elemento: ¡preste atención a qué elemento estaba conectado el controlador!
Por ejemplo, si usa:
obtendrá los controladores de eventos usando:
Pero si usas:
obtendrá los controladores de eventos usando:
(en el último caso, el objeto de evento relevante tendrá selector = ". mySelector")
fuente
events
está indocumentado de todos modos y creo que ya no funciona en 1.9