如何在尚不存在的元素上注册事件?

我试图在这样的元素上注册一个事件:

$(document).ready(function() { $('.classname').change(function(){ alert ('This line is never triggered'); }); }); 

但问题是.classname元素后来被ajax加载到dom中。 那么,在这种情况下如何正确注册事件? 是否有可能只做一次(我的意思是,不是每次出现新元素?)

除了建议您使用live()的答案之外,还可以使用delegate() ,例如:

 $('form').delegate('.classname', 'change', function(){ alert("This will alert when the newly-added element registers a 'change' event."); }); 

对于delegate ,要分配选择器( .classname')的元素,在这种情况下, $('form')必须在赋值时存在于DOM中。


编辑注意以下部分(在’参考’之后的下一个’编辑’)之后是错误的

JS小提琴演示 。

delegate()选择器选择的元素和事件delegate()的目标delegate() -d之间的元素上调用stopPropagation() 确实有点可预测(虽然我之前没有意识到这一点)阻止委托发生。

在OP的评论中回复问题编辑

嘿,刚才注意到,如果任何父母的事件处理程序调用stopPropagation,那么直播活动就会停止! 它是否正确?

不是根据jQueryAPI (条目链接到下面):

…由.delegate()处理的事件将始终传播到它们被委派给的元素…

我还没有尝试/validation过这个,但似乎即使是位于目标元素( $('.classname') )和delegate() d元素( $('form') )之间的元素调用stopPropagation()它不应该对delegate()产生负面影响。

参考:

  • delegate()

您必须使用on(),因为不推荐使用live():

 $(document).ready(function() { $( document ).on('change', '.classname', function(){ alert ('This line is never triggered'); }); }); 

使用live将事件绑定到现在和将来的所有元素:

 $(document).ready(function() { $('.classname').live('change',function(){ alert ('This line is never triggered'); }); }); 

有关更多信息,请查看此处的文档 。