Flujo de eventos

Flash Player 9 y posterior, Adobe AIR 1.0 y posterior

Flash Player o AIR distribuyen objetos de evento siempre que se produce un evento. Si el destino del evento no está en la lista de visualización, Flash Player o AIR distribuyen el objeto de evento directamente al destino del evento. Por ejemplo, Flash Player distribuye el objeto de evento progress directamente a un objeto URLStream. Sin embargo, si el destino del evento está en la lista de visualización, Flash Player distribuye el objeto de evento en la lista de visualización, de modo que recorre la lista hasta llegar al destino del evento.

El flujo del evento describe el modo en el que un objeto de evento se desplaza por la lista de visualización. La lista de visualización se organiza en una jerarquía que puede describirse como un árbol. En la parte superior de la jerarquía de la lista de visualización se encuentra el objeto Stage, que es un contenedor de objeto de visualización especial que actúa como raíz de la lista de visualización. El objeto Stage se representa mediante la clase flash.display.Stage y solo es posible acceder a él a través de un objeto de visualización. Todos los objetos de visualización tienen una propiedad llamada stage que hace referencia al objeto Stage de esa aplicación.

Cuando Flash Player o AIR distribuyen un objeto de evento para un evento relacionado con la lista de visualización, este realiza un viaje de ida y vuelta desde el objeto Stage hasta el nodo de destino . La especificación de eventos DOM define el nodo de destino como el nodo que representa el destino del evento. Dicho de otro modo, el nodo de destino es el objeto de la lista de visualización en el que se ha producido el evento. Por ejemplo, si un usuario hace clic en un objeto de lista de visualización denominado child1 , Flash Player o AIR distribuirán un objeto de evento usando child1 como nodo de destino.

El flujo del evento se divide conceptualmente en tres partes. La primera parte se llama fase de captura y consta de todos los nodos desde el objeto Stage hasta el elemento principal del nodo de destino. La segunda parte se llama fase de destino y consiste solamente en el nodo de destino. La tercera parte se llama fase de propagación. La fase de propagación consta de los nodos encontrados en el viaje de vuelta desde el elemento principal del nodo de destino hasta el objeto Stage.

Los nombres de las fases cobran más sentido imaginando la lista de visualización como una jerarquía vertical con el objeto Stage en la parte superior, según se muestra en el diagrama siguiente:

Si un usuario hace clic en Child1 Node , Flash Player o AIR distribuyen un objeto de evento en el flujo del evento. Como muestra la imagen siguiente, el viaje del objeto empieza en Stage , desciende hasta Parent Node , luego avanza hasta Child1 Node y, finalmente, se propaga de vuelta hasta Stage cruzando de nuevo Parent Node en su vuelta a Stage .

En este ejemplo, la fase de captura consta de Stage y Parent Node durante el viaje descendente inicial. La fase de destino está compuesta por el tiempo empleado en Child1 Node . La fase de propagación consta de Parent Node y Stage , según se encuentran durante el viaje ascendente de vuelta hasta el nodo raíz.

El flujo del evento contribuye a lograr un sistema de gestión de eventos con mayores prestaciones que el que tenían anteriormente a su disposición los programadores de ActionScript. En las versiones anteriores de ActionScript, el flujo del evento no existe, de modo que los detectores de eventos solo se pueden añadir al objeto que genera el evento. Por contra, en ActionScript 3.0, es posible añadir detectores de eventos no solo a un nodo de destino, sino también a cualquier nodo que pertenezca al flujo del evento.

La posibilidad de añadir detectores de eventos a lo largo del flujo del evento resulta útil cuando un componente de la interfaz de usuario consta de más de un objeto. Por ejemplo, un objeto de botón suele contener un objeto de texto que actúa como etiqueta del botón. Sin la capacidad de añadir un detector al flujo del evento, sería necesario añadir un detector tanto al objeto de botón como al objeto de texto para garantizar que se reciben las notificaciones de eventos de clic que se producen en cualquier punto del botón. No obstante, gracias al flujo del evento es posible colocar un único detector de eventos en el objeto de botón para controlar los eventos de clic que se produzcan tanto en el objeto de texto como en las áreas del objeto de botón que no estén cubiertas por el objeto de texto.

Sin embargo, no todos los objetos participan en las tres fases del flujo del evento. Algunos tipos de eventos, como enterFrame e init , se distribuyen directamente al nodo de destino y no participan ni en la fase de captura ni en la de propagación. Otros eventos pueden tener como destino objetos que no aparecen en la lista de visualización, como los eventos distribuidos a las instancias de la clase Socket. Estos objetos de evento también van directamente al objeto de destino sin participar en las fases de captura y propagación.

Para conocer el comportamiento de un tipo particular de evento, se puede consultar la documentación de la API o examinar las propiedades del objeto de evento. En la siguiente sección se explica cómo examinar las propiedades del objeto de evento.