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.