2012-04-24 6 views
1

単語のリスト(潜在的に6500ワード)に対して、読み込まれたページを検索し、一致を強調表示し、ホバーに同義語を表示するFirefoxアドオンを作成する必要があります。firefox addon sdkのバックグラウンドスレッドでpageModを実行しますか?

私は正規表現\ bMyWord \ bを使用している正規表現に基づいてdomと検索をトラバースするHightlightRegex.jsを使用しています。

主な問題は、検索語が頻繁に出現するページでアドオンをテストすると、Firefoxがしばらく(5〜6秒)ハングしてハイライトが表示されることです。これは1つの単語に対して起きているので、もし私が6500語を検索するとどうなるか想像できるでしょう。

バックグラウンドスレッドまたは非同期にpageModを実行し、UIをフリーズせずに一致する単語を強調表示する方法はありますか?

あなたは現在、アドオンタブを分離し、ブラウザ上で全体として実行するように結ばれていないhttps://builder.addons.mozilla.org/addon/1042263/latest/

でアドオンを見てすることができますが、私はそれはFirefoxがハングアップしないだろう。

できるだけ効率的に行う必要がありますので、提案は大歓迎です。

答えて

1

DOMは一般的にスレッドセーフではなく、メインスレッド以外からはアクセスできません。唯一の解決策は、小さなチャンクに分割し、setTimeout(..., 0)を使用して、次のチャンクを非同期で実行し、すべてをブロックすることなく行うことです。ウラジミールが示唆されているようにだけ回避するために、文書のテキストを検索する非同期コードを使用し、

https://addons.mozilla.org/en-US/developers/docs/sdk/1.6/packages/addon-kit/page-worker.html

そして:あなたが試みることができる

+0

もう少し詳しく教えてください。 setTimeoutで検索を実行しても、設定されたタイムアウト機能が実行されている間はブロックされません。ポイントを説明するための簡単な例は非常に便利です。 –

+0

@PankajKumar:はい、ブロックされます。そのため、単一のタイムアウトで小さなチャンクだけを処理する必要があります。次に、 'setTimeout()'を呼び出し、次のチャンクが処理される前にブラウザがイベントを処理できるようにする必要があります。 –

1

ことの一つは、ページをロードし、それを処理するために、ページのワーカーモジュールをuseingされますfirefoxをロックする。

1

ヒントとして、より良い解決策は、読み込みと書き込みの2つのDOM操作だけを同期させることです。ページ全体をリッピングするか(または、さらに良いのは、<body>のみ)、ハイライト表示を行う非同期のワーカーまたはスレッドに送る。作業が完了すると、ワーカーはイベントを発行し、強調表示されたコンテンツを渡します。このアドオンは現在ページに挿入できます。

このように、実行される同期操作は高速で安価ですが、残りはメインスレッドから非同期で行われます。しかし、canuckistanistaniは、ページをpage-workerにロードするように提案しました。ページを既にタブに読み込んでいるため、その必要はありません。偽のページを読み込んで実際のコンテンツを挿入するだけです。

関連する問題