内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用
我试图拦截所有Ajax调用,以检查Ajax响应是否包含我从PHP脚本中作为JSON发送的特定错误代码
(codes: ACCESS_DENIED, SYSTEM_ERROR, NOT_FOUND).
我试着:
$('.log').ajaxSuccess(function(e, xhr, settings) { });
我能否通过将“ajaxSuccess”事件绑定到文档来实现我想要的?
$(document).ajaxSuccess(function(e, xhr, settings) { });
从http://api.jquery.com/ajaxSuccess/:
每当Ajax请求成功完成时,jQuery就会触发ajaxSuccess事件。此时将执行在.ajaxSuccess()方法中注册的任何和所有处理程序。
因此,选择器没有定义要“捕获”事件的位置(老实说,Ajax事件本质上不是从DOM元素开始的),而是定义了将默认处理的作用域(即this
将指向那个/那些元素。
如果使用jQuery,$.ajaxSuccess
这是一个不错的选择,它将拦截所有框架中的XHR调用(我已经用ExtJS和jQuery测试过它--即使同时加载了多个框架,它也应该工作)。它已经测试了与IE8,Chrome和Firefox一起工作。
(function(XHR) { "use strict"; var open = XHR.prototype.open; var send = XHR.prototype.send; XHR.prototype.open = function(method, url, async, user, pass) { this._url = url; open.call(this, method, url, async, user, pass); }; XHR.prototype.send = function(data) { var self = this; var oldOnReadyStateChange; var url = this._url; function onReadyStateChange() { if(self.readyState == 4 /* complete */) { /* This is where you can put code that you want to execute post-complete*/ /* URL is kept in this._url */ } if(oldOnReadyStateChange) { oldOnReadyStateChange(); } } /* Set xhr.noIntercept to true to disable the interceptor for a particular call */ if(!this.noIntercept) { if(this.addEventListener) { this.addEventListener("readystatechange", onReadyStateChange, false); } else { oldOnReadyStateChange = this.onreadystatechange; this.onreadystatechange = onReadyStateChange; } } send.call(this, data); } })(XMLHttpRequest);