Różnice obsługi zdarzeń w języku ActionScript 3.0 oraz w innych wersjach tego języka

Flash Player 9 i nowsze wersje, Adobe AIR 1.0 i nowsze wersje

Najbardziej widoczną różnicą między obsługą zdarzeń w ActionScript 3.0 a obsługą zdarzeń w poprzednich wersjach języka ActionScript jest to, że w języku ActionScript 3.0 istnieje tylko jeden system obsługi zdarzeń, a w poprzednich wersjach języka istnieje kilka różnych systemów obsługi zdarzeń. Niniejsza sekcja rozpoczyna się od przeglądu obsługi zdarzeń w poprzednich wersjach ActionScript, a następnie omawia zmiany obsługi zdarzeń w ActionScript 3.0.

Obsługa zdarzeń w poprzednich wersjach języka ActionScript

W wersjach języka ActionScript poprzedzających wersję ActionScript 3.0 dostępne były różne sposoby obsługi zdarzeń:

  • Moduły obsługi zdarzeń on() , które mogą być umieszczane bezpośrednio w instancjach Button i MovieClip

  • Moduły obsługi onClipEvent() , które mogą być umieszczane bezpośrednio w instancjach MovieClip

  • Właściwości funkcji wywołania zwrotnego, takie jak XML.onload i Camera.onActivity

  • Detektory zdarzeń zarejestrowane za pomocą metody addListener()

  • Klasa UIEventDispatcher, która częściowo implementowała model zdarzeń DOM.

Każdy z tych mechanizmów oferuje osobny zestaw zalet i ograniczeń. Moduł obsługi on() i onClipEvent() są łatwe w użyciu, ale sprawiają, że obsługa projektów jest trudniejsza, ponieważ kod umieszczany bezpośrednio na przyciskach i klipach filmowych jest trudny do znalezienia. Funkcje wywołania zwrotnego również można łatwo zaimplementować, ale wówczas użytkownik jest ograniczony tylko do jednej takiej funkcji dla danego zdarzenia. Implementacja detektorów zdarzeń jest trudniejsza — wymagają nie tylko utworzenia obiektu i funkcji modułu, ale również zarejestrowania detektora w obiekcie, który generuje zdarzenie. Jednak ten zwiększony nakład pracy umożliwia utworzenie kilku obiektów detektorów i zarejestrowanie ich dla jednego zdarzenia.

Wdrożenie składników dla języka ActionScript 2.0 było okazją do wprowadzenia innego modelu zdarzeń. Ten nowy model, wbudowany w klasę UIEventDispatcher, został oparty na podzestawie specyfikacji zdarzeń DOM. Dla programistów, którzy zapoznali się z obsługą zdarzeń składników, przejście do nowego modelu zdarzeń w języku ActionScript 3.0 powinno być bezproblemowe.

Niestety składnia wykorzystywana przez różne modele zdarzeń jest taka sama w niektórych aspektach i różni się w innych. Na przykład: w języku ActionScript 2.0 niektóre właściwości, takie jak TextField.onChanged , mogą być wykorzystywane jako funkcja wywołania zwrotnego lub jako detektor zdarzeń. Jednak składnia rejestrowania obiektów detektorów różni się w zależności od tego, czy używana jest jedna z sześciu klas, które obsługują detektory, czy klasa UIEventDispatcher. Dla klas Key, Mouse, MovieClipLoader, Selection, Stage i TextField używana jest metoda addListener() , ale dla obsługi zdarzeń składników należy używać metody o nazwie addEventListener() .

Inną zawiłością, do której powstania przyczyniły się różne modele obsługi zdarzeń, jest to, że zakres funkcji modułów obsługi zdarzeń różnił się znacznie w zależności od wykorzystywanego mechanizmu. Innymi słowy: znaczenie słowa kluczowego this nie było spójne w różnych systemach obsługi zdarzeń.

Obsługa zdarzeń w języku ActionScript 3.0

Program ActionScript 3.0 wprowadza pojedynczy model obsługi zdarzeń, który zastępuje wiele różnych mechanizmów obsługi zdarzeń, jakie istniały we wcześniejszych wersjach tego języka. Nowy model zdarzeń jest oparty na specyfikacji Document Object Model (DOM) Level 3 Events Specification. Format plików SWF nie jest zgodny ze standardem Document Object Model, jednak istnieją wystarczające podobieństwa między listą wyświetlania i strukturą DOM, które umożliwiają implementację modelu zdarzenia DOM. Obiekt na liście wyświetlania jest analogiczny do węzła w hierarchicznej strukturze DOM, a terminy obiekt listy wyświetlania i węzeł są stosowane zamiennie w niniejszej sekcji.

Implementacja modelu zdarzeń DOM w programach Flash Player i AIR obejmuje pojęcie zachowań domyślnych. Zachowanie domyślne to operacja, którą wykonuje program Flash Player lub AIR jako normalną konsekwencję niektórych zdarzeń.

Zachowania domyślne

Pisanie kodu, który będzie reagował na zdarzenia, jest zwykle zadaniem programistów. Jednak w niektórych przypadkach zachowanie jest do tego stopnia skojarzone ze zdarzeniem, że program Flash Player lub AIR automatycznie wykonuje działanie, chyba że programista doda odpowiedni kod w celu anulowania tego zachowania. Programy Flash Player i AIR automatycznie wykonują zachowanie, dlatego takie zachowania są określane jako domyślne.

Na przykład: gdy użytkownik wprowadzi tekst do obiektu TextField, oczekuje wyświetlenia tekstu w obiekcie TextField, a to oczekiwanie jest tak powszechne, że zachowanie zostało wbudowane do programów Flash Player i AIR. Jeśli użytkownik nie chce, aby takie domyślne zachowanie miało miejsce, może anulować je, korzystając z nowego systemu obsługi zdarzeń. Gdy użytkownik wprowadzi tekst do obiektu TextField, program Flash Player lub AIR tworzy instancję klasy TextEvent, która reprezentuje wprowadzanie danych przez użytkownika. Aby uniemożliwić programowi Flash Player lub AIR wyświetlanie tekstu w obiekcie TextField, należy uzyskać dostęp do konkretnej instancji TextEvent, a następnie wywołać metodę preventDefault() tej instancji.

Nie wszystkim zachowaniom domyślnym można zapobiegać. Na przykład: program Flash Player i AIR generuje obiekt MouseEvent, gdy użytkownik kliknie dwukrotnie słowo w obiekcie TextField. Domyślne zachowanie, któremu nie można zapobiec, jest takie, że słowo pod wskaźnikiem myszy zostaje wyróżnione.

Z wieloma typami obiektów zdarzeń nie są skojarzone domyślne zachowania. Na przykład: program Flash Player wywołuje obiekt zdarzenia połączenia po nawiązaniu połączenia z siecią, ale z tym obiektem nie jest skojarzone żadne zachowanie. Dokumentacja interfejsu API klasy Event i jej podklas obejmuje każdy typ zdarzenia i opisuje wszystkie skojarzone zachowania domyślne, a ponadto zawiera informacje o tym, czy zachowaniom można zapobiegać.

Ważne jest, że zachowania domyślne są skojarzone tylko z obiektami zdarzeń wywołanymi przez program Flash Player lub AIR i nie istnieją dla obiektów zdarzeń wywoływanych za pomocą kodu języka ActionScript. Na przykład: za pomocą metod klasy EventDispatcher można wywołać obiekt zdarzenia typu textInput , ale z tym obiektem zdarzenia nie będzie skojarzone zachowanie domyślne. Innymi słowy programy Flash Player i AIR nie wyświetlą znaku w obiekcie TextField w wyniku zdarzenia textInput wywołanego programistycznie.

Nowości w detektorach zdarzeń w języku ActionScript 3.0

Dla programistów, którzy mają doświadczenie w używaniu metody addListener() języka ActionScript 2.0, pomocne może być określenie różnic między modelem obsługi zdarzeń w języku ActionScript 2.0 a modelem w języku ActionScript 3.0. W poniższej liście przedstawiono kilka z najważniejszych różnic między tymi dwoma modelami:

  • W celu dodania detektorów zdarzeń w języku ActionScript 2.0 w niektórych przypadkach należy użyć metody addListener() , a w innych metody addEventListener() — natomiast w języku ActionScript 3.0 we wszystkich przypadkach należy korzystać z metody addEventListener() .

  • W języku ActionScript 2.0 nie ma strumienia zdarzeń, co oznacza, że metoda addListener() może być wywoływana tylko dla obiektu, który rozgłasza zdarzenie, natomiast w języku ActionScript 3.0 metoda addEventListener() może być wywoływana dla dowolnych obiektów, które są częścią strumienia zdarzeń.

  • W języku ActionScript 2.0 detektory zdarzeń mogą być funkcjami, metodami lub obiektami, a w języku ActionScript 3.0 tylko funkcje i metody mogą nasłuchiwać zdarzeń.