События, инициируемые динамически сгенерированным элементом, не захватываются обработчиком событий

У меня есть <div> с id="modal", сгенерированный динамически с помощью метода jQuery load():

$('#modal').load('handlers/word.edit.php');

word.edit.php содержит несколько элементов ввода, которые загружаются в модальный <div>.

Используя метод jQuery keyup, я могу захватить входные значения после срабатывания события, но когда элементы динамически добавляются в модальный div, событие, когда llonger не запускается, когда пользователь вводит свой текст.

Какой метод jQuery поддерживает обработку событий, вызванных динамически создаваемыми элементами?

Код для создания новых элементов ввода:

$('#add').click(function() {
    $('<input id="'+i+'" type="text" name="translations' + i + '"  />')
      .appendTo('#modal');

Код для захвата пользовательских значений:

$('input').keyup(function() {
    handler = $(this).val();
    name = $(this).attr('name');

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

Ответ 1

Вам необходимо делегировать событие ближайшему элементу статического предка на странице (см. также "Понимание делегирования событий" ). Это просто означает, что элемент, в который вы привязываете обработчик событий, должен существовать в момент привязки обработчика, поэтому для динамически генерируемых элементов вы должны позволить событию пузыриться и обрабатывать его дальше.

Метод jQuery .on - это способ сделать это (или .delegate для более старых версии jQuery.)

// If version 1.7 or above

$('#modal').on('keyup', 'input', function() {
    handler = $(this).val();
    name = $(this).attr('name');
});

Или в более старых версиях

// If version 1.6 or below

// note the selector and event are in a different order than above
$('#modal').delegate('input', 'keyup', function()
{
    handler = $(this).val();
    name = $(this).attr('name');
});

Ответ 2

Это происходит потому, что вы добавляете элемент ввода после подключения к событию. Попробуйте .on:

$('body').on('keyup', 'input', function() {
    handler = $(this).val();
    name = $(this).attr('name');
});

Используя .on, убедитесь, что событие keyup подключено к входам, которые находятся на странице изначально, а также к любым, которые добавляются позже динамически.

Ответ 3

При динамическом изменении DOM jQuery не будет прикреплять к ним обработчики событий. Вам нужно использовать on() и делегированные события

Для ваших элементов ввода вам потребуется что-то вроде:

$("<parentSelector>").on("keyup", "input", function() { 
    handler = $(this).val();
    name = $(this).attr('name');
})

Если parentSelector является чем-то более высоким в DOM, чем элемент ввода, и элемент, который существует при загрузке страницы, возможно, идентификатор формы или что-то в этом роде.

Ответ 4

Связывание функций выполняется при загрузке страницы. Для работы с элементами, созданными динамически с помощью функции live(). Пример:

$ ("p"). live ("click", function () {
    // Your function
});

Ответ 5

Если вам нужно зафиксировать изменения для всех элементов формы, особенно выберите поля, я знаю, что они здесь не упомянуты, но полезно знать, используйте следующий код:

$(document).on('change', ':input', function () {
   alert('value of ' + $(this).attr('name') + ' changed')
});

Это должно охватывать все input, textarea, select, checkbox, radio и т.д.