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ń.
|
|
|