jQuery .on ('change', function () {} no se activa para entradas creadas dinámicamente


147

El problema es que tengo algunos conjuntos de etiquetas de entrada creados dinámicamente y también tengo una función que debe activarse cada vez que se cambia un valor de entrada.

$('input').on('change', function() {
  // Does some stuff and logs the event to the console
});

Sin embargo, .on('change')no se activa para ninguna entrada creada dinámicamente, solo para elementos que estaban presentes cuando se cargó la página. Desafortunadamente, esto me deja en un aprieto, ya que .onestá destinado a ser el reemplazo de.live() y .delegate()todos los cuales son envoltorios para .bind(): /

¿Alguien más ha tenido este problema o sabe de una solución?

Respuestas:


272

Debe proporcionar un selector para la onfunción:

$(document).on('change', 'input', function() {
  // Does some stuff and logs the event to the console
});

En ese caso, funcionará como esperaba. Además, es mejor especificar algún elemento en lugar del documento.

Lea este artículo para una mejor comprensión: http://elijahmanor.com/differences-between-jquery-bind-vs-live-vs-delegate-vs-on/


1
¡Usted es maravilloso! Yo también estaba teniendo este problema. Nunca pensé que podría agregar el selector como un segundo parámetro.
Tomatrox

1
sí, como se señaló, es bueno limitarse a algún elemento en lugar de a todo el documento, en el caso de que la parte dinámica esté después de algún div, use ese, por ejemplo: $ ('# ajax_table'). on ('change', 'input ', function () {...
Raul Gomez

3
Si mi elemento se creó dinámicamente, ¿cómo puedo trabajar con él más adelante? $ esto me da un objeto vacío.
aleXela

Funciona a las mil maravillas. Muchas gracias ! Además, podemos usar .once () para evitar agregar dos veces la misma lógica;)
benftwc

Sintaxis alternativa: $(document).on({ change: handleChange }, 'input');más la función const handleChange = (event) => { $(event.target)...Es bueno evitar lo problemático this.
Dem Pilafian

23

Utilizar este

$('body').on('change', '#id', function() {
  // Action goes here.
});

Para su información, @enrey se refería $('#id')en el código en lugar de'#id'
Loaf

14

Puede aplicar cualquier enfoque:

$("#Input_Id").change(function(){   // 1st
    // do your code here
    // When your element is already rendered
});


$("#Input_Id").on('change', function(){    // 2nd (A)
    // do your code here
    // It will specifically called on change of your element
});

$("body").on('change', '#Input_Id', function(){    // 2nd (B)
    // do your code here
    // It will filter the element "Input_Id" from the "body" and apply "onChange effect" on it
});

3
$("#id").change(function(){
    //does some stuff;
});

11
hmm ... ¿qué tal un poco de explicación del fragmento?
kleopatra

12
Esto todavía no funcionará con elementos creados dinámicamente, ya que intenta vincularse en la carga de documentos. Sin embargo, la respuesta de @ArtemVyshniakov se une al documento, y cuando algo en uno de los elementos cambia, se dispara, debido al segundo argumento, puede apuntar al elemento requerido. (lo que significa que cuando se activa la función, verificará si la fuente del disparador coincide con el segundo parámetro)
FullyHumanProgrammer

Este código no funcionará hasta que use el DOM precargado. Debe
benftwc

2

Solo para aclarar alguna posible confusión. Esto solo funciona cuando un elemento está presente en la carga DOM:

$("#target").change(function(){
    //does some stuff;
});

Cuando un elemento se carga dinámicamente más tarde, puede usar:

$(".parent-element").on('change', '#target', function(){
   //does some stuff;
});

2
$(document).on('change', '#id', aFunc);

function aFunc() {
  // code here...
}

1

Puede usar el evento 'input', que ocurre cuando un elemento recibe la entrada del usuario.

$(document).on('input', '#input_id', function() {
  // this will fire all possible change actions
});

documentación de w3


1

puedes usar:

$('body').ready(function(){
   $(document).on('change', '#elemID', function(){
      // do something
   });
});

Funciona conmigo

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.