Comment le bouillonnement d'événements fonctionne-t-il généralement et est-il synonyme de propagation d'événements?


11

J'essaie de comprendre les rouages ​​et les principes généraux de la répartition des événements dans les (sous-) systèmes pilotés par les événements.

Bien que je l'aie utilisé à plusieurs reprises, par exemple dans Javascript, Flash (Actionscript 2 et 3) et que j'ai même créé un simple système de répartition d'événements en PHP pour moi à un moment donné, je n'ai jamais vraiment compris le bouillonnement d'événements et / ou propagation aussi bien.

Première question: la
propagation d'événements est-elle synonyme de propagation d'événements?

Deuxième question:
ai-je raison de comprendre que lorsqu'un événement "bouillonne", cela signifie qu'il est "déplacé" dans la hiérarchie des objets?

Troisième et plus importante question:
si ma compréhension de la question 2 est correcte; comment cette "montée" de la hiérarchie des objets est-elle généralement mise en œuvre?
Cela signifie-t-il généralement que l'objet parent "redistribue" le même événement à son parent (jusqu'à ce qu'il atteigne l'objet racine)? Et si oui; tous ces objets de la hiérarchie doivent-ils écouter leurs enfants pour ces événements, ou manque-t-il quelque chose de vital dans ma compréhension de la propagation d'événements, où il n'est pas nécessaire que l'objet parent s'enregistre lui-même en tant qu'écouteurs d'événements d'objet enfant?

Si vous pouviez illustrer ces principes de base au moyen d'un pseudo-code simple, je vous en serais plus que reconnaissant.


1
Un article connexe: Ordre des événements
Jonas

Réponses:


7

Première question: la propagation d'événements est-elle synonyme de propagation d'événements?

Non. Le bullage est une forme de propagation d'événements, mais il ne peut pas être utilisé comme synonyme. La propagation est un terme général pour transmettre un événement. Le bullage est une stratégie spécifique de propagation d'événements.

Deuxième question: ai-je raison de comprendre que lorsqu'un événement "bouillonne", cela signifie qu'il est "déplacé" dans la hiérarchie des objets?

Oui. Le bullage signifie qu'il monte dans la hiérarchie, par opposition au tunneling , ce qui signifie qu'il va de l'élément supérieur vers le bas ou le routage , ce qui signifie que le prochain objet à recevoir l'événement peut être tout ce que vous choisissez.

Troisième et plus importante question: si ma compréhension de la question 2 est correcte; comment cette "montée" de la hiérarchie des objets est-elle généralement mise en œuvre?

Plutôt facile. Dans votre hiérarchie visuelle, les contrôles ont une référence à leur parent / leur visuel de niveau supérieur ou peuvent l'obtenir quelque part. Ainsi, lorsqu'ils capturent un événement, ils en informent simplement son parent, qui en informe son parent, etc.

Le pseudo-code est le suivant pour tout contrôle d'interface utilisateur:

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

Comme l'a dit blueberryfields, ce n'est pas nécessairement le parent direct qui reçoit l'événement ensuite. Vous pouvez également implémenter comme ceci:

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

+1 Le pseudo code a beaucoup de sens pour moi, merci! (Comme le reste de votre réponse, soit dit en passant.)
Decent Dabbler

@fireeyedboy: Vous êtes les bienvenus =)
Falcon

1

Première réponse:

Le bullage d'événements est un algorithme spécifique guidant la propagation des événements.

Deuxième réponse:

Non, le bouillonnement n'est pas nécessairement lié à une hiérarchie. La façon dont les objets sont représentés en interne ou ailleurs n'a pas vraiment d'importance pour que l'algorithme fonctionne correctement. Idéalement, lorsqu'un événement bouillonne, il se développe vers l'extérieur depuis l'élément visible le plus à l'intérieur de l'écran, jusqu'à l'élément visible le plus à l'extérieur de l'écran.

Troisième réponse:

Les détails de mise en œuvre peuvent varier considérablement en fonction de la façon dont les composants internes de chacun (navigateur) sont mis en œuvre. L' bubblingalgorithme dépend des visuels à l'écran. Si un élément d'encapsulation est plus élevé dans la hiérarchie d'héritage qu'un élément interne, le bullage peut être implémenté à l'aide de mécanismes d'héritage standard dans le langage, par exemple. Mais ce n'est pas nécessairement vrai - vous pouvez avoir un mécanisme spécialisé qui peut interpréter à la fois les structures internes et leur visibilité à l'écran, et propager les événements selon l'algorithme tout en ignorant l'organisation interne.


1
Pourquoi dites-vous: "le bouillonnement n'est pas nécessairement lié à une quelconque hiérarchie". À mon avis, c'est le cas. Sans hiérarchie, il n'y a pas de bouillonnement. Il doit y avoir une sorte d'arbre. Pouvez-vous citer un exemple de bouillonnement sans arborescence? Votre exemple «de l'élément visible le plus intérieur à l'élément visible le plus extérieur» n'est que cela - une hiérarchie visuelle.
Falcon

1
Bien sûr, vous pouvez l'interpréter comme une hiérarchie si vous le souhaitez vraiment . Je préfère le considérer comme un graphique faiblement couplé, qui comprend des éléments visuels et des éléments non visuels.
blueberryfields

2
Mais alors l'analogie bouillonnante échoue. Parce que dans un graphique, l'événement peut être routé n'importe où tandis que le bouillonnement va clairement de bas en haut.
Falcon

Je pense que vous ne pouvez plus l'appeler bouillonnement dans un graphique arbitraire. Il faut l'appeler "routage d'événement" puis à mon humble avis.
Falcon

1
Je pense que Falcon fait valoir quelques arguments. Cela semble raisonnable de penser au bouillonnement comme quelque chose qui monte (une hiérarchie).
Decent Dabbler le
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.