De verschillen in gebeurtenisafhandeling in ActionScript 3.0 ten opzichte van eerdere versies

Flash Player 9 of hoger, Adobe AIR 1.0 of hoger

Het meest opvallende verschil tussen gebeurtenisafhandeling in ActionScript 3.0 ten opzichte van eerdere versies van ActionScript is dat er in ActionScript 3.0 slechts één systeem voor gebeurtenisafhandeling is, terwijl er in eerdere versies van ActionScript verschillende systemen voor gebeurtenisafhandeling zijn. In deze sectie wordt eerst een overzicht gegeven van hoe gebeurtenisafhandeling werkt in eerdere versies van ActionScript en wordt vervolgens besproken hoe gebeurtenisafhandeling is gewijzigd in ActionScript 3.0.

Gebeurtenisafhandeling in eerdere versies van ActionScript

Versies van ActionScript vóór ActionScript 3.0 kennen een aantal verschillende manieren om gebeurtenissen af te handelen:

  • Gebeurtenishandlers on() die direct op instanties Button en MovieClip kunnen worden geplaatst

  • Handlers onClipEvent() die direct op instanties MovieClip kunnen worden geplaatst

  • Eigenschappen van callback-functies, zoals XML.onload en Camera.onActivity

  • Gebeurtenislisteners die u registreert met de methode addListener()

  • De klasse UIEventDispatcher waarbij het DOM-gebeurtenismodel gedeeltelijk is geïmplementeerd

Al deze mechanismen kennen hun eigen voordelen en beperkingen. De handlers on() en onClipEvent() zijn eenvoudig te gebruiken. Het onderhoud van projecten is echter moeilijker, omdat code die direct op knoppen en filmclips is geplaatst, vaak lastig te vinden is. Callback-functies zijn ook eenvoudig te implementeren, maar u kunt slechts één callback-functie per gebeurtenis gebruiken. Gebeurtenislisteners zijn moeilijker te implementeren. U moet niet alleen een listenerobject en -functie maken, maar ook de listener registreren bij het object waardoor de gebeurtenis wordt gegenereerd. Door deze verhoogde overhead kunt u echter wel verschillende listenerobjecten maken en deze allemaal voor dezelfde gebeurtenis registreren.

Bij de ontwikkeling van componenten voor ActionScript 2.0 is een ander gebeurtenismodel ontstaan. Dit nieuwe model, dat in de klasse UIEventDispatcher is opgenomen, was gebaseerd op een subset van de DOM Events Specification. Voor ontwikkelaars die bekend zijn met gebeurtenisafhandeling voor componenten, is de overgang naar het nieuwe ActionScript 3.0-gebeurtenismodel relatief eenvoudig.

Helaas kent de syntaxis die door de verschillende gebeurtenismodellen wordt gebruikt, zowel overlap als verschillen. In ActionScript 2.0 kunnen sommige eigenschappen, zoals TextField.onChanged , als callback-functie maar ook als gebeurtenislistener worden gebruikt. Voor de syntaxis voor het registreren van listenerobjecten is het echter van belang of u een van de zes klassen gebruikt die ondersteuning bieden voor listeners, of de klasse UIEventDispatcher. Voor de klassen Key, Mouse, MovieClipLoader, Selection, Stage en TextField kunt u de methode addListener() gebruiken, maar voor gebeurtenisafhandeling voor componenten gebruikt u de methode addEventListener() .

Een andere complicatie bij het gebruik van verschillende gebeurtenisafhandelingsmodellen is dat het bereik van de gebeurtenishandlerfunctie veel kan verschillen, afhankelijk van het gebruikte mechanisme. Met andere woorden, de betekenis van het trefwoord this is niet consistent tussen de systemen voor gebeurtenisafhandeling.

Gebeurtenisafhandeling in ActionScript 3.0

ActionScript 3.0 introduceert één gebeurtenisafhandelingsmodel ter vervanging van de vele verschillende gebeurtenisafhandelingsmechanismen die in vorige versies van ActionScript bestaan. Het nieuwe gebeurtenismodel is gebaseerd op de DOM (Document Object Model) Level 3 Events Specification. Hoewel de bestandsindeling SWF niet specifiek voldoet aan de DOM-standaard, bestaan er voldoende overeenkomsten tussen het weergaveoverzicht en de DOM-structuur om implementatie van het DOM-gebeurtenismodel mogelijk te maken. In de hiërarchische DOM-structuur is een object in het weergaveoverzicht gelijk aan een node en de termen weergaveoverzichtobject en node worden hier door elkaar gebruikt.

De Flash Player- en AIR-implementatie van het DOM-gebeurtenismodel kent het concept standaardgedragingen. Een standaardgedrag is een handeling die door Flash Player of AIR wordt uitgevoerd als het normale gevolg van een bepaalde gebeurtenis.

Standaardgedrag

Code om op gebeurtenissen te reageren wordt meestal door ontwikkelaars geschreven. In sommige gevallen wordt gedrag echter zo vaak geassocieerd met een gebeurtenis dat dit gedrag automatisch door Flash Player of AIR wordt uitgevoerd, tenzij de ontwikkelaar code toevoegt om dit te annuleren. Aangezien dergelijk gedrag automatisch door Flash Player of AIR wordt uitgevoerd, worden deze gedragingen standaardgedragingen genoemd.

Als een gebruiker bijvoorbeeld tekst in een object TextField invoert, is de verwachting dat de tekst in dat TextField-object wordt weergegeven zó standaard dat het gedrag in Flash Player en AIR is ingebouwd. Als u niet wilt dat dit standaardgedrag optreedt, kunt u dit met het nieuwe systeem voor gebeurtenisafhandeling annuleren. Als een gebruiker tekst in een TextField-object invoert, wordt door Flash Player of AIR een instantie van de klasse TextEvent gemaakt die deze gebruikersinvoer vertegenwoordigt. Als u wilt voorkomen dat Flash Player of AIR de tekst in het TextField-object weergeeft, moet u die specifieke TextEvent-instantie benaderen en de methode preventDefault() van die instantie aanroepen.

Niet al het standaardgedrag kan worden voorkomen. Als een gebruiker bijvoorbeeld dubbelklikt op een woord in een TextField-object, wordt door Flash Player en AIR een MouseEvent-object gegenereerd. Het standaardgedrag, dat niet kan worden voorkomen, is dat het woord onder de cursor wordt gemarkeerd.

Aan een groot aantal gebeurtenisobjecttypen is geen standaardgedrag gekoppeld. Flash Player verzendt bijvoorbeeld een gebeurtenisobject connect wanneer een netwerkverbinding tot stand is gebracht, maar hieraan is geen standaardgedrag gekoppeld. In de API-documentatie voor de klasse Event en de subklassen hiervan worden alle gebeurtenistypen en al het hieraan gekoppelde standaardgedrag beschreven. In de documentatie wordt ook aangegeven of dat gedrag kan worden voorkomen.

Het is belangrijk om te begrijpen dat standaardgedragingen alleen gekoppeld kunnen zijn aan gebeurtenisobjecten die door Flash Player of AIR worden verzonden en dat deze niet bestaan voor gebeurtenisobjecten die via programmacode door ActionScript worden verzonden. U kunt bijvoorbeeld de methoden van de klasse EventDispatcher gebruiken om een gebeurtenisobject met type textInput te verzenden, maar aan dat gebeurtenisobject is geen standaardgedrag gekoppeld. Met andere woorden, Flash Player en AIR geven geen teken in een object TextField weer als resultaat van een gebeurtenis textInput die u via programmacode hebt verzonden.

Nieuw voor gebeurtenislisteners in ActionScript 3.0

Voor ervaren ontwikkelaars die de methode addListener() in ActionScript 2.0 gebruiken, kan het handig zijn de verschillen aan te geven tussen het gebeurtenislistenermodel van ActionScript 2.0 en het gebeurtenismodel van ActionScript 3.0. In de volgende lijst worden enkele belangrijke verschillen tussen de twee gebeurtenismodellen beschreven:

  • U kunt gebeurtenislisteners in ActionScript 2.0 in sommige gevallen met addListener() en in andere gevallen met addEventListener() toevoegen, terwijl u in ActionScript 3.0 in alle gevallen addEventListener() gebruikt.

  • ActionScript 2.0 kent geen gebeurtenisstroom, dus de methode addListener() kan alleen worden aangeroepen op het object dat de gebeurtenis uitzendt, terwijl in ActionScript 3.0 de methode addEventListener() op elk object dat deel uitmaakt van de gebeurtenisstroom kan worden aangeroepen.

  • In ActionScript 2.0 kunnen gebeurtenislisteners functies, methoden of objecten zijn, terwijl in ActionScript 3.0 alleen functies of methoden gebeurtenislisteners kunnen zijn.