js监听xmlhttprequest事件
最近在项目中使用了tinymce组件进行富文本的实现,因为是后台工程,所以在全部接口进行了token校验,其中该组件的上传图片功能init时仅指定了上传的路径,并没有字段对request进行设置;翻了翻文档仅找到了重定义上传方法的解决方式;这里贴一个js直接监听xmlhttprequest事件的方法,即插即用;
(function() {
if (typeof window.CustomEvent === 'function') return false;
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;
})();
(function() {
function ajaxEventTrigger(event) {
// 创建事件对象
var ajaxEvent = new CustomEvent(event, { detail: this });
// 触发执行
window.dispatchEvent(ajaxEvent);
}
var oldXHR = window.XMLHttpRequest;
function newXHR() {
var realXHR = new oldXHR();
realXHR.addEventListener('abort', function() { ajaxEventTrigger.call(this, 'ajaxAbort'); }, false);
realXHR.addEventListener('error', function() { ajaxEventTrigger.call(this, 'ajaxError'); }, false);
realXHR.addEventListener('load', function() { ajaxEventTrigger.call(this, 'ajaxLoad'); }, false);
realXHR.addEventListener('loadstart', function() { ajaxEventTrigger.call(this, 'ajaxLoadStart'); }, false);
realXHR.addEventListener('progress', function() { ajaxEventTrigger.call(this, 'ajaxProgress'); }, false);
realXHR.addEventListener('timeout', function() { ajaxEventTrigger.call(this, 'ajaxTimeout'); }, false);
realXHR.addEventListener('loadend', function() { ajaxEventTrigger.call(this, 'ajaxLoadEnd'); }, false);
realXHR.addEventListener('readystatechange', function() { ajaxEventTrigger.call(this, 'ajaxReadyStateChange'); }, false);
return realXHR;
}
window.XMLHttpRequest = newXHR;
})();
// 调用
window.addEventListener('ajaxReadyStateChange', function(e) {
if (e.detail.readyState === 1) {
e.detail.setRequestHeader('token', '1326');
}
e.detail.onload = function() {
console.log('event====>', e.detail);
};
});