gpt4 book ai didi

javascript - 为什么 Chrome unsafeWindow 技巧不支持 XMLHttpRequest 发送覆盖?

转载 作者:行者123 更新时间:2023-11-30 05:57:13 25 4
gpt4 key购买 nike

我想覆盖 XMLHttpRequest 的发送,以便让我的用户脚本知道何时通过此类请求在页面上更新数据。我的覆盖代码如下所示:

var oldSend = unsafeWindow.XMLHttpRequest.prototype.send;

unsafeWindow.XMLHttpRequest.prototype.send = function(){
console.log("notified of XHR update");
oldSend.apply(this, arguments);
}

如果我将它注入(inject)到页面中(没有 unsafeWindow 引用)它工作正常,但我想让它在用户脚本范围内工作。 unsafeWindow 适用于 Firefox,但不适用于 Chrome。所以我捕获了Brock Adams' nifty trick to create a working unsafeWindow in Chrome :

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.

如果可能的话,我尽量避免注入(inject)页面。

最佳答案

这个:

/*--- Create a proper unsafeWindow object on browsers where it doesn't exist
(Chrome, mainly).
Chrome now defines unsafeWindow, but does not give it the same access to
a page's javascript that a properly unsafe, unsafeWindow has.
This code remedies that.
*/
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';

在我的测试用户脚本中工作得很好。

这些也遵循 unsafeWindow 技巧:

unsafeWindow.foo = function () {
console.log ("In foo().");
};

unsafeWindow.alert = function (s) {
console.log ("Alert: ", s);
};

(在脚本运行的页面上,在控制台中输入 foo() 会产生:“In foo().”。alert() 不会生成弹出窗口,但会打印到控制台。)

我不知道为什么(还)重写 XMLHttpRequest.prototype.send 不像 Chrome 用户脚本那样工作,但是我不推荐 无论如何,unsafeWindow 方法。

注入(inject)覆盖代码。使用 postMessage() (也适用于 Chrome)在页面范围和脚本范围之间进行通信,如果您不(或不能)注入(inject)整个脚本。

关于javascript - 为什么 Chrome unsafeWindow 技巧不支持 XMLHttpRequest 发送覆盖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11093759/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com