6

そのため、最近質問に答えたところ、 OPは、DOMイベントについて次のことを回答に追加できるかどうかを尋ねました。

おそらく、それらが最初に実行されるだけでなく、最初のイベントが終了するまで後続のイベントがブロックされることを回答に追加することもできます。

さて、それを追加できますかDOM イベントでは、一度に 1 つのイベントが実行され、前のイベントが終了するのを待ってから次のイベントが開始されることを知っていますか?

少なくとも、ブラウザの JavaScript ではこれが常に当てはまることを知っていますか?

これに対する決定的な答えを見つけることは、これまでのところ驚くほど困難でした.「はい」と期待していましたが、それを見つけることができません.


明確化: ハンドラー内に他の非同期ハンドラーを追加したり、setTimeout やワーカーなどを呼び出したりすることについて質問しているわけではありません。私が求めているのは、イベント ハンドラーの実行順序が保証されているかどうか、および次のイベント ハンドラーが実行を終了した前のイベントのみを開始するかどうかだけです。良い答えは、信頼できる情報源 (できれば仕様) を引用することです。ここでのスレッド化については何もありません。

4

2 に答える 2

1

それは実際には、ハンドラーで何をするか、および最初のハンドラーが終了した瞬間をどのように定義するかによって異なります。

たとえば、eventHandler1 で同期操作のみを実行している場合、eventHandler1 が終了する前に eventHandler2 がトリガーされないことが確実です。その理由は、javascript がシングル スレッドであるためです。

しかし、次のようなシナリオを想像してください: button1 をクリックすると、実際に ajax リクエストを行う eventHandler1 がトリガーされます。そのシナリオでは、実際に「eventHandler1 の終わり」とは何だと思いますか? ajax リクエストが返された瞬間であれば、eventHandler1 が終了する前に eventHandler2 が確実に実行を開始 (および場合によっては終了) します。

簡単に言えば、同期のみの操作を行うときはいつでも、順序が保証されます。

コメントから追加:

http://www.w3.org/TR/DOM-Level-3-Events/#sync-asyncたとえば、「この仮想キュー内の各イベントは、前のイベントが伝播動作を完了するまで遅延する必要があります。またはキャンセルされました。」


さて、ここで「どのような種類のイベントについて話しているのか」という質問に戻りますか? 前に述べたように、非同期イベントの場合、順序が保証されていないことを確認してください。しかし、最初のジレンマはクリック イベントに関するもので、それは非同期ではなく同期でした。また、同期イベントのドキュメントには、次のように明確に記載されています。その他のイベント、DOM の変更、およびユーザー インタラクション。


はい、無保証です。シングルスレッド化されているjavascriptを追加すると、それらを同時に実行することはできません。しかし、はい、DOM について厳密に言えば、どちらが前に発生するかはまったく保証されません。


もう 1 つコメントします。まったく同じ DOM を使用している可能性がありますが、Java マルチスレッド環境からアクセスします。:) javascript のようにシングル スレッド環境で「保護」されていないため、独自のスレッド セーフな非同期イベント処理を実装する必要があります。したがって、結論は、私が見るように、DOM 仕様では同期イベントが fifo 実装されている必要があるということです。非同期イベントの実行は、スタック/スレッドの実装に依存します。Javascript では、2 つのハンドラーがオーバーラップできないことを意味しますが、Java では、たとえば、オーバーラップする必要はありません。

于 2013-09-16T16:27:58.177 に答える