A partir de jQuery 1.7 debe usar jQuery.fn.on
:
$(staticAncestors).on(eventName, dynamicChild, function() {});
Antes de esto , el enfoque recomendado era usar live()
:
$(selector).live( eventName, function(){} );
Sin embargo, live()
fue desaprobado en 1.7 a favor on()
y eliminado por completo en 1.9. La live()
firma:
$(selector).live( eventName, function(){} );
... se puede reemplazar con la siguiente on()
firma:
$(document).on( eventName, selector, function(){} );
Por ejemplo, si su página estaba creando dinámicamente elementos con el nombre de la clase dosomething
, vincularía el evento a un padre que ya existe (este es el meollo del problema aquí, necesita algo que existe para vincularlo, no se enlace al contenido dinámico), esto puede ser (y la opción más fácil) es document
. Aunque tenga en cuenta que document
puede no ser la opción más eficiente .
$(document).on('mouseover mouseout', '.dosomething', function(){
// what you want to happen when mouseover and mouseout
// occurs on elements that match '.dosomething'
});
Cualquier padre que exista en el momento en que se vincula el evento está bien. Por ejemplo
$('.buttons').on('click', 'button', function(){
// do something here
});
se aplicaría a
<div class="buttons">
<!-- <button>s that are generated dynamically and added here -->
</div>
Hay una buena explicación en la documentación de
jQuery.fn.on
.En breve:
Por lo tanto, en el siguiente ejemplo
#dataTable tbody tr
debe existir antes de que se genere el código.Si se está inyectando HTML nuevo en la página, es preferible usar eventos delegados para adjuntar un controlador de eventos, como se describe a continuación.
Los eventos delegados tienen la ventaja de que pueden procesar eventos de elementos descendientes que se agregan al documento más adelante. Por ejemplo, si la tabla existe, pero las filas se agregan dinámicamente usando código, lo manejará lo siguiente:
Además de su capacidad para manejar eventos en elementos descendientes que aún no se han creado, otra ventaja de los eventos delegados es su potencial para una sobrecarga mucho menor cuando se deben monitorear muchos elementos. En una tabla de datos con 1,000 filas en su
tbody
, el primer ejemplo de código adjunta un controlador a 1,000 elementos.Un enfoque de eventos delegados (el segundo ejemplo de código) adjunta un controlador de eventos a un solo elemento
tbody
, y el evento solo necesita subir un nivel (desde el clictr
hastatbody
).Nota: Los eventos delegados no funcionan para SVG .
fuente
tr
a un selector apropiado, como'input[type=checkbox]'
, y esto se manejaría automáticamente para las filas recién insertadas?Esta es una solución de JavaScript pura sin bibliotecas ni complementos:
donde
hasClass
estaLive demo
El crédito va para Dave y Sime Vidas
Usando JS más moderno,
hasClass
se puede implementar como:fuente
Element.classList
no es compatible con los navegadores más antiguos. Por ejemplo, IE <9.Puede agregar eventos a los objetos cuando los cree. Si está agregando los mismos eventos a varios objetos en diferentes momentos, crear una función con nombre podría ser la mejor opción.
fuente
Simplemente puede envolver su llamada de enlace de evento en una función y luego invocarla dos veces: una vez en el documento listo y una vez después de su evento que agrega los nuevos elementos DOM. Si lo hace, querrá evitar vincular el mismo evento dos veces en los elementos existentes, por lo que deberá desvincular los eventos existentes o (mejor) solo vincular los elementos DOM que se acaban de crear. El código se vería así:
fuente
Intenta usar en
.live()
lugar de.bind()
; el.live()
se unirá.hover
a su casilla de verificación después de la solicitud se ejecuta Ajax.fuente
live()
fue desaprobado en la versión 1.7 a favoron
y eliminado en la versión 1.9.Enlace de eventos en elementos creados dinámicamente
Elemento único:
Elemento hijo:
Observe el agregado
*
. Se activará un evento para todos los elementos secundarios de ese elemento.Me he dado cuenta que:
Ya no funciona, pero funcionaba antes. He estado usando jQuery de Google CDN , pero no sé si lo cambiaron.
fuente
Puede usar el método live () para vincular elementos (incluso los recién creados) a eventos y controladores, como el evento onclick.
Aquí hay un código de muestra que he escrito, donde puedes ver cómo el método live () une los elementos elegidos, incluso los recién creados, a los eventos:
fuente
Prefiero usar el selector y lo aplico en el documento.
Esto se une al documento y será aplicable a los elementos que se mostrarán después de cargar la página.
Por ejemplo:
fuente
selector
variable, cuando debe contener una cadena o un objeto Element que puede pasar directamente a ese argumentoon()
Otra solución es agregar el oyente al crear el elemento. En lugar de poner al oyente en el cuerpo, pones al oyente en el elemento en el momento en que lo creas:
fuente
myElement.append('body');
debe sermyElement.appendTo('body');
. Por otro lado, si no hay necesidad de un mayor uso de la variablemyElement
, es más fácil y más corto de esta manera:$('body').append($('<button/>', { text: 'Go to Google!' }).bind( 'click', goToGoogle));
Intenta así:
fuente
Tome nota de la clase "PRINCIPAL" en la que se coloca el elemento, por ejemplo,
En el escenario anterior, el objeto PRINCIPAL que mirará jQuery es "contenedor".
A continuación, tendrá básicamente nombres de elementos dentro de un contenedor, como
ul
,li
yselect
:fuente
Esto se hace por delegación del evento . El evento se vinculará en el elemento de clase wrapper pero se delegará en el elemento de clase selector. Así es como funciona.
Nota:
El elemento wrapper-class puede ser cualquier cosa ex. documento, cuerpo o su envoltorio. El contenedor ya debería existir . Sin embargo,
selector
no necesariamente debe presentarse al momento de cargar la página. Puede llegar más tarde y el evento continuaráselector
sin falta .fuente
podrías usar
o
Estos dos métodos son equivalentes pero tienen un orden diferente de parámetros.
ver: jQuery Delegate Event
fuente
delegate()
ahora está en desuso. No lo uses.Puede adjuntar un evento al elemento cuando se crea dinámicamente usando
jQuery(html, attributes)
.fuente
Aquí es por qué los elementos creados dinámicamente no responden a los clics:
Como solución alternativa, debe escuchar todos los clics y verificar el elemento fuente:
Esto se llama "Delegación de eventos". Buenas noticias, es una característica incorporada en jQuery :-)
fuente
Cualquier p existente que exista en el momento en que se vincula el evento y si su página estaba creando dinámicamente elementos con el botón de nombre de clase , vincularía el evento a un padre que ya existe
fuente
Enlace el evento a un padre que ya existe:
fuente
Use el
.on()
método de jQuery http://api.jquery.com/on/ para adjuntar controladores de eventos al elemento activo.También a partir de la versión 1.9
.live()
se elimina el método.fuente
Prefiero tener oyentes de eventos implementados en una forma de función modular en lugar de escribir un
document
oyente de eventos de nivel. Entonces, me gusta a continuación. Tenga en cuenta que no puede suscribirse en exceso a un elemento con el mismo oyente de eventos, así que no se preocupe por adjuntar un oyente más de una vez, solo uno se queda.fuente
Otra solución flexible para crear elementos y eventos de enlace ( fuente )
Nota: Esto creará una instancia de controlador de eventos para cada elemento (puede afectar el rendimiento cuando se usa en bucles)
fuente
fuente
Estaba buscando una solución para conseguir
$.bind
y$.unbind
trabajar sin problemas en elementos añadidos de forma dinámica.Como en () hace el truco para adjuntar eventos, a fin de crear una desvinculación falsa en aquellos a los que vine:
fuente