jQuery全局(和本地)ajax事件没有触发
请检查: http : //jsfiddle.net/TWiStErRob/s2jSA/我尝试设置我能想到的所有可能的变化:
success, error, complete ajaxSetup ajaxSuccess, ajaxError, ajaxComplete done, fail, always
我看到了:
- JSONP缺少很多事件
我期望与JSON相同的输出 - 全局AJAX事件不能作为Deferred的回调,即注册顺序很重要,但只能使用相同类型的事件。
不是一个大问题,我可以忍受它。 - 成功/错误后完成运行
很高兴知道。
似乎对于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_ajaxSuccess
和global_ajaxError
的不同参数列表:
-
options
:两种解决方案均可用(包含URL) -
data
:在全局处理程序中可用作文本,在done
可用作对象 - 界面非常熟悉
done
/error