O fluxo de eventos

Flash Player 9 e posterior, Adobe AIR 1.0 e posterior

O Flash Player ou o AIR envia objetos de evento sempre que ocorre um evento. Se o destino do evento não estiver na lista de exibição, o Flash Player ou o AIR enviará o objeto diretamente para o destino. Por exemplo, o Flash Player envia o objeto de evento progress diretamente para um objeto URLStream. No entanto, se o destino do evento estiver na lista de exibição, o Flash Player enviará o objeto para a lista de exibição e esse objeto irá percorrer a lista até chegar ao destino.

O fluxo de evento descreve como um objeto de evento se move pela lista de exibição. A lista de exibição está organizada em uma hierarquia que pode ser descrita como uma árvore. No topo da hierarquia da lista de exibição está o palco, que é um contêiner especial de objeto de exibição que serve como raiz da lista de exibição. O palco é representado pela classe flash.display.Stage e só pode ser acessado por meio de um objeto de exibição. Cada objeto de exibição tem uma propriedade chamada stage que faz referência ao palco desse aplicativo.

Quando o Flash Player ou o AIR envia um objeto para um evento relacionado à lista de exibição, esse objeto de evento faz uma viagem de ida e volta do palco ao nó de destino . A especificação de eventos DOM define o nó de destino como o nó que representa o destino do evento. Em outras palavras, o nó de destino é o objeto da lista de exibição onde ocorreu o evento. Por exemplo, se o usuário clicar em um objeto da lista de exibição chamado child1 , o Flash Player ou o AIR enviará um objeto de evento usando child1 como nó de destino.

O fluxo de evento é dividido conceitualmente em três partes. A primeira parte é chamada de fase de captura; essa fase compreende todos os nós do palco ao pai do nó de destino. A segunda parte é chamada de fase de destino e consiste apenas no nó de destino. A terceira parte é chamada de fase de bolhas. A fase de bolhas é composta pelos nós encontrados na viagem de retorno do pai do nó de destino ao palco.

Os nomes das fases farão mais sentido se você pensar na lista de exibição como uma hierarquia vertical com o palco no topo, como mostra o diagrama a seguir:

Se o usuário clicar no nó Child1 , o Flash Player ou o AIR enviará um objeto ao fluxo de evento. Como mostra a imagem a seguir, a jornada do objeto começa no palco , vai até o nó pai , segue para o nó Child1 e volta ao palco , movendo-se pelo nó pai novamente até voltar ao palco .

Neste exemplo, a fase de captura inclui o palco e o nó pai durante a viagem de ida inicial. A fase de destino consiste no tempo gasto no nó Child1 . A fase de bolhas inclui o nó pai e o palco , pois ambos estão presentes na viagem de volta ao nó raiz.

O fluxo de evento contribui com um sistema de manipulação de eventos mais avançado do que o anteriormente disponível para os programadores no ActionScript. Nas versões anteriores do ActionScript, não existe o fluxo de evento, ou seja, os ouvintes de evento podem ser adicionados somente ao objeto que gera o evento. No ActionScript 3.0, é possível adicionar ouvintes de evento não só a um nó de destino, mas também a qualquer nó ao longo do fluxo de evento.

A possibilidade de adicionar ouvintes ao longo do fluxo de evento é útil quando um componente da interface do usuário tem mais de um objeto. Por exemplo, um objeto de botão normalmente contém um objeto de texto que serve como rótulo do botão. Sem poder adicionar um ouvinte ao fluxo de evento, seria necessário adicionar um ouvinte ao objeto de botão e ao objeto de texto para garantir o recebimento de notificações sobre eventos de clique que ocorrem em qualquer lugar no botão. No entanto, a existência do fluxo de evento permite colocar um único ouvinte no objeto de botão que manipula eventos de clique ocorridos no objeto de texto ou nas áreas do objeto de botão que não são obscurecidas pelo objeto de texto.

Porém, nem todos os objetos de evento participam das três fases do fluxo de evento. Alguns tipos de eventos, como enterFrame e init , são enviados diretamente para o nó de destino e não participam da fase de captura, nem da fase de bolhas. Outros eventos podem ser direcionados para objetos que não estão na lista de exibição, como eventos enviados para uma ocorrência da classe Socket. Esses objetos de evento também vão diretamente para o objeto de destino, sem participar das fases de captura e de bolhas.

Para descobrir como se comporta um tipo de evento específico, consulte a documentação da API ou examine as propriedades do objeto de evento. O exame das propriedades do objeto de evento está descrito na próxima seção.