Como a manipulação de eventos do ActionScript 3.0 difere das versões anteriores

Flash Player 9 e posterior, Adobe AIR 1.0 e posterior

A diferença mais notável entre a manipulação de eventos no ActionScript 3.0 e nas versões anteriores do ActionScript é o fato de que, no ActionScript 3.0, existe apenas um sistema para manipulação de eventos, enquanto nas versões anteriores existem diversos sistemas diferentes de manipulação de eventos. Esta seção começa com uma visão geral de como era a manipulação de eventos nas versões anteriores do ActionScript e, em seguida, discute como a manipulação de eventos foi alterada para o ActionScript 3.0.

Manipulação de eventos nas versões anteriores do ActionScript

As versões anteriores ao ActionScript 3.0 forneciam diversas maneiras diferentes para manipular eventos:

  • Manipuladores de eventos on() que podem ser colocados diretamente nas ocorrências de Button e de MovieClip

  • Manipuladores onClipEvent() que podem ser colocados diretamente nas ocorrências de MovieClip

  • Propriedades de função de retorno de chamada, como XML.onload e Camera.onActivity

  • Ouvintes de evento registrados ao usar o método addListener()

  • A classe UIEventDispatcher que implementou parcialmente o modelo de evento DOM.

Cada um desses mecanismos tem vantagens e desvantagens. Os manipuladores on() e onClipEvent() são fáceis de usar, mas dificultam a manutenção posterior dos projetos porque o código colocado diretamente nos botões e clipes de filme pode ser difícil de localizar. As funções de retorno de chamada também são simples de implementar, mas você só pode usar uma função por evento. Os ouvintes de evento são mais difíceis de implementar porque requerem não só a criação de um objeto de ouvinte e de uma função, mas também o registro do ouvinte com o objeto que gera o evento. No entanto, esse aumento da sobrecarga permite criar vários objetos de ouvinte e registrar todos eles para o mesmo evento.

O desenvolvimento de componentes para o ActionScript 2.0 gerou mais um modelo de evento. Esse novo modelo, incorporado na classe UIEventDispatcher, foi baseado em um subconjunto da especificação de eventos DOM. Os desenvolvedores familiarizados com a manipulação de eventos de componente acharão a transição para o modelo de evento do ActionScript 3.0 relativamente fácil.

Infelizmente, a sintaxe usada pelos diversos modelos de evento é diferente em alguns pontos. Por exemplo, no ActionScript 2.0, algumas propriedades, como TextField.onChanged , podem ser usadas como uma função de retorno de chamada ou um ouvinte de evento. No entanto, a sintaxe para registrar objetos de ouvinte é diferente, dependendo do uso de uma das seis classes que oferecem suporte aos ouvintes ou da classe UIEventDispatcher. Para as classes Key, Mouse, MovieClipLoader, Selection, Stage e TextField, use o método addListener() , mas, para a manipulação de eventos de componentes, use o método chamado addEventListener() .

Outra complexidade decorrente dos diferentes modelos de manipulação de eventos é o escopo da função do manipulador de eventos, que variava muito dependendo do mecanismo usado. Em outras palavras, o significado da palavra-chave this não era consistente entre os sistemas de manipulação de eventos.

Manipulação de eventos no ActionScript 3.0

O ActionScript 3.0 apresenta um único modelo de manipulação de eventos que substitui os diversos mecanismos diferentes que existiam nas versões anteriores da linguagem. O novo modelo de evento baseia-se na especificação de eventos DOM (Document Object Model) de nível 3. Embora o formato de arquivo SWF não estejam em conformidade especificamente com o padrão DOM, existem similaridades suficientes entre a lista de exibição e a estrutura do DOM que permitem a implementação do modelo de evento DOM. Um objeto na lista de exibição é equivalente a um nó na estrutura hierárquica DOM e os termos objeto da lista de exibição e são usados alternadamente nesta discussão.

A implementação do Flash Player e do AIR do modelo de evento DOM inclui um conceito chamado comportamento padrão. Um comportamento padrão é uma ação executada pelo Flash Player ou AIR como consequência normal de determinados eventos.

Comportamentos padrão

Os desenvolvedores são geralmente responsáveis por gravar o código que responde a eventos. No entanto, em alguns casos, como um comportamento normalmente é associado a um evento, o Flash Player ou o AIR o executa automaticamente a não ser que o desenvolvedor adicione algum código para cancelá-lo. Como o Flash Player ou o AIR exibe o comportamento automaticamente, tais comportamentos são chamados de padrão.

Por exemplo, quando um usuário insere um texto em um objeto TextField, a expectativa de que o texto será exibido nesse objeto TextField é tão comum que o comportamento é incorporado no Flash Player e no AIR. Se não desejar que esse comportamento padrão ocorra, cancele-o usando o novo sistema de manipulação de eventos. Quando o usuário insere o texto em um objeto TextField, o Flash Player ou o AIR cria uma ocorrência da classe TextEvent para representar essa entrada do usuário. Para impedir que o Flash Player ou o AIR exiba o texto no objeto TextField, acesse essa ocorrência específica de TextEvent e chame o método preventDefault() dessa ocorrência.

Nem todos os comportamentos padrão podem ser impedidos. Por exemplo, o Flash Player e o AIR geram um objeto MouseEvent quando o usuário clica duas vezes em uma palavra em um objeto TextField. O comportamento padrão, que não pode ser evitado, é a palavra realçada quando o cursor passa.

Vários tipos de objetos de evento não têm comportamentos padrão associados. Por exemplo, o Flash Player envia um objeto de evento connect quando uma conexão de rede é estabelecida, mas não há nenhum comportamento padrão associado a esse objeto. A documentação API da classe Event e das respectivas subclasses lista cada tipo de evento e descreve todo comportamento padrão associado e se esse comportamento pode ser impedido.

É importante mencionar que os comportamentos padrão são associados apenas aos objetos de evento enviados pelo Flash Player ou AIR, e não existem para objetos de evento enviados de modo programático pelo ActionScript. Por exemplo, você pode usar os métodos da classe EventDispatcher para enviar um objeto de evento do tipo textInput , mas esse objeto não terá nenhum comportamento padrão associado. Em outras palavras, o Flash Player e o AIR não exibirão um caractere em um objeto TextField em decorrência de um evento textInput enviado programaticamente.

Novidades dos ouvintes de evento do ActionScript 3.0

Para desenvolvedores familiarizados com o método addListener() do ActionScript 2.0, talvez seja útil descrever as diferenças entre o modelo de ouvinte de evento do ActionScript 2.0 e o do ActionScript 3.0. A lista a seguir descreve as principais diferenças entre os dois modelos de evento:

  • Para incluir ouvintes de evento no ActionScript 2.0, você usa addListener() em alguns casos e addEventListener() em outros, enquanto no ActionScript 3.0, addEventListener() é usado em todas as situações.

  • Não existe nenhum fluxo de evento no ActionScript 2.0, ou seja, o método addListener() pode ser chamado somente no objeto que transmite o evento. Já no ActionScript 3.0, o método addEventListener() pode ser chamado em qualquer objeto que faça parte do fluxo de evento.

  • No ActionScript 2.0, os ouvintes de evento podem ser funções, métodos ou objetos, enquanto que no ActionScript 3.0, apenas funções ou métodos podem ser ouvintes de evento.