分享JavaScript监听全部Ajax请求事件的方法
若Ajax请求是由jQuery的 然后呢,还有其他方法,比如说 Pub/Sub,但是这个发起请求的 js 代码我是无法改动的,也就不存在向代码里添加 publish 的问题。同理,jQuery 的 最后,决定使用直接 在 StackOverflow 上搜索,发现有个歪果仁给出了一个不靠谱的解决方法,嗯,贴出来给大家看看: function openReplacement(method,url,async,user,password) {
// some code return open.apply(this,arguments); function sendReplacement(data) { if(this.onreadystatechange) this._onreadystatechange = this.onreadystatechange; return send.apply(this,arguments); function onReadyStateChangeReplacement() { if (this._onreadystatechange) return this._onreadystatechange.apply(this,arguments); window.XMLHttpRequest.prototype.open = openReplacement; 这个解决方案,无法监听全部的 那如何才能正确地 override XHR 呢?贴上代码,一起来看看:var oldXHR = window.XMLHttpRequest;
function newXHR() { realXHR.addEventListener('abort',function () { ajaxEventTrigger.call(this,'ajaxAbort'); },false); realXHR.addEventListener('error','ajaxError'); },false); realXHR.addEventListener('load','ajaxLoad'); },false); realXHR.addEventListener('loadstart','ajaxLoadStart'); },false); realXHR.addEventListener('progress','ajaxProgress'); },false); realXHR.addEventListener('timeout','ajaxTimeout'); },false); realXHR.addEventListener('loadend','ajaxLoadEnd'); },false); realXHR.addEventListener('readystatechange',function() { ajaxEventTrigger.call(this,'ajaxReadyStateChange'); },false); return realXHR; window.XMLHttpRequest = newXHR; 这样,就为 window.addEventListener('ajaxReadyStateChange',function (e) {
console.log(e.detail); // XMLHttpRequest Object }); window.addEventListener('ajaxAbort',function (e) { console.log(e.detail.responseText); // XHR 返回的内容 }); xhr.open('GET','info.json'); 需要注意的是,正常的 同时, 因为以上代码使用了 function CustomEvent ( event,params ) {
params = params || { bubbles: false,cancelable: false,detail: undefined }; var evt = document.createEvent( 'CustomEvent' ); evt.initCustomEvent( event,params.bubbles,params.cancelable,params.detail ); return evt; } CustomEvent.prototype = window.Event.prototype; window.CustomEvent = CustomEvent; return realXHR; window.XMLHttpRequest = newXHR; 此时,就可以在 IE 9+、Chrome 15+、FireFox 11+、Edge、Safari 6.1+、Opera 12.1+ 上愉快地使用了,以上就是本文的全部内容,希望大家能够喜欢。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |