Javascript 在web worker中解析HTML DOM

Javascript 在web worker中解析HTML DOM,javascript,html,firefox-addon,web-worker,Javascript,Html,Firefox Addon,Web Worker,我正在尝试使用firefox/chrome/safari扩展从网页中提取内容。捕获工作正常,但当我捕获整个网页时,需要很长时间,UI会被阻塞。我想将捕获/DOM解析代码移动到另一个线程(Web Worker)。但是web工作者没有访问DOM的权限。我有办法解决这个问题吗 我正在使用以下代码将脚本注入网页: function executeScript(script, messageKey, callback) { var wm = Components.classes["@moz

我正在尝试使用firefox/chrome/safari扩展从网页中提取内容。捕获工作正常,但当我捕获整个网页时,需要很长时间,UI会被阻塞。我想将捕获/DOM解析代码移动到另一个线程(Web Worker)。但是web工作者没有访问DOM的权限。我有办法解决这个问题吗

我正在使用以下代码将脚本注入网页:

function executeScript(script, messageKey, callback) {
        var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService(Components.interfaces.nsIWindowMediator);
        var mainWindow = wm.getMostRecentWindow("navigator:browser");
        mainWindow.gBrowser.selectedBrowser.messageManager.loadFrameScript(script, true);
        mainWindow.gBrowser.selectedBrowser.messageManager.addMessageListener(messageKey, callback);
    }

executeScript("chrome://extension/content/contentscript.js", "onSelectionReceived", onSelection);

所有的DOM处理都是在这个脚本“contentscript.js”中进行的。

如果您试图执行的工作需要与DOM交互,而且需要很长时间,并且您无法将其重构为不需要与DOM交互,那么有一种方法可以不使用WebWorkers

(因为正如您所发现的,WebWorkers没有访问DOM的权限)

考虑使用数组处理。基本思想是将需要执行的工作划分为不同的块,在完成reach块工作后,使用计时器定期将控制权返回给DOM(UI线程)

以下是阵列处理的基本示例:

function saveDocument(id){
    var tasks = [openDocument,writeText,closeDocument,updateUI]

    setTimeout(function(){

        //execute the next task
        var task = tasks.shift();
        task(id);

        //determine if there's more
        if (tasks.length > 0) {
            setTimeout(arguments.calee, 25);
        }
    }, 25);
}

这里的“提取”是什么意思?我试图从当前选项卡中打开的网页中获取html数据。我正在使用firefox中的以下api向网页中注入一个脚本:一旦数据被解析,您希望数据看起来如何?@Jake我正在向网页中注入脚本,然后尝试发送一个JSON对象和处理后的数据。JSON对象中的每个属性都是一个字符串。问题是我无法访问web worker中的DOM。如果有替代方案。请建议。@quad_损坏:不,访问DOM必须发生在主线程上。因此,您可能应该询问如何改进捕获代码,使其不会阻塞UI,而不是使用web workers来完成他们无法完成的任务。术语
数组处理
实际上与这种方法无关。这个解决方案的核心作用在于它使用了
异步执行
@WillemD'haeseleer,从技术上讲,这个术语可能是正确的。但我觉得你好像在吹毛求疵,因为我确实用外行的术语解释过,在每次工作之后,都要使用超时将控制权返回给DOM。你在it中的解决方案本身是好的,我的观点是,你不应该引入不存在的术语。你可以利用这些反馈来改进你的问题,甚至可能赢得我的支持票。