0

私はFirefox拡張機能を書いています。これは(この質問の文脈で)2つのことを行っています:

  1. 特定のDOMイベント、つまりDOMContentLoadedおよびに登録しますDOMFrameContentLoaded
  2. イベントのコールバックで、DOM APIにアクセスし、特定の操作を実行します。

拡張機能は最初のイベント(またはのいずれDOMContentLoadedDOMFrameContentLoaded)を取得し、コールバック関数はいくつかのDOMAPIを呼び出します。呼び出しがDOMAPI呼び出しから拡張機能に戻る前に、別のイベントが発生し、コールバック関数が呼び出されるのを観察しています(拡張機能が大量のDOMを呼び出すため、特定のDOMAPIを絞り込むことができませんでしたAPI)。

これも可能ですか?ところで、私はWindows上のFirefox12を使用しています。を出力していますthreadManager.isMainThreadが、どちらの状況でも、イベントコールバックがメインスレッドで呼び出されています。

どんなポインタでも高く評価されます。

4

1 に答える 1

0

JavaScriptは一般的にシングルスレッドです。ただし、これは関数を再入力できないことを意味するものではありません(関数を呼び出すことが最も明白な例です)。したがって、別のイベントハンドラーの実行中に、イベントハンドラーを呼び出すことができます。AFAICTこれは、次の条件下で発生する可能性があります。

  • イベントハンドラーにより、(直接的または間接的に)別のイベントが生成されてディスパッチされます。特に、DOM操作はミューテーションイベントを引き起こします-そのようなイベントの処理は同期的に行われます。たとえば、呼び出しはイベントelement.setAttribute()を作成DOMAttrModifiedし、そのイベントはelement.setAttribute()、イベントハンドラーの実行を含め、戻る前に処理されます。
  • イベントハンドラは「一時停止」されます。これは通常、モーダルダイアログ(などalert())が開かれている場合に発生します。現在のイベントハンドラーは、他のイベントハンドラーをトリガーできる間、このダイアログが閉じられるのを待ちます。あまり一般的ではないケースは、yieldジェネレーターでのキーワードの使用です。
  • イベントハンドラーはnsIThread.processNextEvent()を呼び出します。この呼び出しは、キュー内の次のイベントに関連付けられたイベントハンドラーを実行する場合があります。技術的には、このポイントは前のポイントと同じです。呼び出し元がブロックされている間にイベントが処理されるように、内部で呼び出しますalert()nsIThread.processNextEvent()
于 2012-05-04T21:25:28.307 に答える