2012-04-24 21 views
1

我必須製作一個Firefox插件,用於搜索加載頁面上的單詞列表(可能包含6500個單詞),並突出顯示匹配項並顯示懸停時的同義詞。在firefox addon sdk中運行pageMod後臺線程?

所以我使用HightlightRegex.js遍歷dom和基於正則表達式使用正則表達式搜索\ bMyWord \ b

最主要的問題是,當在有多次搜索詞出現的頁面上測試插件時,Firefox掛起一段時間(5-6秒),然後顯示高亮顯示。這發生在1個單詞中,所以我可以想象如果我搜索6500個單詞會發生什麼。

那麼有沒有什麼辦法可以在後臺線程或異步運行pageMod,並在不凍結UI的情況下突出顯示單詞?

你可以看看附加在https://builder.addons.mozilla.org/addon/1042263/latest/

目前該加載項是不依賴於單獨的選項卡,並運行作爲一個整體上的瀏覽器,但我懷疑這會導致Firefox掛起。

我需要儘可能有效地做到這一點,所以建議非常受歡迎。

回答

1

DOM通常不是線程安全的,您無法從主線程以外的任何地方訪問它。唯一的解決方案是將工作分解爲更小的塊,並使用setTimeout(..., 0)異步運行下一個塊,而不會阻塞所有內容。

+0

請您詳細說明一下嗎?即使我在setTimeout中執行搜索,在設置超時函數正在運行時也不會執行該搜索。一個簡單的例子來解釋這一點會很有幫助。 – 2012-04-25 05:12:47

+0

@PankajKumar:是的,它會阻止 - 這就是爲什麼只有一個小塊應該在一個超時處理。然後它應該調用'setTimeout()'並允許瀏覽器在處理下一個塊之前處理事件。 – 2012-04-25 05:19:41

1

正如canuckistani暗示的,更好的解決方案只需要兩個同步的DOM操作:讀取和寫入。翻閱整個頁面(或者,更好的辦法是隻有它的<body>)並將它發送到異步工作者或線程,這將執行突出顯示。完成後,工作人員發出一個事件並傳遞突出顯示的內容,該插件現在可以將其重新插入到頁面中。

這樣,唯一的同步操作是快速,廉價的操作,而其餘的操作是異步完成的,遠離主線程。但是,Canuckistani建議在page-worker中加載頁面:不需要這樣做,因爲頁面已經加載到標籤中。只需加載一個虛假的頁面並插入實際的內容。