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-bet between-jquery-bind-vs-live-vs-delegate-vs-on/


1
Ти надзвичайний! У мене теж була ця проблема. Ніколи не думав, що ти можеш додати селектор як другий параметр.
Tomatrox

1
так, як вказувалося, що його добре звузити до якогось елемента замість цілого документа, у випадку, якщо динамічна частина його після деякого діва використовує цей, наприклад: $ ('# ajax_table'). on ('change', 'input ', function () {...
Рауль Гомес

3
Якщо мій елемент зробив динамічний, то як я можу потім з ним працювати? $ це дає мені порожній об'єкт.
aleXela

Це працює як шарм. Дуже дякую ! Крім того, ми можемо використовувати .once (), щоб запобігти додаванню вдвічі тієї самої логіки;)
benftwc

Черговий синтаксис: $(document).on({ change: handleChange }, 'input');плюс функція const handleChange = (event) => { $(event.target)...Приємно уникати клопітких this.
Dem Pilafian

23

Використовуй це

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

FYI, @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:

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

Коли елемент динамічно завантажується пізніше, ви можете використовувати:

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


1

Ви можете використовувати подію "введення", яка виникає, коли елемент отримує введення користувача.

$(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.