如何在尚不存在的元素上注册事件?
我试图在这样的元素上注册一个事件:
$(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'); }); });
有关更多信息,请查看此处的文档 。