当前位置:首页 > Web开发 > 正文

async () = { if ( this . readyState == 4 gHandlerList .leng

2024-03-31 Web开发

* 通过劫持原生XMLHttpRequest实现对页面ajax请求的监听

* @author binaryfire

*/

const READY_STATE_CHANGE = readystatechange;

let gHandlerList = [],//截获请求的措置惩罚惩罚函数列表

gIsInited = false;//是否已经初始化

let T_RSC_HANDLERS = Symbol(readyStateChangeHandler);

let initProxy = function(){

if(gIsInited)return;

gIsInited = true;

 

//这里先缓存一份原生的XMLHttpRequest类

let winXMLHttpRequest = window.XMLHttpRequest;

 

//用于替换原生XMLHttpRequest的类,担任自XMLHttpRequest

let ProxyXHR = class extends winXMLHttpRequest{

constructor(){

super(...arguments);

//readystatechange

//数组中第0个为页面中挪用xhr.onreadystatechange的回调函数

//其他的为页面中挪用addEventListener(‘readystatechange‘)时的回调函数

this[T_RSC_HANDLERS] = [null];

//挪用原生XMLHttpRequest的addEventListener,添加对readystatechange事件的监听

super.addEventListener(READY_STATE_CHANGE,async ()=>{

if(this.readyState == 4 && gHandlerList.length){//只有4的时候会回调proxyHandler

try{

//挪用注册的handler

await gHandlerList.map(proxyHandler => proxyHandler.call(this,this));

}

catch(e){

//TODO 这里可以替换为其他的错误措置惩罚惩罚逻辑

console.error(e);

}

}

//挪用页面中注册的回调函数,保证页面中逻辑正常

this[T_RSC_HANDLERS].forEach(handler => handler && handler.apply(this,arguments));

});

}

/**

* 重写addEventListener函数,对readystatechange事件做特殊措置惩罚惩罚

*/

addEventListener(type,handler){

if(type == READY_STATE_CHANGE){

this[T_RSC_HANDLERS].push(handler);

}

else{

return super.addEventListener(...arguments);

}

}

/**

* 重写removeEventListener函数,对readystatechange事件做特殊措置惩罚惩罚

*/

removeEventListener(type,handler){

if(type == READY_STATE_CHANGE){

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/30967.html