1

我目前正在玩弄 Workers,它们非常整洁,但肯定缺少一件事:向 Worker 传递匿名函数的可能性。因为我手头有一些空闲时间,所以我想看看我是否能找到解决这个问题的办法。我认为实现这一目标的最明显方法是使用Blob,因此我设置了这个小脚本:

var blob = new Blob(['var getLastSeen = function(player) { \
                    $.getJSON("fetch.php?player=" + player, function(data){ \
                        if(data.online) \
                            postMessage("online"); \
                        else if(data.online == false) \
                            postMessage(data.lastSeen); \
                    }); \
                    };\
                    getLastSeen("AI@speedersclan.org");'],{ "type" : "text\/javascript" });

var worker = new Worker(window.URL.createObjectURL(blob));

worker.onmessage = function (Event) {
    document.getElementById("logDisplay").innerText = Event.data;
};

(getLastSeen 进行数据库查找以查看玩家上次登录的时间)

正如您可能注意到的那样,我需要 jQuery 来运行这个脚本,因此我想我只需在 Blob 的开头添加一小段代码:

var head= document.getElementsByTagName("head")[0]; \ 
var script = document.createElement("script"); \
script.type= "text/javascript"; \
script.src= "//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"; \
head.appendChild(script); \

我没有注意到,尽管在查看 Blob 的类型之后我应该立即注意到,没有办法与 DOM 交互,这意味着加载外部脚本显然是不可能的(至少使用我的方法我正在使用)。

(tl;dr) 所以我的问题是,“我如何将外部脚本加载到 blob 中,尽管我无法与 DOM 交互”?

编辑:我很清楚我不需要 jQuery 来处理一个简单的 Ajax 请求,我只是想知道它是否通常是可能的。

4

1 回答 1

1

importScripts能解决你的问题吗?https://developer.mozilla.org/en-US/docs/DOM/Using_web_workers#Importing_scripts_and_libraries

这就是您通常在 Worker 中导入库的方式。但是,在这种情况下,我认为您仍然无法导入 jquery,因为 jquery 需要访问 DOM。请参阅HTML Web Worker 和 Jquery Ajax 调用

于 2013-01-19T14:35:34.617 回答