¿Cómo funciona generalmente el burbujeo de eventos y es sinónimo de propagación de eventos?

11

Estoy tratando de entender el funcionamiento general y los principios del despacho de eventos en (sub) sistemas controlados por eventos.

Aunque lo he usado en bastantes ocasiones, por ejemplo, Javascript, Flash (Actionscript 2 y 3) e incluso he hecho un sistema simple de envío de eventos en PHP para mí en un momento, nunca he entendido realmente el burbujeo de eventos y / o propagación que bien.

Primera pregunta:
¿el evento burbujea sinónimo de propagación de eventos?

Segunda pregunta:
¿Estoy correcto en mi entendimiento de que cuando un evento "burbujea", esto significa que se "mueve" hacia arriba en la jerarquía de los objetos?

Tercera y más importante pregunta:
si mi comprensión en la pregunta 2 es correcta; ¿Cómo se implementa generalmente este "movimiento" en la jerarquía de objetos?
¿Significa generalmente que el objeto padre "redistribuye" el mismo evento a su padre (hasta que alcanza el objeto raíz)? Y de ser así; ¿Todos estos objetos en la jerarquía necesitan escuchar a sus hijos para estos eventos, o me estoy perdiendo algo del principio vital en mi comprensión sobre el burbujeo de eventos, donde no hay necesidad de permitir que el objeto padre los registre como oyentes de eventos de objetos hijos?

Si pudiera ilustrar estos principios básicos por medio de un pseudocódigo simple, estaría más que agradecido.

Dabbler decente
fuente
1
Un artículo relacionado: Orden de evento
Jonas

Respuestas:

7

Primera pregunta: ¿es el evento burbujeante sinónimo de propagación de eventos?

No. El burbujeo es una forma de propagación de eventos, pero no se puede usar como sinónimo. Propagación es un término general para transmitir un evento. El burbujeo es una estrategia específica de propagación de eventos.

Segunda pregunta: ¿Estoy correcto en mi entendimiento de que cuando un evento "burbujea", esto significa que se "mueve" hacia arriba en la jerarquía de los objetos?

Si. Burbujear significa que sube en la jerarquía, en lugar de hacer un túnel , lo que significa que va desde el elemento superior hacia abajo o enrutamiento , lo que significa que el siguiente objeto para recibir el evento puede ser cualquier cosa que elija.

Tercera y más importante pregunta: si mi comprensión en la pregunta 2 es correcta; ¿Cómo se implementa generalmente este "movimiento" en la jerarquía de objetos?

Muy fácil. En su jerarquía visual, los controles tienen una referencia a su elemento visual principal / superior o pueden obtenerlo en algún lugar. Entonces, cuando capturan un evento, simplemente lo notifican a su padre, que lo notifica a su padre, etc.

El pseudocódigo es así para cualquier control de IU:

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

Como dijo blueberryfields, no es necesario que sea el padre directo quien reciba el evento a continuación. También podría implementar de esta manera:

OnEvent(SomeEvent event)
{
    CallHandlersForEvent(event);
    NextControl = VisualTree.GetVisualParent(this);
    if(NextControl != null && event.ContinueBubbling == true)
    {
       NextControl.OnEvent(event);
    }
}
Halcón
fuente
+1 El pseudocódigo tiene mucho sentido para mí, ¡gracias! (Al igual que el resto de su respuesta, por cierto.)
Decente Dabbler
@fireeyedboy: De nada =)
Falcon
1

Primera respuesta:

El burbujeo de eventos es un algoritmo específico que guía la propagación de eventos.

Segunda respuesta:

No, el burbujeo no está necesariamente relacionado con ninguna jerarquía. La forma en que los objetos se representan internamente o en otro lugar no importa realmente para que el algoritmo funcione correctamente. Idealmente, cuando un evento burbujea, se expande hacia afuera desde el elemento visible más interno de la pantalla, hasta el elemento visible más externo de la pantalla.

Tercera respuesta:

Los detalles de implementación pueden variar mucho dependiendo de cómo se implementen las partes internas de cada (navegador). El bubblingalgoritmo depende de las imágenes en la pantalla. Si un elemento de encapsulación es más alto en la jerarquía de herencia que un elemento interno, el burbujeo podría implementarse utilizando mecanismos de herencia estándar en el lenguaje, por ejemplo. Pero eso no es necesariamente cierto: es posible que tenga un mecanismo especializado que pueda interpretar tanto las estructuras internas como su visibilidad en la pantalla, y propagar eventos de acuerdo con el algoritmo mientras ignora la organización interna.

blueberryfields
fuente
1
¿Por qué dice: "burbujear no está necesariamente relacionado con ninguna jerarquía"? En mi opinión lo es. Sin jerarquía no hay burbujas. Debe haber algún tipo de árbol. ¿Puedes nombrar un ejemplo de burbujeo sin una estructura de árbol? Su ejemplo "del elemento visible más interno al más externo" es solo eso: una jerarquía visual.
Falcon
1
Claro, puedes interpretarlo como una jerarquía si realmente quieres. Prefiero pensarlo como un gráfico débilmente acoplado, que incluye algunos elementos visuales y no visuales.
blueberryfields
2
Pero entonces la analogía burbujeante falla. Porque en un gráfico, el evento podría enrutarse a cualquier lugar, mientras que el burbujeo claramente va de abajo hacia arriba.
Falcon
Creo que ya no se puede llamar burbujeante en un gráfico arbitrario. Tiene que llamarse "enrutamiento de eventos" y luego en mi humilde opinión.
Falcon
1
Creo que Falcon hace algunos puntos justos. Suena razonable pensar en burbujear como algo que se mueve hacia arriba (una jerarquía).
Dabbler decente