我想覆盖XMLHttpRequest
发送,以便让我的用户脚本知道何时通过此类请求在页面上更新数据。我的覆盖代码如下所示:
var oldSend = unsafeWindow.XMLHttpRequest.prototype.send;
unsafeWindow.XMLHttpRequest.prototype.send = function(){
console.log("notified of XHR update");
oldSend.apply(this, arguments);
}
如果我将它注入页面(没有unsafeWindow
引用)它工作正常,但我想从用户脚本范围内让它工作。 unsafeWindow
适用于 Firefox,但不适用于 Chrome。所以我抓住了Brock Adams 的绝妙技巧,在 Chrome中创建了一个工作unsafeWindow
:
var bGreasemonkeyServiceDefined = false;
try {
if (typeof Components.interfaces.gmIGreasemonkeyService === "object") {
bGreasemonkeyServiceDefined = true;
}
}
catch (err) {
//Ignore.
}
if ( typeof unsafeWindow === "undefined" || ! bGreasemonkeyServiceDefined) {
unsafeWindow = ( function () {
var dummyElem = document.createElement('p');
dummyElem.setAttribute ('onclick', 'return window;');
return dummyElem.onclick ();
} ) ();
}
但是,当我将两者结合起来时,什么也没有发生。这一切都粘贴到控制台中,但是从用户脚本运行时既没有错误也没有输出。我是不是做错了什么,或者这超出了这个技巧的能力范围?
嗯,只是尝试了一些更简单的东西,比如:unsafeWindow.document.title = 'testing';
这也不起作用,所以它可能不是特定于XMLHttpRequest
.
如果可能的话,我试图避免注入页面。