この質問はJavascriptイベント処理とフロー制御に関連していますが、それは一歩先を進んでいます。未解決のままの質問は、イベントが発生して制御がブラウザーに戻されたときに、ブラウザーが他のイベントを最初に処理することを決定できるか(他のスクリプトまたはユーザーアクションによって発生する)(A)、または常に私のイベントを直接処理するかどうかです。 (B)?
(B)の場合、イベントの発生とイベントハンドラーの間で何も変更されていないという事実に頼ることができますが、(A)は何も保証しないため、この質問は重要です。
私の最初の推測は(B)ですが、stopPropagation()とpreventDefault()は他にどのように機能しますか?しかし、考え直してみると、それは確かな証拠ではありません。
この問題の実際の例。リッチテキストエディター(ハロー)を変更していますが、次の仕様が必要です。
- 編集可能なテキスト(#txt)をクリックするとエディターがアクティブになり、#txtの外側をクリックすると非アクティブになります。halloは、これを実現するために#txtでぼかしイベントとフォーカスイベントを使用します。
- エディターをアクティブ化するとツールバーが開きます。ツールバーをマウスダウンすると(ボタンではなく)、#txtのblurイベントがエディターを非アクティブ化するのを防ぐフラグが設定されます。ツールバーはフォーカスを#textに戻します。
- ツールバーボタンをマウスダウンすると、エディターが非アクティブ化されなくなりますが、最初にクリックイベントまで待機し、アクションを実行してから、フォーカスを#txtに戻す必要があります。一部のアクションは即時(太字または斜体)ですが、他のアクションは追加のユーザー入力(ドロップダウンからの選択)が必要です。
- これらのボタンのいくつかはダイアログを開きます。
- ...そして、これらすべての要素(エディター、ツールバー、ダイアログ)をモジュール化して、簡単に拡張できるようにしたいです。
これで、ほとんどの場合、ダイアログを閉じるときに、フォーカスを#txtに戻す必要があります。ただし、ダイアログを開いてページ上の別の場所をクリックすると、エディターが閉じてツールバーが呼び出され、ダイアログも含まれます。この場合、ダイアログがフォーカスをエディターに戻すと、エディターが再度アクティブになります。
私が今理解している限り、イベント処理の順序は少なくとも決定論的です。一部のイベントが遅延し、他のイベントがより早く処理されることはありません。これが「同期」の意味です。例外はもちろん、ファイルのロードなどのイベントです。
プログラムコンポーネント、たとえばダイアログの観点からは、状況はまったく予測できない可能性があります。ハンドラーをopenイベントにバインドしてから、dialog( "open")を呼び出すことができますが、エディターが同じイベントにイベントハンドラーを持っているという理由だけで、呼び出しとハンドラーの間で何かが発生する可能性があります。
したがって、私の結論は、1)はい、予測可能ですが、2)これを実装するには高度なアーキテクチャが必要です。