【发布时间】:2014-11-16 12:02:20
【问题描述】:
我试图否决 ajax 方法的发送方法。请参阅下面的代码:
(function() {
var beforeCall = window.XMLHttpRequest.prototype.open,
sendCall = window.XMLHttpRequest.prototype.send;
window.XMLHttpRequest.prototype.open = function() {
console.log("OPEN"); // Works
// Only called once, but Ajax has 5 states, which are should log 5 times
this.onreadystatechange = function(){ console.log("READYSTATE SOMETHING"); }
return beforeCall.apply(this, [].slice.call(arguments));
};
window.XMLHttpRequest.prototype.send = function() {
var origCallback = this.onreadystatechange;
this.onreadystatechange = function(){
console.log("ONREADYSTATECHANGE"); // This log never gets called
if( origCallback ) {
origCallback.apply(this, [].slice.call(arguments))
}
};
return sendCall.apply(this, [].slice.call(arguments));
}
})();
OPEN 被记录,READYSTATE SOMETHING 只记录一次,但应该记录每个状态吗?然后在我的发送函数上,我尝试再次覆盖它(应该在这里,因为也许我的网站已经有一个 onreadystatechange 并且我不想丢失那个回调。所以,我需要它,但那个回调永远不会被调用。
原始功能仍然适用于我上面的代码。但我没有得到我想要的额外日志。
有人知道为什么我的console.log("ONREADYSTATECHANGE") 的onreadystatechange 永远不会被调用吗?
我需要此代码的网站正在使用 jQuery atm,但它也应该与原生 Javascript Ajax 一起使用。
【问题讨论】:
-
更新了我的答案,在 FireFox 中犯了一个错误。您的代码中的错误无法在 FireFox 33.0 中重新生成,除非在没有打开页面的全新选项卡的控制台中运行它。我很好奇我的答案中的更新代码会在其他浏览器中为您生成什么(我只有 FireFox 和 Chrome)。
标签: javascript jquery ajax