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.
});
Dixon
источник
К вашему сведению, @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;
});
dynero
источник
2
$(document).on('change', '#id', aFunc);

function aFunc() {
  // code here...
}
Винод Кумар
источник
1

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

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

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

Alex
источник
1

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

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

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

Йехиа Фуад
источник