jQuery .on ('change', function () {} не запускается для динамически создаваемых входов


147

Проблема в том, что у меня есть несколько динамически создаваемых наборов входных тегов, и у меня также есть функция, которая должна запускать каждый раз, когда изменяется входное значение.

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

Однако .on('change')он не запускается для каких-либо динамически создаваемых входных данных, а только для элементов, которые присутствовали при загрузке страницы. К сожалению, это оставляет меня в некотором затруднении, так как .onпредназначено для замены, .live()и .delegate()все они являются обертками для .bind(): /

Кто-нибудь еще имел эту проблему или знает решение?

Ответы:


272

Вы должны предоставить селектор для onфункции:

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

В этом случае все будет работать так, как вы ожидали. Также лучше указать какой-то элемент вместо документа.

Прочитайте эту статью для лучшего понимания: http://elijahmanor.com/differences-between-jquery-bind-vs-live-vs-delegate-vs-on/


1
Ты обалденный! У меня тоже была эта проблема. Никогда не думал, что вы можете добавить селектор в качестве второго параметра.
— Tomatrox

1
да, как указывалось, хорошо сузить до некоторого элемента вместо целого документа, в случае, если динамическая часть после некоторого div использует эту, например: $ ('# ajax_table'). on ('change', 'input ', function () {...
— Рауль Гомес

3
Если мой элемент сделан динамически, как я могу работать с ним позже? $ это дает мне пустой объект.
— aleXela

Работает как часы. Большое спасибо ! Кроме того, мы можем использовать .once (), чтобы предотвратить добавление дважды одинаковой логики;)
— benftwc

Альтернативный синтаксис: $(document).on({ change: handleChange }, 'input');плюс функция const handleChange = (event) => { $(event.target)...Приятно избегать хлопот this.
— Дем

23

Использовать это

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

К вашему сведению, @enrey имел в виду $('#id')код, а не'#id'
— Буханка

14

Вы можете применить любой один подход:

$("#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
хм ... как насчет объяснения фрагмента?
— Клеопатра

12
Это все равно не будет работать с динамически созданными элементами, так как оно пытается связать при загрузке документа. Ответ @ArtemVyshniakov, однако, привязывается к документу, и когда что-то в одном из элементов изменяется, оно запускается, поскольку по второму аргументу оно может нацеливаться на требуемый элемент. (это означает, что когда функция запускается, она проверит, соответствует ли источник триггера второму параметру)
— FullyHumanProgrammer

Этот код не будет работать, пока он не использует предварительно загруженный DOM. Вы должны передать селектор в виде связанной с документом переменной api.jquery.com/on/#on-events-selector-data
— benftwc

2

Просто чтобы прояснить потенциальную путаницу. Это работает, только когда элемент присутствует в DOM load:

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

Когда элемент загружается динамически позже, вы можете использовать:

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


1

Вы можете использовать событие input, которое происходит, когда элемент получает пользовательский ввод.

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

документация от w3


1

ты можешь использовать:

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

Это работает со мной.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.