Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JQuery:.live()vs.delegate()for ajax:替换元素上的完成事件_Jquery_Ruby On Rails - Fatal编程技术网

JQuery:.live()vs.delegate()for ajax:替换元素上的完成事件

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

我正在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
处理程序,但是
.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]);