1

我正在尝试使用我的 firefox/chrome/safari 扩展从网页中提取内容。捕获工作正常,但是当我捕获完整的网页时,需要很长时间并且 UI 被阻止。我想将捕获/DOM 解析代码移动到不同的线程(Web Worker)。但是网络工作者无权访问 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'中

4

1 回答 1

3

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

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

考虑使用数组处理。基本思想是将你需要做的工作分成不同的块,在完成工作块后,使用 Timer 定期将控制权交还给 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);
}
于 2013-05-28T17:45:24.207 回答