Como o bubbling de eventos geralmente funciona e é sinônimo de propagação de eventos?

11

Estou tentando entender o funcionamento geral e os princípios do envio de eventos em (sub) sistemas orientados a eventos.

Embora eu o tenha usado em várias ocasiões, por exemplo, Javascript, Flash (Actionscript 2 e 3) e até tenha criado um sistema simples de envio de eventos em PHP para mim, ao mesmo tempo, eu nunca entendi realmente a ocorrência de eventos e / ou propagação tão bem.

Primeira pergunta:
borbulhar evento é sinônimo de propagação de evento?

Segunda pergunta:
Estou correto em meu entendimento de que quando um evento "borbulha", isso significa que ele é "movido" pela hierarquia de objetos?

Terceira e mais importante pergunta:
se meu entendimento na pergunta 2 está correto; como esse "subir" na hierarquia de objetos geralmente implementado?
Isso geralmente significa que o objeto pai "reenvia" o mesmo evento para seu pai (até atingir o objeto raiz)? E se; todos esses objetos na hierarquia precisam ouvir seus filhos para esses eventos, ou estou perdendo algum princípio vital no meu entendimento sobre a bolha de eventos, onde não há necessidade de permitir que o objeto pai os registre como ouvintes de eventos de objetos filhos?

Se você pudesse ilustrar esses princípios básicos por meio de algum pseudo-código simples, ficaria muito grato.

Dabbler decente
fonte
1
Artigo relacionado: Ordem do evento
Jonas

Respostas:

7

Primeira pergunta: borbulhar evento é sinônimo de propagação de evento?

Não. Bubbling é uma forma de propagação de evento, mas não pode ser usado como sinônimo. Propagação é um termo geral para a transmissão de um evento. Bubbling é uma estratégia específica de propagação de eventos.

Segunda pergunta: Estou certo de que, quando um evento "borbulha", isso significa que ele é "movido" pela hierarquia de objetos?

Sim. Bubbling significa que ele sobe na hierarquia, em oposição ao encapsulamento , o que significa que vai do elemento superior para baixo ou roteamento , o que significa que o próximo objeto a receber o evento pode ser o que você escolher.

Terceira e mais importante pergunta: se meu entendimento na pergunta 2 está correto; como esse "subir" na hierarquia de objetos geralmente implementado?

Bem fácil. Na sua hierarquia visual, os controles têm uma referência ao pai ou ao visual de nível superior ou podem obtê-lo em algum lugar. Portanto, quando capturam um evento, eles apenas notificam seu pai, que notifica seu pai, etc.

O pseudo-código é assim para qualquer controle de interface do usuário:

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

Como blueberryfields disse que não precisa ser o pai direto que recebe o evento a seguir. Você pode implementar assim também:

OnEvent(SomeEvent event)
{
    CallHandlersForEvent(event);
    NextControl = VisualTree.GetVisualParent(this);
    if(NextControl != null && event.ContinueBubbling == true)
    {
       NextControl.OnEvent(event);
    }
}
Falcão
fonte
+1 O pseudo-código faz muito sentido para mim, obrigado! (Como faz o resto de sua resposta, por sinal.)
Decent Dabbler
@fireeyedboy: De nada =)
Falcon
1

Primeira resposta:

Borbulhamento de eventos é um algoritmo específico que orienta a propagação de eventos.

Segunda resposta:

Não, a bolha não está necessariamente relacionada a nenhuma hierarquia. Como os objetos são representados internamente ou em outro lugar não importa realmente que o algoritmo funcione corretamente. Idealmente, quando um evento borbulha, ele se expande para fora do elemento visível mais interno na tela, até o elemento visível mais externo na tela.

Terceira resposta:

Os detalhes da implementação podem variar muito, dependendo de como as partes internas de cada (navegador) são implementadas. O bubblingalgoritmo depende dos recursos visuais na tela. Se um elemento encapsulante for mais alto na hierarquia de herança do que um elemento interno, a interferência pode ser implementada usando mecanismos de herança padrão no idioma, por exemplo. Mas isso não é necessariamente verdade - você pode ter um mecanismo especializado que possa interpretar as estruturas internas e sua visibilidade na tela e propagar eventos de acordo com o algoritmo, ignorando a organização interna.

blueberryfields
fonte
1
Por que você está dizendo: "borbulhar não está necessariamente relacionado a nenhuma hierarquia". Na minha opinião é. Sem hierarquia, não há bolhas. Deve haver algum tipo de árvore. Você pode citar um exemplo de bolhas sem uma estrutura de árvore? Seu exemplo "do elemento visível interno ao externo" é exatamente isso - uma hierarquia visual.
Falcon,
1
Claro, você pode interpretá-lo como uma hierarquia, se realmente quiser. Prefiro pensar nisso como um gráfico pouco acoplado, que inclui alguns elementos visuais e outros não visuais.
blueberryfields
2
Mas então a analogia borbulhante falha. Como em um gráfico, o evento pode ser roteado para qualquer lugar enquanto a borbulha claramente passa de baixo para cima.
Falcon,
Acho que você não pode mais chamá-lo de bolhas num gráfico arbitrário. Ele deve ser chamado de "roteamento de eventos" e depois imho.
Falcon,
1
Eu acredito que Falcon faz alguns pontos justos. Parece razoável pensar em borbulhar como algo que sobe (uma hierarquia).
Decent Dabbler