截取XMLHttpRequest并修改responseText

我正在尝试构建一个脚本,该脚本将充当本机XMLHttpRequest对象的代理/包装器,使我能够拦截它,修改responseText并返回到原始的onreadystatechange事件

上下文是,如果应用程序尝试接收的数据在本地存储中已经可用,则中止XMLHttpRequest,并将本地存储的数据传递回应用程序成功/失败回调方法。假设我无法控制现有的AJAX回调方法

我最初尝试过以下想法

var send=XMLHttpRequest.prototype.send;
XMLHttpRequest.prototype.send=函数(数据){
//在这里做一些事情来修改responseText
发送.呼叫(此,数据);
};

但正如我现在确定的,responseText是只读的

然后我试着退一步,将自己的完整本机代理编写到XMLHttpRequest,最终编写了自己版本的本机方法。与这里讨论的内容类似

http://www.ilinsky.com/articles/XMLHttpRequest/#implementation-包装

但是它很快变得混乱,并且仍然很难将修改后的数据返回到原始的onReadyStateChange方法中

有什么建议吗?这可能吗

//
//firefox,ie8+
//
var accessor=Object.getOwnPropertyDescriptor(XMLHttpRequest.prototype,“responseText”);
Object.defineProperty(XMLHttpRequest.prototype,'responseText'{
get:function(){
log('get responseText');
返回accessor.get.call(this);
},
集合:函数(str){
console.log('set responseText:%s',str);
//返回accessor.set.call(this,str);
},
可配置:true
});
//
//chrome,safari(访问者==null)
//
var rawOpen=XMLHttpRequest.prototype.open;
XMLHttpRequest.prototype.open=函数(){
如果(!这个._钩住了){
这个。_hooked=true;
(这个);
}
rawOpen.apply(这个,参数);
}
函数setupHook(xhr){
函数getter(){
log('get responseText');
删除xhr.responseText;
var ret=xhr.responseText;
设置();
返回ret;
}
函数设置器(str){
console.log('set responseText:%s',str);
}
函数设置(){
Object.defineProperty(xhr,“responseText”{
get:getter,
赛特:赛特,
可配置:true
});
}
设置();
}

发表评论