イベントバブリングは一般にどのように機能しますか?また、イベントの伝播と同義語ですか?


11

私は、イベント駆動型(サブ)システムでのイベントディスパッチの一般的な仕組みと原則に頭を包み込もうとしています。

たとえば、Javascript、Flash(Actionscript 2および3)で何度も使用し、一度にPHPで簡単なイベントディスパッチシステムを作成したこともありますが、イベントバブリングやその伝播。

最初の質問:
イベントバブリングはイベント伝播の同義語ですか?

2番目の質問:
イベントが「バブル」するとき、これはイベントがオブジェクトの階層を「移動」することを意味すると理解して正しいですか?

3番目の最も重要な質問:
質問2の私の理解が正しい場合。これは、一般的に実装されるオブジェクトの階層をどのように「上に」移動するのですか?
一般に、親オブジェクトは同じイベントをその親に「再送信」することを意味しますか(ルートオブジェクトに到達するまで)。そしてそうならば; 階層内のこれらすべてのオブジェクトは、これらのイベントの子をリッスンする必要がありますか、または親オブジェクトが子オブジェクトイベントのリスナーとして自分自身を登録する必要がないイベントバブリングについての理解に重要な原則がありませんか?

いくつかの簡単な擬似コードを使用してこれらの基本原理を説明できるとしたら、ありがたいです。


1
関連記事:イベントの順序
ジョナス

回答:


7

最初の質問:イベントバブリングはイベント伝播の同義語ですか?

いいえ。バブリングはイベント伝播の一種ですが、同義語として使用することはできません。伝播は、イベントを渡すための一般的な用語です。バブリングは、イベント伝播の特定の戦略です。

2番目の質問:イベントが「バブル」するとき、これはイベントがオブジェクトの階層を「移動」することを意味すると理解して正しいですか?

はい。バブリングとは、トンネリングとは対照的に、階層を上に移動することを意味します。つまり、最上位の要素またはルーティングから下に移動します。つまり、イベントを受信する次のオブジェクトは選択できます。

3番目の最も重要な質問:質問2の私の理解が正しい場合。これは、一般的に実装されるオブジェクトの階層をどのように「上に」移動するのですか?

とても簡単。ビジュアル階層では、コントロールは親/そのトップレベルのビジュアルへの参照を持っているか、どこかで取得できます。そのため、イベントをキャプチャするときは、親に通知するだけで、親に通知するなどです。

擬似コードは、任意のUIコントロールで次のようになります。

OnEvent(SomeEvent event)
{
   CallHandlersForEvent(event);
   if(HasParent && event.ContinueBubbling == true)
   {
       Parent.OnEvent(event);
   }
}

ブルーベリーフィールズが言ったように、次にイベントを受け取るのは直接の親である必要はありません。次のように実装することもできます。

OnEvent(SomeEvent event)
{
    CallHandlersForEvent(event);
    NextControl = VisualTree.GetVisualParent(this);
    if(NextControl != null && event.ContinueBubbling == true)
    {
       NextControl.OnEvent(event);
    }
}

+1擬似コードは私にとって非常に理にかなっています、ありがとう!(ところで、あなたの答えの残りの部分もそうです。)
まともなダブラー

@fireeyedboy:どういたしまして=)
ファルコン

1

最初の答え:

イベントバブリングは、イベントの伝播を導く特定のアルゴリズムの1つです。

2番目の答え:

いいえ、バブリングは必ずしも階層に関連しているわけではありません。オブジェクトが内部または他の場所でどのように表されるかは、アルゴリズムが適切に機能するために実際には重要ではありません。理想的には、イベントがバブルすると、画面の最も内側の可視要素から画面の最も外側の可視要素まで外側に拡大します。

第三の答え:

実装の詳細は、各(ブラウザ)の内部がどのように実装されているかによって大きく異なります。bubblingこのアルゴリズムは、画面上のビジュアルに依存します。カプセル化要素が継承階層で内部要素よりも高い場合、たとえば、言語の標準継承メカニズムを使用してバブリングを実装できます。しかし、それは必ずしも真実ではありません-内部構造と画面上の可視性の両方を解釈し、内部組織を無視しながらアルゴリズムに従ってイベントを伝播できる特殊なメカニズムを使用できます。


1
なぜあなたは言っているのですか:「バブルは必ずしもどの階層にも関連していません」。私の意見ではそうです。階層がなければ、バブルは発生しません。何らかのツリーが必要です。ツリー構造のないバブリングの例を挙げることができますか?「最も内側から最も外側に見える要素」までの例は、視覚的な階層です。
ファルコン

1
もちろん、本当に必要な場合は階層として解釈できます。視覚的要素と非視覚的要素を含む疎結合グラフと考えることを好みます。
ブルーベリー

2
しかし、その後、バブルの類推は失敗します。グラフでは、イベントはどこからでもルーティングできますが、バブリングは明らかに下から上へと進むためです。
ファルコン

任意のグラフでバブリングと呼ぶことはもうできないと思います。それは「イベントルーティング」と呼ばれ、その後私見と呼ばれます。
ファルコン

1
ファルコンは公平な点をいくつか挙げていると思います。バブリングは上に移動するもの(階層)と考えるのが合理的です。
まともなダブラー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.