Estoy usando jQuery v.1.7.1 donde el método .live () aparentemente está en desuso.
El problema que tengo es que al cargar dinámicamente html en un elemento usando:
$('#parent').load("http://...");
Si intento agregar un evento de clic luego, no registra el evento usando ninguno de estos métodos:
$('#parent').click(function() ...);
o
// according to documentation this should be used instead of .live()
$('#child').on('click', function() ...);
¿Cuál es la forma correcta de lograr esta funcionalidad? Solo parece funcionar con .live () para mí, pero no debería estar usando ese método. Tenga en cuenta que #child es un elemento cargado dinámicamente.
Gracias.
.live()
, te dice cómo reescribir los usos existentes de.live()
usar.delegate()
o.on()
(dependiendo de si estás en la versión 1.7+ o no). Sin embargo, tenga en cuenta que si agrega un controlador con.click()
"después" como menciona, es decir, después de cargar elementos dinámicamente, debería funcionar: el único problema es tratar de asignar.click()
antes de cargar elementos dinámicamente.Respuestas:
Si desea que el controlador de clics funcione para un elemento que se carga dinámicamente, configure el controlador de eventos en un objeto primario (que no se carga dinámicamente) y le da un selector que coincida con su objeto dinámico de esta manera:
El controlador de eventos se adjuntará al
#parent
objeto y cada vez que se genere un evento de clic que se originó en#child
él, activará su controlador de clic. Esto se denomina manejo de eventos delegados (el manejo de eventos se delega a un objeto primario).Se hace de esta manera porque puede adjuntar el evento al
#parent
objeto incluso cuando el#child
objeto aún no existe, pero cuando luego exista y se haga clic en él, el evento de clic burbujeará hasta el#parent
objeto, verá que se originó#child
y Hay un controlador de eventos para hacer clic#child
y activar su evento.fuente
live()
vs.on()
pero esta noche decidí una vez más a tratar, y su explicación de inmediato reveló lo que había estado perdiendo todo el tiempo. ¡Gracias!mouseenter
y losmouseleave
eventos y prueba dentro del manejador de los cuales uno fue provocado. El pseudo evento "hover" de jQuery no está disponible con delegación.Prueba esto:
De la
$.on()
documentación:Su
#child
elemento no existe cuando lo llama$.on()
, por lo que el evento no está vinculado (a diferencia$.live()
).#parent
Sin embargo, sí existen, por lo que la unión del evento a que está muy bien.El segundo argumento en mi código anterior actúa como un 'filtro' para disparar solo si el evento burbujeó
#parent
desde#child
.fuente
.load()
método, no desde el código después del.load()
método.#child
solo se sabe que se carga cuando el controlador de éxito se ejecuta realmente y no antes.$(document).on('click', '.selector', function() { /* do stuff */ });
EDITAR: Estoy proporcionando un poco más de información sobre cómo funciona esto, porque ... palabras. Con este ejemplo, está colocando un oyente en todo el documento.
Cuando
click
coincide con cualquier elemento (s).selector
, el evento aparece en el documento principal, siempre que no haya otros oyentes que llamenevent.stopPropagation()
método, lo que aumentaría el burbujeo de un evento a los elementos principales.En lugar de vincularse a un elemento específico o conjunto de elementos, está escuchando cualquier evento que provenga de elementos que coincidan con el selector especificado. Esto significa que puede crear un oyente, una vez, que coincida automáticamente con los elementos existentes actualmente, así como con cualquier elemento agregado dinámicamente.
Esto es inteligente por varias razones, incluido el rendimiento y la utilización de la memoria (en aplicaciones a gran escala)
EDITAR:
Obviamente, el elemento padre más cercano en el que puede escuchar es mejor, y puede usar cualquier elemento en lugar de
document
siempre que los niños para los que desea monitorear eventos estén dentro de ese elemento padre ... pero eso realmente no tiene nada que ver con la preguntafuente
$(element).on(...)
. Esto es$(document).on(...,element,...)
. Diferentes bestiasEl equivalente de .live () en 1.7 se ve así:
Básicamente, mire el documento para ver los eventos de clic y filtrelos para #child.
fuente
.live()
hace)..live()
está en desuso ahora es porque es malo poner todos los controladores de eventos en vivo en el objeto del documento. Las cosas pueden realmente, realmente desacelerarse. No solo los eventos tienen que burbujear hasta el documento, sino que también puede tener muchos controladores de eventos para revisar en el objeto del documento. La principal ventaja de esto.on()
es que puede adjuntarlo a un objeto principal que esté mucho más cerca del objeto real y mejorar drásticamente el rendimiento. Entonces ... NO recomendaría usar.on()
con el objeto de documento. Mucho mejor elegir un objeto padre más cercano..live()
enfoque; Sin embargo, la capacidad de controlar la delegación es ciertamente ventajosa.Sé que es un poco tarde para una respuesta, pero he creado un polyfill para el método .live (). Lo he probado en jQuery 1.11, y parece funcionar bastante bien. Sé que se supone que debemos implementar el método .on () siempre que sea posible, pero en grandes proyectos, donde no es posible convertir todas las llamadas .live () a las llamadas equivalentes .on () por cualquier razón, lo siguiente podría trabajo:
Simplemente inclúyalo después de cargar jQuery y antes de llamar a live ().
fuente
.on () es para jQuery versión 1.7 y superior. Si tiene una versión anterior, use esto:
fuente
.delegate()
funciona mucho mejor.live()
que por lo que jQuery doc lo recomienda y lo desprecia.live()
. Sí,.live()
todavía funciona, pero las respuestas aquí en SO deberían recomendar la mejor manera de hacer las cosas. Lo he visto 20 veces aquí en SO. Si publica el código.live()
aquí en SO, será rechazado (por lo general no por mí, a menos que haya algo más mal)..live()
definitivamente funciona incluso en la versión 1.7, aún debería usarlo.delegate()
o.on()
porque.live()
fue desaprobado por una buena razón. Siempre y cuando note el cambio en la sintaxis para las dos funciones más nuevas, ambas funcionarán bien.Usé 'live' en mi proyecto, pero uno de mis amigos sugirió que debería usar 'on' en lugar de live. Y cuando intenté usar eso, experimenté un problema como el que tú tenías.
En mis páginas creo filas de tablas de botones y muchas cosas de dom de forma dinámica. pero cuando uso en la magia desapareció.
Las otras soluciones como usarlo como un niño solo llaman a sus funciones cada vez que hace clic. Pero encuentro una manera de hacer que vuelva a suceder y aquí está la solución.
Escribe tu código como:
Llamar a la persona que llama (); después de crear su objeto en la página de esta manera.
De esta forma, se llama a su función cuando se supone que no debe hacer cada clic en la página.
fuente