Javascript 猴子补丁XMLHttpRequest.prototype.open和;感人的;论据
我正在尝试为在IE8兼容模式下运行的intranet站点运行monkey patchJavascript 猴子补丁XMLHttpRequest.prototype.open和;感人的;论据,javascript,internet-explorer,xmlhttprequest,monkeypatching,Javascript,Internet Explorer,Xmlhttprequest,Monkeypatching,我正在尝试为在IE8兼容模式下运行的intranet站点运行monkey patchXMLHttpRequest.prototype.open,但它不断抛出SCRIPT438:Object不支持此属性或方法。奇怪的是。。。如果我先“触摸”参数,即取消对条的注释,它就可以正常工作了!有没有人知道为什么,如果触摸它确实解决了100%的情况下的问题 var foo = window.XMLHttpRequest.prototype.open; window.XMLHttpRequest.prototy
XMLHttpRequest.prototype.open
,但它不断抛出SCRIPT438:Object不支持此属性或方法
。奇怪的是。。。如果我先“触摸”参数
,即取消对条的注释
,它就可以正常工作了!有没有人知道为什么,如果触摸它确实解决了100%的情况下的问题
var foo = window.XMLHttpRequest.prototype.open;
window.XMLHttpRequest.prototype.open = function() {
//var bar = arguments;
foo.apply(this, arguments);
console.log("OK");
}
这是IE8模式下的IE9 modern.ie虚拟机屏幕截图,谷歌图像搜索试图在滚动时打开猴子补丁请求
编辑:
返回
LOG:
function open() {
[native code]
}
LOG: object
LOG: false
console.log(foo.apply)
one抛出“对象不支持此属性或方法”
有趣的是,我无法在实际的IE8虚拟机中以我尝试过的任何模式复制它,只能在IE8标准模式下运行的IE9中复制。我最近刚刚看到一个XMLHttpRequest.prototype.open
被覆盖的例子,方法与您的略有不同
(function(open) {
XMLHttpRequest.prototype.open = function() {
// your special sauce
open.apply(this, arguments);
};
})(XMLHttpRequest.prototype.open);
你能检查一下这样做是否有任何不同吗?你能做一个控制台.log(foo,foo.apply,typeof foo,foo instanceof Function)
也许?我的猜测是,.apply(这个,参数)代码>是内部优化的,但是“触摸”参数需要显式创建参数对象。从昆汀发现的可能的副本中可以看出,IE对于插件对象的“方法”非常古怪。@Bergi谢谢,请查看日志返回的编辑。即使在访问。应用它抛出的?哇!但是,是的,像这样的事情正是我所担心的。Function.prototype.apply.call(foo,arguments)
是否作为一种解决方法?对不起,我忘记了应用的thisArg
,它必须是Function.prototype.apply.call(foo,arguments)
(在您的示例中,
是this
)。看起来您需要使用一个实际的包装器(围绕整个XMLHttpRequest
API)如果您无法装饰它:-/
var XHR = XMLHttpRequest.prototype;
XHR.open = function (method, url) {
//do stuff
return open.apply(this, arguments);
};
var XHR = XMLHttpRequest.prototype;
XHR.open = function (method, url) {
//do stuff
return open.apply(this, arguments);
};