我想要在像这样的元素上注册一个事件:
$(document).ready(function() {
$('.classname').change(function(){
alert ('This line is never triggered');
});
});
但问题是,.classname元素是通过ajax后加载到dom中的。那么,在这种情况下,我应该如何正确地注册事件呢?是否有可能只注册一次(我的意思是,不是每次出现新元素都要注册)?
我想要在像这样的元素上注册一个事件:
$(document).ready(function() {
$('.classname').change(function(){
alert ('This line is never triggered');
});
});
但问题是,.classname元素是通过ajax后加载到dom中的。那么,在这种情况下,我应该如何正确地注册事件呢?是否有可能只注册一次(我的意思是,不是每次出现新元素都要注册)?
由于live()已被弃用,您必须使用on():
$(document).ready(function() {
$( document ).on('change', '.classname', function(){
alert ('This line is never triggered');
});
});
除了使用live()
,还可以使用delegate()
,例如:
$('form').delegate('.classname', 'change', function(){
alert("This will alert when the newly-added element registers a 'change' event.");
});
.classname'
)分配,在这种情况下,$('form')
必须在分配时存在于 DOM 中。
delegate()
选择器所选的元素和事件被delegate()
的目标元素之间的元素上调用stopPropagation()
会有所预测(尽管我之前没有意识到这一点),防止委派发生。
编辑响应OP在评论中的问题:
嘿,刚刚注意到,如果任何父级事件处理程序调用stopPropagation,则live事件将停止!这是正确的吗?
根据jQueryAPI(条目在下面链接):
...由.delegate()
处理的事件将始终传播到它们被委派的元素...
我尚未尝试/验证过这一点,但似乎即使坐落在目标元素($('.classname')
)和被delegate()
的元素($('form')
)之间的元素调用了stopPropagation()
,它也不应对delegate()
产生负面影响。
参考:
使用live
,它将事件绑定到当前和将来的所有元素:
$(document).ready(function() {
$('.classname').live('change',function(){
alert ('This line is never triggered');
});
});
想要了解更多信息,请查看这里的文档。
live()
现在已经被弃用,请使用on()
。请参考此答案:https://dev59.com/z2sy5IYBdhLWcg3w-i7h#8191450 - w3bshark