1

Firefox / chrome/safari拡張機能を使用してWebページからコンテンツを抽出しようとしています。キャプチャは正常に機能しますが、完全なWebページをキャプチャすると、時間がかかり、UIがブロックされます。キャプチャ/DOM解析コードを別のスレッド(Webワーカー)に移動したい。ただし、WebワーカーはDOMにアクセスできません。これを回避する方法はありますか?

次のコードを使用して、スクリプトをWebページに挿入しています。

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にアクセスできません)

配列処理の使用を検討してください。基本的な考え方は、実行する必要のある作業をさまざまなチャンクに分割し、作業のチャンクに到達した後、タイマーを使用して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 に答える