当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《是否可以在Greasemonkey脚本中使用worker?》经验,为你挑选了1个好方法。

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

这甚至可能吗?

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

例如,这不起作用:

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

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

无法加载脚本: http ://dl.getdropbox.com/u/93604/js/worker.js(nsresult = 0x805303f4)

显然存在一个限制,它不允许您从与调用脚本的基本URL无关的URL启动工作程序.你可以在这样的相对URL上加载一个worker脚本就好了:

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

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

我搞砸了吗?我是否应该放弃尝试在Greasemonkey脚本中使用工作人员?



1> Robert..:

多年来我一直认为不可能在通用汽车中使用网络工作者.当然,第一个想法是使用data-urls.但Worker构造函数似乎并不接受它们.

今天我再次尝试了它,它起初没有任何问题.只有当我开始使用GM API的功能时,Worker构造函数才会停止工作.

看似Firefox有一个错误,阻止您从Worker具有X射线视觉的沙箱访问.甚至评估都会typeof Worker引发异常.因此,使用worker的唯一方法是从unwrapped窗口获取未包装的版本:

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);
        }
    });
}

推荐阅读
yzh148448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有