4

继这里的答案https://stackoverflow.com/a/1207393/1786228和现在相当老的 jQuery 插件(http://www.erichynds.com/jquery/jquery-create-event/

on创建新元素时要捕获的正确事件是什么?例如,我有输入框,可以在其中设置预先输入/自动完成功能。我这样做:

$(.input_box).each( function() { 
  // set stuff here 
  // setup options etc
  // apply autocomplete plugin to element (this is a jQuery plugin)
  var ac = $(this).autocomplete(acOptions);
});

然后我有一个按钮可以将更多相同的输入框添加到表单中。如何.each仅为新输入框调用该函数?如果我$(.input_box).each...再次使用,原来的盒子会再次添加插件。

我基本上想执行以下操作,但没有要绑定的“创建”事件。

$(document).on("create", "input_box", function(e) { 
  // set stuff here 
  // setup options etc
  // apply autocomplete plugin to element (this is a jQuery plugin)
  var ac = $(this).autocomplete(acOptions);
} ); 

有这样的活动吗?如果没有,实现这一目标的最佳方法是什么?

4

1 回答 1

2

如上所述:您可以使用突变事件。但是这些事件有一些限制:不支持 IE 9 之前的版本,并且这些事件也存在一些性能问题。在你的情况下,你会听DOMNodeInserted。一个可能的例子:

document.addEventListener("DOMNodeInserted", function(event){
    var target = event.srcElement || event.target;
    if (target && target.tagName.toLowerCase() == 'input') {
        // do what you want to do here....
    }
});

在您的情况下,我希望更简单一些:将您的 init 逻辑放在一个单独的函数中,并在每次操作 DOM 后调用此函数。在这个函数内部,为每个初始化的元素添加一个类或数据值,并检查这个类以确保只初始化一次:

function init() {
    $('.input_box').not('.initialized').each( function() { 
        var ac = $(this).addClass('initialized').autocomplete(acOptions);
    });
}
于 2013-02-12T07:12:03.330 回答