Come funziona generalmente il gorgoglio di eventi ed è sinonimo di propagazione di eventi?


11

Sto cercando di avvolgere la mia testa intorno al funzionamento generale e ai principi di dispacciamento di eventi in (sotto) sistemi guidati da eventi.

Anche se l'ho usato in parecchie occasioni, ad esempio Javascript, Flash (Actionscript 2 e 3) e ho anche creato un semplice sistema di invio di eventi in PHP per me stesso in una volta, non ho mai capito davvero il gorgoglio degli eventi e / o propagazione così bene.

Prima domanda: il
gorgoglio degli eventi è sinonimo di propagazione degli eventi?

Seconda domanda:
ho ragione nel capire che quando un evento "bolle", ciò significa che viene "spostato" nella gerarchia degli oggetti?

Terza e più importante domanda:
se la mia comprensione nella domanda 2 è corretta; come viene implementato questo "spostamento" nella gerarchia degli oggetti?
Significa generalmente che l'oggetto genitore "ridispaga" lo stesso evento al suo genitore (fino a quando non raggiunge l'oggetto radice)? E se così fosse; tutti questi oggetti nella gerarchia hanno bisogno di ascoltare i loro figli per questi eventi, o mi sto perdendo qualcosa di fondamentale principio nella mia comprensione del gorgoglio degli eventi, in cui non è necessario lasciare che l'oggetto genitore li registri come ascoltatori di eventi di oggetti figlio?

Se potessi illustrare questi principi di base per mezzo di un semplice pseudo codice, sarei più che grato.


1
Un articolo correlato: Ordine degli eventi
Jonas,

Risposte:


7

Prima domanda: il gorgoglio degli eventi è sinonimo di propagazione degli eventi?

No. Il bubbling è una forma di propagazione di eventi, ma non può essere usato come sinonimo. La propagazione è un termine generale per trasmettere un evento. Il bubbling è una strategia specifica di propagazione degli eventi.

Seconda domanda: ho ragione nel capire che quando un evento "bolle", ciò significa che viene "spostato" nella gerarchia degli oggetti?

Sì. Il gorgogliamento significa che sale nella gerarchia, al contrario del tunneling , il che significa che va dall'elemento superiore verso il basso o il routing , il che significa che l'oggetto successivo a ricevere l'evento può essere qualsiasi cosa tu scelga.

Terza e più importante domanda: se la mia comprensione nella domanda 2 è corretta; come viene implementato questo "spostamento" nella gerarchia degli oggetti?

Molto facile. Nella tua gerarchia visiva i controlli hanno un riferimento al loro genitore / il loro livello superiore visivo o possono ottenerlo da qualche parte. Quindi quando catturano un evento, ne informano semplicemente il suo genitore, il che lo notifica al suo genitore ecc.

Lo pseudo codice è come questo per qualsiasi controllo dell'interfaccia utente:

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

Come ha detto blueberryfields, non è necessario che sia il genitore diretto a ricevere l'evento successivo. Potresti implementare anche in questo modo:

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

+1 Lo pseudo codice ha molto senso per me, grazie! (A proposito, come del resto la tua risposta.)
Dabbler decente,

@fireeyedboy: Prego =)
Falcon,

1

Prima risposta:

Il bubbling di eventi è un algoritmo specifico che guida la propagazione degli eventi.

Seconda risposta:

No, il gorgoglio non è necessariamente correlato ad alcuna gerarchia. Il modo in cui gli oggetti sono rappresentati internamente o altrove non ha importanza per il corretto funzionamento dell'algoritmo. Idealmente, quando un evento bolle, si espande verso l'esterno dall'elemento più interno visibile sullo schermo, fino all'elemento più esterno visibile sullo schermo.

Terza risposta:

I dettagli di implementazione possono variare molto a seconda di come vengono implementati gli interni di ciascun (browser). L' bubblingalgoritmo dipende dagli elementi visivi sullo schermo. Se un elemento incapsulante è più elevato nella gerarchia dell'ereditarietà rispetto a un elemento interno, il gorgoglio potrebbe essere implementato utilizzando, ad esempio, meccanismi di ereditarietà standard nel linguaggio. Ma ciò non è necessariamente vero: potresti avere un meccanismo specializzato in grado di interpretare sia le strutture interne che la loro visibilità sullo schermo e propagare gli eventi secondo l'algoritmo ignorando l'organizzazione interna.


1
Perché stai dicendo: "il gorgoglio non è necessariamente correlato ad alcuna gerarchia". Secondo me lo è. Senza gerarchia non c'è gorgoglio. Ci deve essere una specie di albero. Puoi citare un esempio di gorgogliamento senza una struttura ad albero? Il tuo esempio "dall'elemento più interno a quello più esterno visibile" è proprio questo: una gerarchia visiva.
Falcon,

1
Certo, puoi interpretarlo come una gerarchia se vuoi davvero . Preferisco pensarlo come un grafico liberamente accoppiato, che include alcuni elementi visivi e alcuni non visivi.
Blueberryfields,

2
Ma poi l'analogia gorgogliante fallisce. Perché in un grafico l'evento potrebbe essere indirizzato ovunque mentre il gorgogliamento passa chiaramente dal basso verso l'alto.
Falcon,

Penso che non puoi più chiamarlo gorgogliare in un grafico arbitrario. Deve essere chiamato "instradamento degli eventi", quindi imho.
Falcon,

1
Credo che Falcon faccia alcuni punti giusti. Sembra ragionevole pensare al gorgoglio come qualcosa che sale (una gerarchia).
Dabbler decente,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.