2

最近从Prototype切换到jQuery,我正在努力解决一些基本问题。

我在我的应用程序中使用了几个 AJAX 请求;对于 95% 的这些请求,我希望执行一些全局事件,例如显示或隐藏加载指示器。除了全局功能外,每个请求还应该在完成后执行一些自定义代码。

似乎本地Ajax 事件一旦设置就会覆盖全局事件。例如,请参见以下代码:

// global events
$('#loader').bind('ajaxStart', function() { 
    // in this particular example, the ajaxStart() works fine, 
    // as it has not been overridden
    Loader.enable();
}).bind('ajaxComplete', function() { 
    // this section will not execute. when the local complete()
    // is removed, it will execute just fine
    Loader.disable();
} );

// local ajax event
$.ajax({
    type: $(element).attr('method'),
    url: $(element).attr('action'),
    data: $(element).serialize(),
    global: 'true',
    complete: function(data) {
        if (params.target && $('#' + params.target)) {
            $('#' + params.target).html(data.responseText);
        }
        Behaviour.apply();
});

在这种特殊情况下,本地 complete() 事件似乎阻止了全局 ajaxComplete() 事件的执行。

有没有办法将本地作为全局ajax事件执行?

4

3 回答 3

4

刚刚尝试运行您的代码。添加了缺失的 }); 尽管。像魅力一样工作。调用顺序如下:

  1. ajax启动
  2. 完全的
  3. ajax 完成

这是我所做的:

// local ajax event
$.ajax({
    ...
    global: 'true',
    complete: function(data) {
        ...
    }
}); // <=== This line here
于 2009-06-03T14:22:17.110 回答
3

我没试过,但你为什么不创建一个全局方法:

function globalAjaxComplete(data)

并从全局和本地事件处理程序中调用它?

您还可以定义一个类“ajaxEnabled”并执行以下操作:

$(".ajaxEnabled").bind("ajaxStart", 
   Function() { globalAjaxComplete(); });

那么你就不需要每次都调用全局方法了。

但是仍然不知道为什么本地绑定会取消全局绑定。

于 2009-06-03T12:01:46.223 回答
0

首先,感谢您的回复。他们两个至少帮助我一次又一次地重新评估我的代码。

问题和解决方案非常简单:

Behaviour.apply();在我的本地完成事件中调用的那个在其他地方触发了一个错误,阻止了complete()函数正确完成并有效地禁用了全局ajaxComplete()事件。修复此错误也解决了我的问题。

这意味着 jQuery 支持将本地全局ajax 事件结合起来。

于 2009-06-08T08:00:15.020 回答