52

我有一个<div>使用id="modal"jQueryload()方法动态生成的 with:

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

word.edit.php包含一些输入元素,它们被加载到 modal<div>中。

使用 jQuery 的keyup方法,我可以在事件触发后捕获输入值,但是当元素被动态添加到模态 div 时,当用户输入他们的文本时,事件不再触发。

哪个 jQuery 方法支持处理由动态创建的元素触发的事件?

创建新输入元素的代码是:

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

捕获用户值的代码是:

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

第二个代码块似乎适用于原始元素,但它不会被新的动态生成的元素触发。

4

5 回答 5

42

您需要将事件委托给页面中最近的静态祖先元素(另请参阅“了解事件委托”)。这只是意味着,绑定事件处理程序的元素在绑定处理程序时必须已经存在,因此对于动态生成的元素,您必须允许事件冒泡并进一步处理它。

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');
});
于 2012-10-10T23:31:20.813 回答
7

发生这种情况是因为您在连接事件后添加了输入元素。尝试.on

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

使用.on将确保keyup事件连接到最初在页面上的输入,以及以后动态添加的任何输入。

于 2012-10-10T23:26:48.793 回答
3

当您动态更改 DOM 时,jQuery 不会将事件处理程序附加到它们。您需要使用on() 和委托事件

对于您的输入项,您需要以下内容:

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

parentSelector 在 DOM 中比输入元素更高,并且是在页面加载时存在的元素,可能是表单 ID 或其他东西。

于 2012-10-10T23:29:01.780 回答
1

功能绑定是在页面加载中进行的。使用函数 live() 处理动态创建的元素。例子:

$ ("p"). live ("click", function () {
    // Your function
});
于 2012-10-10T23:30:08.627 回答
0

如果您需要捕获所有表单元素的更改,尤其是选择框,我知道这里没有提到它们,但是知道它会有所帮助,请使用以下代码:

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

这应该涵盖所有input, textarea, select, checkbox,radio等。

于 2015-06-08T21:39:05.703 回答