gpt4 book ai didi

javascript - 是否可以在 Greasemonkey 脚本中使用 worker?

转载 作者:搜寻专家 更新时间:2023-11-01 04:55:51 25 4
gpt4 key购买 nike

我想使用 Firefox 3.5 中引入的 Web Worker 工具来增强我正在处理的 Greasemonkey 脚本。

这可能吗?

我做了一些实验,但无法解决从任意域加载工作脚本的问题。

例如,这不起作用:

var myWorker = new Worker("http://dl.getdropbox.com/u/93604/js/worker.js");

此代码在我的 Firebug 控制台中生成一条错误消息:

Failed to load script: http://dl.getdropbox.com/u/93604/js/worker.js (nsresult = 0x805303f4)

显然存在一个限制,不允许您从与调用脚本的基本 URL 无关的 URL 启动 worker。您可以像这样在相对 URL 加载工作脚本:

var myWorker = new Worker("worker.js");

但是我无法在用户的文件系统上获取工作脚本,以便它可以位于与调用脚本相关的路径中。

我被搞砸了吗?我应该放弃尝试在我的 Greasemonkey 脚本中使用 worker 吗?

最佳答案

多年来,我一直认为在 GM 中使用 Web Worker 是不可能的。当然,第一个想法是使用数据 url。但是 Worker 构造函数似乎不接受它们。

今天我又试了一次,一开始没有任何问题。只有当我开始使用 GM API 的函数时,Worker 构造函数才停止工作。

似乎 Firefox 有一个错误,阻止您从具有 X 射线视觉的沙箱访问 Worker。即使评估 typeof Worker 也会抛出异常。所以使用 worker 的唯一方法是从未包装的窗口中获取未包装的版本:

var echoWorker = new unsafeWindow.Worker("data:text/javascript," +
"self.onmessage = function(e) {\n" +
" self.postMessage(e.data);\n" +
"};"
);

当然你必须小心特殊字符。最好用 base64 对脚本进行编码:

var dataURL = 'data:text/javascript;base64,' + btoa(script);
var worker = unsafeWindow.Worker(dataURL);

或者你也可以使用 blob-urls:

var blob = new Blob([script], {type: 'text/javascript'});
var blobURL = URL.createObjectURL(blob);
var worker = new unsafeWindow.Worker(blobURL);
URL.revokeObjectURL(blobURL);

如果您真的想使用托管在不同域上的脚本,这不是问题,因为同源策略不适用于 GM_xmlhttpRequest:

function createWorkerFromExternalURL(url, callback) {
GM_xmlhttpRequest({
method: 'GET',
url: url,
onload: function(response) {
var script, dataURL, worker = null;
if (response.status === 200) {
script = response.responseText;
dataURL = 'data:text/javascript;base64,' + btoa(script);
worker = new unsafeWindow.Worker(dataURL);
}
callback(worker);
},
onerror: function() {
callback(null);
}
});
}

关于javascript - 是否可以在 Greasemonkey 脚本中使用 worker?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1549779/

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