2012-05-08 49 views
1

我想用我的Firefox/Chrome瀏覽器/ Safari瀏覽器插件來提取網頁中的內容。捕獲工作正常,但是當我捕獲完整的網頁時,需要很長時間並且UI被阻塞。我想將捕獲/ DOM解析代碼移到不同的線程(Web Worker)。但是網絡工作者無法訪問DOM。有沒有辦法解決這個問題?解析HTML 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」

+0

你所說的「提取」在這裏是什麼意思? –

+0

我想從當前選項卡中打開的網頁獲取html數據。我注入腳本到網頁使用Firefox中的下列API:http://pastebin.com/bzMnrnJ2 –

+0

你會怎樣想的數據看,一旦它被解析? – Jake

回答

1

如果工作你想執行需要與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); 
} 
+0

術語「陣列處理」實際上與此方法無關。這個解決方案的核心是有用的,因爲它使用'異步執行'# –

+1

@ WillemD'haeseleer從技術上講,您可能對術語是正確的。但是我覺得好像你在分裂頭髮,因爲我用外行人的話來解釋說,在每個工作塊後面用超時的方式控制DOM。 – 7wp

+0

你的解決方案本身很好,我的觀點是你不應該引入不存在的術語。你可以使用這個反饋來改善你的問題,甚至可以贏得我的讚賞。 –