XMLHttpRequest延迟HOOK方法
前言
在制作插件的过程中很多情况是需要hook的,下面是常见的hook方法
let xml=window.XMLHttpRequest;
window.XMLHttpRequest=function(){
return xml.apply(this,arguments);
}
以上这种hook针对常见的ajax的确很管用,但是针对在内部生成了新的XMLHttpRequest的代码就会导致hook之前的代码不会进入我们的方法,只有hook之后的方法才会。那么我们怎么让所有的ajax都会进我们的方法呢?答案就是原型链。
我们Hook掉原型链open方法,这样所有打开都会调用我们的代码了,那么为什么是open方法呢?因为所有ajax请求都会调用open方法。
代码
let open=window.XMLHttpRequest.prototype.open;
Object.defineProperty(window.XMLHttpRequest.prototype,'open',{
get(){
return function(type,url){
let ret=open.apply(this,arguments);
if(url.includes('rptBpp4pBidwordDayList')){
let xhr=this;
let baseCallback=xhr.onreadystatechange;
function hk(){
if(xhr.readyState == 4 && xhr.status == 200){
try{
callback(JSON.parse(xhr.responseText))
}catch (e) {
}
}
return baseCallback && baseCallback.apply(this,arguments);
}
xhr.onload=hk;
Object.defineProperty(xhr,'onload ',{
get(){
return hk;
},
set(val){
baseCallback=val;
},
});
}
return ret;
};
}
})