1

请检查: http: //jsfiddle.net/TWiStErRob/s2jSA/在那里我尝试设置我能想到的所有可能的变化:

success, error, complete
ajaxSetup
ajaxSuccess, ajaxError, ajaxComplete
done, fail, always

如我所见:

  1. JSONP 缺少很多事件
    我希望输出与 JSON 相同
  2. 全局 AJAX 事件不能作为 Deferred 的回调,即注册顺序很重要,但仅适用于相同类型的事件。
    不是什么大不了的,我可以忍受它。
  3. 成功/错误后完成正在运行
    很高兴知道。

似乎对于 JSONP 事件几乎没用,有人可以解释原因并给出解决方法吗?

4

1 回答 1

1

原因

来自http://api.jquery.com/category/ajax/global-ajax-event-handlers/


注意:无论 global 的值如何,都不会为跨域脚本或 JSONP 请求触发全局事件。


来自http://bugs.jquery.com/ticket/8338


JSONP 请求不能保证完成(因为没有捕获到错误)。在这种情况下,jQuery 1.5 会强制全局选项为 false,以保证内部 ajax 请求计数器在某一时刻回到零。

如果您希望所有请求都触发事件,无论如何(并且冒着与 1.4.4 相同的不一致的风险),您可以使用以下预过滤器:

jQuery.ajaxPrefilter(function( options ) {
    options.global = true;
});

解决方法

上面的代码确实使它工作:

$.ajaxPrefilter(function global_ajaxPrefilter(options, originalOptions, jqXHR) {
    options.global = true;
});
$(document).ajaxSuccess(function global_ajaxSuccess(event, XMLHttpRequest, ajaxOptions) {
    if(config.logResponses) {
        console.log(XMLHttpRequest.responseText);
    }
});
$(document).ajaxError(function global_ajaxError(event, jqXHR, ajaxSettings, thrownError) {
    console.error("error: " + jqXHR.status + " " + thrownError);
});

但是,出于我的目的,以下方法效果更好:

$.ajaxPrefilter(/*dataTypes, */ function global_ajaxPrefilter(options, originalOptions, jqXHR) {
    if(config.logResponses) {
        jqXHR.done(function global_ajaxSuccess(data, textStatus, jqXHR) {
            console.groupCollapsed(options.url + (options.data ? '&' + $.param(options.data) : ''));
            console.log("Options: " + JSON.stringify(options));
            console.log("Data: " + JSON.stringify(data));
            console.groupEnd();
        });
    }
    jqXHR.fail(function global_ajaxError(jqXHR, textStatus, errorThrown) {
        console.error(textStatus + ": " + errorThrown));
    });
});

global_ajaxSuccess注意and的不同参数列表global_ajaxError

  • options:在两种解决方案中都可用(包含 URL)
  • data: 在全局处理程序中作为文本可用,在done
  • 界面很熟悉done/error
于 2013-09-12T21:52:32.323 回答