JQuery:.live()vs.delegate()for ajax:替换元素上的完成事件
我正在RubyonRails 3.0.7应用程序中使用jQuery 1.6.2,希望从JQuery:.live()vs.delegate()for ajax:替换元素上的完成事件,jquery,ruby-on-rails,Jquery,Ruby On Rails,我正在RubyonRails 3.0.7应用程序中使用jQuery 1.6.2,希望从.live()切换到.delegate()(计划升级到jQuery 1.7并使用.on())。我正在使用Rails中的:remote=>true选项发送ajax请求,并尝试使用ajax:complete事件为响应设置一个处理程序。这些ajax请求通常会删除/替换实际触发请求的元素 我遇到的问题是,如果一个元素被ajax请求替换,.live()似乎会在请求完成时触发ajax:complete处理程序,但是.del
.live()
切换到.delegate()
(计划升级到jQuery 1.7并使用.on()
)。我正在使用Rails中的:remote=>true
选项发送ajax请求,并尝试使用ajax:complete
事件为响应设置一个处理程序。这些ajax请求通常会删除/替换实际触发请求的元素
我遇到的问题是,如果一个元素被ajax请求替换,.live()
似乎会在请求完成时触发ajax:complete
处理程序,但是.delegate()
不会(另外,我对jQuery 1.7做了一个小实验,发现.on()
也不起作用)
基本上,如果替换了ajax\u链接
元素,这将起作用:
$(.ajax\u link”).live(“ajax:complete”,function()){
//做点什么。。。
});
但这并不是:
$(“body”).delegate(“.ajax\u链接”,“ajax:complete”,function(){
//做点什么。。。
});
有没有想过为什么会发生这种情况?我在其他地方阅读,因此
.delegate()
在幕后使用.live()
,因此这种行为令我感到惊讶。此外,任何关于更好地解决这一问题的建议都将受到欢迎 对于jquery 1.7和1.8,从移除的元素触发事件不会在文档中出现。因此,在body
或document
上注册的回调处理程序将不会被调用
要解决此问题,您必须:
完成回调:
$(document).on('ajax:complete', function() {
// do something
});
rails.js
中的handleRemote
函数,以在元素与文档分离时触发文档上的事件
替换:
complete: function(xhr, status) {
element.trigger('ajax:complete', [xhr, status]);
与:
我对此发表了评论。我不确定为什么您的第二个事件处理程序不工作,但
live
相当于$(文档)。委派,而不是$('body')。委派,如果您是这样想的话。另外,live
在幕后使用delegate
,我相信不是相反。谢谢,@jackwanders。使用$(document)
确实让它工作了,但我仍然不明白$(“body”)
版本为什么不工作。有什么想法吗?谢谢你,帕斯卡。这很有趣,如果我决定升级到jQuery1.7或1.8,我会记住这一点。但是我仍然在使用1.6,您知道为什么我尝试的$(“body”).delegate(…)
版本不起作用(而$(文档)。delegate(…)
起作用)?
complete: function(xhr, status) {
if (element.parents().last().parent().get(0) == document)
element.trigger('ajax:complete', [xhr, status]);
else
$(document).trigger('ajax:complete', [xhr, status]);