2012-10-10 14 views
48

Tengo un <div> con id="modal" generado dinámicamente con el método jQuery load():Eventos activados por el elemento generado dinámicamente no son capturados por controlador de eventos

$('#modal').load('handlers/word.edit.php'); 

word.edit.php contiene un elemento de entrada de unos pocos, que se carga en un modal <div> .

utilizando el método de jQuery keyup puedo capturar los valores de entrada después de un incendios de evento, pero cuando se añaden los elementos dinámicamente a la div modal, el evento no hay incendios llonger cuando el usuario entra en su texto.

¿Qué método jQuery admite la gestión de eventos activados por elementos creados dinámicamente?

El código para la creación de los nuevos elementos de entrada es:

$('#add').click(function() { 
    $('<input id="'+i+'" type="text" name="translations' + i + '" />') 
     .appendTo('#modal'); 

El código para capturar los valores del usuario es:

$('input').keyup(function() { 
    handler = $(this).val(); 
    name = $(this).attr('name'); 

Este segundo bloque de código parece funcionar para los elementos originales, pero no está activado por los nuevos elementos generados dinámicamente.

+0

I también llenaron las dos versiones de jQuery en mi ** ** index.php ' ' pero no funciona la función ** en ** solo funciona la función ** en directo ** ** edición: #modal a la entrada ** \t \t '$ ('input'). Live ('keyup', 'input', function() { \t \t \t handler = $ (this) .val(); \t \t \t name = $ (this) .attr ('name'); \t \t \t alert (handler + "" + nombre); \t \t}); ' cuando uso el código para que funcione bien, gracias de nuevo por la ayuda :) – redbull330

+0

Solo una nota. No cargas dos versiones de JQuery. Carga una versión 1.6.2 de JQuery y 1.8.18 de JQuery UI. JQuery UI se utiliza para los componentes de la interfaz de usuario y no es lo mismo que JQuery. Para obtener la mejor práctica, intente utilizar JQuery desde un recurso en línea como Google en lugar de un archivo local. –

+0

@Carlos Eduardo Bruno Pereira Gracias por el buen borrado, Siempre he creído que ambos tienen el mismo paquete ya existe solo el -ui con características adicionales agregadas, pero no fue así :) – redbull330

Respuesta

38

Es necesario delegate the event al elemento estático ancestro más cercano dentro de la página (véase también "Understanding Event Delegation"). Esto simplemente significa que el elemento donde enlaza su controlador de eventos debe ya existe en el momento en que el controlador está vinculado, por lo que para los elementos generados dinámicamente debe permitir que el evento suba y lo maneje más arriba.

El método jQuery .on es la manera de hacerlo (o .delegate para versiones anteriores de jQuery.)

// If version 1.7 or above 

$('#modal').on('keyup', 'input', function() { 
    handler = $(this).val(); 
    name = $(this).attr('name'); 
}); 

O en las versiones anteriores

// If version 1.6 or below 

// note the selector and event are in a different order than above 
$('#modal').delegate('input', 'keyup', function() 
{ 
    handler = $(this).val(); 
    name = $(this).attr('name'); 
}); 
+2

Su respuesta, el artículo al que se vinculó y @ernie mencionando '' realmente me ayudó a entender cómo funciona '.on()'. ¡Gracias! –

+0

Respuesta realmente útil, muchas gracias por la información – alxrb

6

Esto está sucediendo porque está agregando el elemento de entrada después de ha conectado el evento. Trate .on:

$('body').on('keyup', 'input', function() { 
    handler = $(this).val(); 
    name = $(this).attr('name'); 
}); 

Usando .on se asegurará de que el evento keyup está conectado a las entradas que se encuentran en la página de origen, así como las que se añadan más adelante de forma dinámica.

+0

Lo siento, antes estaba trabajando las entradas que se cargaron antes de appendTo() en el ** modal ** div pero ahora ambos no funcionan y no entendí qué es lo diferente ** en ** usando y creo que el elemento de las entradas se basa en ** modal ** div no en ** cuerpo ** pero cada div debe fundarse en ** cuerpo ** No lo sé, pero no es trabajo – redbull330

+0

Puede c colgar ''cuerpo'' a cualquier selector que desee. Ese selector debería funcionar, sin embargo. Tu HTML modal seguirá estando dentro del cuerpo, ya que no puede estar fuera de él. – Gromer

3

Cuando cambie dinámicamente el DOM, jQuery no los adjuntará. Es necesario utilizar on() and delegated events

Para sus elementos de entrada, necesitará algo como:

$("<parentSelector>").on("keyup", "input", function() { 
    handler = $(this).val(); 
    name = $(this).attr('name'); 
}) 

Cuando el parentSelector es algo mayor en el DOM que el elemento de entrada, y un elemento que existe en carga de la página , tal vez el ID de formulario o algo así.

+0

Tu última oración realmente me ayudó a entender este concepto. ¡Gracias! –

1

Los enlaces de función se realizan en carga de página. Para trabajar en elementos creados dinámicamente usando la función live(). Ejemplo:

$ ("p"). live ("click", function() { 
    // Your function 
}); 
+4

Al igual que una nota, [.live()] (http://api.jquery.com/live/) está en desuso a partir de jQuery 1.7, por lo que es una buena idea cambiar a [.on()] (http: //api.jquery.com/on/) – ernie

+0

¡Uy, gracias por la información, estaba realmente desactualizado! Lo siento. –

0

Si necesita capturar cambios para todos los elementos de formulario, en particular cajas de selección, sé que no se mencionan aquí, pero es útil saber , utilice el siguiente código:

$(document).on('change', ':input', function() { 
    alert('value of ' + $(this).attr('name') + ' changed') 
}); 

Esto debe abarcar toda input, textarea, select, checkbox, radio, etc.

Cuestiones relacionadas