jQuery全局(和本地)ajax事件没有触发

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

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

我看到了:

  1. JSONP缺少很多事件
    我期望与JSON相同的输出
  2. 全局AJAX事件不能作为Deferred的回调,即注册顺序很重要,但只能使用相同类型的事件。
    不是一个大问题,我可以忍受它。
  3. 成功/错误后完成运行
    很高兴知道。

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

原因

来自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不一致的风险),您可以使用以下预filter:

 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_ajaxSuccessglobal_ajaxError的不同参数列表:

  • options :两种解决方案均可用(包含URL)
  • data :在全局处理程序中可用作文本,在done可用作对象
  • 界面非常熟悉done / error