一尘不染

JavaScript由动态生成的元素触发的事件未被事件处理程序捕获

javascript

我有一个<div>id="modal"jQuery load()方法动态生成的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');

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


阅读 252

收藏
2020-04-23

共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');
});
2020-04-23