Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/439.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 猴子补丁XMLHttpRequest.prototype.open和;感人的;论据_Javascript_Internet Explorer_Xmlhttprequest_Monkeypatching - Fatal编程技术网

Javascript 猴子补丁XMLHttpRequest.prototype.open和;感人的;论据

Javascript 猴子补丁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

我正在尝试为在IE8兼容模式下运行的intranet站点运行monkey patch
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);
};