Unterschiede der Ereignisverarbeitung in ActionScript 3.0 im Vergleich mit früheren Versionen

Flash Player 9 und höher, Adobe AIR 1.0 und höher

Der deutlichste Unterschied zwischen der Ereignisverarbeitung in ActionScript3 .0 und der in älteren ActionScript-Versionen besteht darin, dass es in ActionScript 3.0 nur ein System der Ereignisverarbeitung gibt, während die bisherigen ActionScript-Versionen über mehrere unterschiedliche Ereignisverarbeitungssysteme verfügten. Dieser Abschnitt beginnt mit einem Überblick über die Ereignisverarbeitung in früheren ActionScript-Versionen und behandelt dann die Änderungen in ActionScript 3.0.

Ereignisverarbeitung in früheren ActionScript-Versionen

In den ActionScript-Versionen vor ActionScript 3.0 gab es eine Reihe unterschiedlicher Arten der Ereignisverarbeitung:

  • on() -Ereignisprozeduren, die direkt für Button- und MovieClip-Instanzen definiert werden können

  • onClipEvent() -Ereignisprozeduren, die direkt für MovieClip-Instanzen definiert werden können

  • Eigenschaften von Callback-Funktionen wie XML.onload oder Camera.onActivity

  • Ereignis-Listener, die mit der addListener() -Methode registriert werden

  • Die UIEventDispatcher-Klasse, mit der das DOM-Ereignismodell teilweise implementiert wurde

Jeder dieser Mechanismen bietet jeweils Vorteile, hat jedoch auch Beschränkungen. Die Ereignisprozeduren on() und onClipEvent() sind einfach einzusetzen, können die spätere Pflege von Projekten jedoch erschweren, da direkt für Schaltflächen und Movieclips definierter Code unter Umständen schwer zu finden ist. Callback-Funktionen können ebenfalls einfach implementiert werden, sind jedoch auf jeweils eine Funktion pro Ereignis beschränkt. Die Implementierung von Ereignis-Listenern ist schwieriger. Es müssen nicht nur ein Listener-Objekt und eine Listener-Funktion erstellt werden, sondern der Listener muss auch in dem Objekt registriert werden, mit dem das Ereignis generiert wird. Durch diesen erhöhten Verwaltungsaufwand können Sie jedoch mehrere Listener-Objekte erstellen und alle für dasselbe Ereignis registrieren.

Die Entwicklung von Komponenten für ActionScript 2.0 brachte ein weiteres Ereignismodell mit sich. Dieses neue Modell, verkörpert durch die UIEventDispatcher-Klasse, basierte auf einem Teilbereich der DOM-Ereignisspezifikation. Für Entwickler, die mit der Komponentenereignisverarbeitung vertraut sind, gestaltet sich der Übergang zum neuen Ereignismodell von ActionScript 3.0 relativ problemlos.

Leider gibt es zahlreiche Überschneidungen bei der in den verschiedenen Ereignismodellen verwendeten Syntax sowie einige Abweichungen. Beispielsweise können in ActionScript 2.0 einige Eigenschaften wie etwa TextField.onChanged entweder als Callback-Funktion oder als Ereignis-Listener verwendet werden. Die Syntax zum Registrieren von Listener-Objekten unterscheidet sich jedoch in Abhängigkeit davon, ob Sie die UIEventDispatcher-Klasse oder eine der sechs Klassen verwenden, die Listener unterstützen. Für die Key-, Mouse-, MovieClipLoader-, Selection-, Stage- und TextField-Klassen wird die addListener() -Methode verwendet, für die Komponentenereignisverarbeitung jedoch die addEventListener() -Methode.

Eine weitere durch die unterschiedlichen Ereignisverarbeitungsmodelle hervorgerufene Schwierigkeit liegt darin, dass der Gültigkeitsbereich der Ereignisprozedurfunktion je nach verwendetem Mechanismus große Unterschiede aufweist. Mit anderen Worten, die Bedeutung des Schlüsselworts this ist in den jeweiligen Ereignisverarbeitungssystemen nicht konsistent.

Ereignisverarbeitung in ActionScript 3.0

Mit ActionScript 3.0 wird ein einziges Ereignisverarbeitungsmodell eingeführt, das die vielen unterschiedlichen Ereignisverarbeitungsmechanismen der Vorgängerversionen ersetzt. Das neue Ereignismodell beruht auf der DOM3-Ereignisspezifikation (Document Object Model Level 3). Obwohl sich das SWF-Dateiformat nicht speziell an den DOM-Standard hält, liegen genug Ähnlichkeiten zwischen der Anzeigeliste und der DOM-Struktur vor, um die Implementierung des DOM-Ereignismodells zu ermöglichen. Ein Objekt in der Anzeigeliste entspricht einem Knoten in der hierarchischen DOM-Struktur. Die Begriffe Anzeigelistenobjekt und Knoten werden im Folgenden synonym verwendet.

Die Flash Player- und AIR-Implementierung des DOM-Ereignismodells enthält ein neues Konzept: das Standardverhalten. Ein Standardverhalten ist eine Aktion, die in Flash Player bzw. AIR als normale Reaktion auf bestimmte Ereignisse ausgeführt wird.

Standardverhalten

Normalerweise sind Entwickler dafür zuständig, Code zu schreiben, mit dem auf Ereignisse reagiert wird. In einigen Fällen ist die Zuordnung eines Verhaltens zu einem Ereignis jedoch so üblich, dass Flash Player bzw. AIR das Verhalten automatisch ausführt, wenn der Entwickler nicht Code hinzufügt, um dies zu verhindern. Da das Ausführen dieser Verhalten in Flash Player bzw. AIR automatisch erfolgt, werden diese als Standardverhalten bezeichnet.

Wenn ein Benutzer beispielsweise Text in ein TextField-Objekt eingibt, wird in der Regel davon ausgegangen, dass dieser Text im TextField-Objekt angezeigt wird. Deshalb ist dieses Verhalten in Flash Player und AIR integriert. Wenn dieses Standardverhalten nicht auftreten soll, können Sie es mithilfe des neuen Ereignisverarbeitungssystems unterdrücken. Wenn Benutzer Text in ein TextField-Objekt eingeben, wird in Flash Player bzw. AIR eine Instanz der TextEvent-Klasse erstellt, die diese Benutzereingabe repräsentiert. Um zu verhindern, dass Flash Player bzw. AIR den Text im TextField-Objekt anzeigt, müssen Sie auf diese TextEvent-Instanz zugreifen und die entsprechende preventDefault() -Methode aufrufen.

Es können jedoch nicht alle Standardverhalten verhindert werden. Beispielsweise erzeugen Flash Player und AIR ein MouseEvent-Objekt, wenn ein Benutzer auf ein Wort in einem TextField-Objekt doppelklickt. Durch das Standardverhalten, das nicht unterdrückt werden kann, wird das Wort unter dem Mauszeiger markiert.

Vielen Ereignisobjekten ist kein Standardverhalten zugewiesen. Beispielsweise löst Flash Player ein Verbindungsereignis aus, wenn eine Netzwerkverbindung hergestellt wird, es gibt jedoch kein entsprechendes Standardverhalten. In der API-Dokumentation für die Event-Klasse und ihre Unterklassen sind alle Ereignistypen aufgeführt. Hier finden Sie alle zugewiesenen Standardverhalten sowie die Angabe, ob dieses Verhalten verhindert werden kann.

Es ist wichtig zu verstehen, dass Standardverhalten nur Ereignisobjekten zugeordnet sind, die von Flash Player bzw. AIR ausgelöst wurden. Für im ActionScript-Programmcode ausgelöste Ereignisobjekte sind keine Standardverhalten vorhanden. Sie können beispielsweise die Methoden der EventDispatcher-Klasse verwenden, um ein Ereignisobjekt vom Typ textInput auszulösen. Diesem Ereignisobjekt ist jedoch kein Standardverhalten zugeordnet. Das bedeutet, dass Flash Player udn AIR als Ergebnis eines vom Programmcode ausgelösten textInput -Ereignisses keine Zeichen in einem TextField-Objekt anzeigen.

Neues bei Ereignis-Listenern in ActionScript 3.0

Für Entwickler, die bereits Erfahrungen mit der addListener() -Methode in ActionScript 2.0 gesammelt haben, ist eine Übersicht der Unterschiede zwischen dem Ereignis-Listener-Modell von ActionScript 2.0 und dem Ereignismodell von ActionScript 3.0 hilfreich. Im Folgenden sind daher einige der wichtigsten Unterschiede zwischen den beiden Ereignismodellen aufgeführt:

  • Zum Hinzufügen von Ereignis-Listenern in ActionScript 2.0 wird in einigen Fällen addListener() und in anderen addEventListener() verwendet. In ActionScript 3.0 wird hingegen in allen Fällen addEventListener() eingesetzt.

  • In ActionScrip 2.0 gibt es keinen Ereignisablauf, d. h. die addListener() -Methode kann nur für das Objekt aufgerufen werden, das das Ereignis überträgt. Im Gegensatz dazu kann in ActionScript 3.0 die addEventListener() -Methode für jedes Objekt aufgerufen werden, das Bestandteil des Ereignisablaufs ist.

  • In ActionScript 2.0 können Ereignis-Listener entweder Funktionen, Methoden oder Objekte sein, während in ActionScript 3.0 als Ereignis-Listener nur Funktionen oder Methoden möglich sind.