Gebeurtenisobjecten

Flash Player 9 of hoger, Adobe AIR 1.0 of hoger

Gebeurtenisobjecten hebben twee hoofddoelen in het nieuwe systeem voor gebeurtenisafhandeling. Het eerste is dat gebeurtenisobjecten feitelijke gebeurtenissen vertegenwoordigen door informatie over specifieke gebeurtenissen in een set eigenschappen op te slaan. Het tweede is dat gebeurtenisobjecten een set methoden bevatten waarmee u gebeurtenisobjecten kunt bewerken en het gedrag van het systeem voor gebeurtenisafhandeling kunt beïnvloeden.

Voor het mogelijk maken van toegang tot deze eigenschappen en methoden definieert de Flash Player-API een klasse Event die als basisklasse voor alle gebeurtenisobjecten fungeert. De klasse Event definieert een basisset eigenschappen en methoden die voor alle gebeurtenisobjecten van toepassing zijn.

In deze sectie worden eerst de eigenschappen en vervolgens de methoden van de klasse Event besproken. Ten slotte wordt uitgelegd waarom er subklassen van de klasse Event bestaan.

Eigenschappen van de klasse Event

De klasse Event definieert een aantal alleen-lezen-eigenschappen en constanten die belangrijke informatie over een gebeurtenisobject bevatten. Hiervan zijn met name de volgende belangrijk:

  • Gebeurtenisobjecttypen worden als constanten voorgesteld en in de eigenschap Event.type opgeslagen.

  • Een Booleaanse waarde geeft aan of u het standaardgedrag van een gebeurtenis kunt voorkomen. Deze waarde wordt opgeslagen in de eigenschap Event.cancelable.

  • In de resterende eigenschappen wordt informatie over de gebeurtenisstroom opgeslagen.

Gebeurtenisobjecttypen

Aan elk gebeurtenisobject is een gebeurtenistype gekoppeld. Gebeurtenistypen worden als tekenreekswaarden opgeslagen in de eigenschap Event.type. Het is handig om het type van een gebeurtenisobject te weten, zodat de code onderscheid kan maken tussen objecten van verschillende typen. De volgende code geeft bijvoorbeeld aan dat de listenerfunctie clickHandler() moet reageren op elk muisklikgebeurtenisobject dat aan myDisplayObject wordt doorgegeven:

myDisplayObject.addEventListener(MouseEvent.CLICK, clickHandler);

Er zijn meer dan twintig gebeurtenistypen gekoppeld aan de klasse Event zelf en deze worden vertegenwoordigd door constanten van de klasse Event. Enkele hiervan worden getoond in het volgende fragment van de definitie van de klasse Event:

package flash.events 
{ 
    public class Event 
    { 
        // class constants 
        public static const ACTIVATE:String = "activate"; 
        public static const ADDED:String= "added"; 
        // remaining constants omitted for brevity 
    } 
}

Met deze constanten kunt u op eenvoudige wijze verwijzen naar specifieke gebeurtenistypen. U moet deze constanten gebruiken in plaats van de tekenreeksen die deze vertegenwoordigen. Als de naam van een constante onjuist wordt gespeld in de code, wordt de fout door de compiler afgevangen. Als u echter tekenreeksen gebruikt, wordt een typefout mogelijk niet herkend bij compilatie, wat kan leiden tot onverwacht gedrag en fouten die moeilijk kunnen worden opgespoord. Bij het toevoegen van een gebeurtenislistener gebruikt u bijvoorbeeld de volgende code:

myDisplayObject.addEventListener(MouseEvent.CLICK, clickHandler);

en niet:

myDisplayObject.addEventListener("click", clickHandler);

Informatie over standaardgedrag

Door in de code de waarde van de eigenschap cancelable op te vragen, kunt u nagaan of standaardgedrag voor een bepaald gebeurtenisobject kan worden voorkomen. De eigenschap cancelable heeft een Booleaanse waarde die aangeeft of standaardgedrag kan worden voorkomen. Met de methode preventDefault() kunt u standaardgedrag dat aan een klein aantal gebeurtenissen is gekoppeld, voorkomen of annuleren. Zie Het standaardgedrag van gebeurtenissen annuleren onder Methoden van de klasse Event voor meer informatie.

Informatie over de gebeurtenisstroom

De resterende eigenschappen van de klasse Event bevatten belangrijke informatie over een gebeurtenisobject en de relatie hiervan tot de gebeurtenisstroom, zoals in de volgende lijst wordt beschreven:

  • De eigenschap bubbles bevat informatie over de fasen van de gebeurtenisstroom waaraan het gebeurtenisobject deelneemt.

  • De eigenschap eventPhase geeft aan wat de huidige fase in de gebeurtenisstroom is.

  • De eigenschap target bevat een verwijzing naar het gebeurtenisdoel.

  • De eigenschap currentTarget bevat een verwijzing naar het weergaveoverzichtobject dat momenteel het gebeurtenisobject verwerkt.

De eigenschap bubbles

Een gebeurtenis loopt omhoog (bubble in het Engels) als het gebeurtenisobject aan de terugkoppelfase van de gebeurtenisstroom deelneemt. Dit houdt in dat het gebeurtenisobject vanuit de doelnode en via de voorouders naar het werkgebied terugkeert. De eigenschap Event.bubbles bevat een Booleaanse waarde die aangeeft of het gebeurtenisobject aan de terugkoppelfase deelneemt. Aangezien alle gebeurtenissen in de terugkoppelfase ook aan de vastleg- en doelfase deelnemen, nemen deze gebeurtenissen aan alle drie fasen van de gebeurtenisstroom deel. Als de waarde true is, neemt het gebeurtenisobject aan alle drie de fasen deel. Als de waarde false is, neemt het gebeurtenisobject niet deel aan de terugkoppelfase.

De eigenschap eventPhase

U kunt de gebeurtenisfase van elk gebeurtenisobject bepalen aan de hand van de waarde van de eigenschap eventPhase. De eigenschap eventPhase bevat een geheel-getalwaarde zonder teken die een van de drie fasen van de gebeurtenisstroom voorstelt. De Flash Player-API definieert een aparte klasse EventPhase die drie constanten bevat die overeenkomen met de drie geheel-getalwaarden zonder teken, zoals in het volgende codefragment wordt getoond:

package flash.events 
{ 
    public final class EventPhase 
    { 
        public static const CAPTURING_PHASE:uint = 1; 
        public static const AT_TARGET:uint = 2; 
        public static const BUBBLING_PHASE:uint= 3; 
    } 
}

Deze constanten komen overeen met de drie geldige waarden van de eigenschap eventPhase. U kunt deze constanten gebruiken om de code beter leesbaar te maken. Als u er bijvoorbeeld voor wilt zorgen dat een functie met de naam myFunc() alleen wordt aangeroepen als het gebeurtenisdoel zich in de doelfase bevindt, kunt u de volgende code gebruiken om op deze voorwaarde te testen:

if (event.eventPhase == EventPhase.AT_TARGET) 
{ 
    myFunc(); 
}

De eigenschap target

De eigenschap target bevat een verwijzing naar het object dat het doel van de gebeurtenis is. In sommige gevallen is dit vrij duidelijk. Als een microfoon actief wordt, is het doel van het gebeurtenisobject bijvoorbeeld het microfoonobject. Als het doel zich echter in het weergaveoverzicht bevindt, moet u rekening houden met de hiërarchie van het weergaveoverzicht. Als een gebruiker bijvoorbeeld een muisklik uitvoert op een punt met overlappende weergaveoverzichtobjecten, kiezen Flash Player en AIR altijd het object dat het verst verwijderd is van het werkgebied als gebeurtenisdoel.

Voor veel complexe SWF-bestanden, vooral die waarbij zich veel kleinere onderliggende objecten op knoppen bevinden, kunt u de eigenschap target niet gebruiken, omdat deze naar een onderliggend object van een knop verwijst in plaats van naar de knop zelf. In die gevallen is het gebruikelijk om gebeurtenislisteners toe te voegen aan de knop en de eigenschap currentTarget te gebruiken, omdat deze wel naar de knop verwijst, terwijl de eigenschap target naar een onderliggend object van de knop kan verwijzen.

De eigenschap currentTarget

De eigenschap currentTarget bevat een verwijzing naar het object dat momenteel het gebeurtenisobject verwerkt. Hoewel het vreemd kan lijken om niet te weten welke node momenteel het door u bestudeerde gebeurtenisobject verwerkt, moet u niet vergeten dat u een listenerfunctie kunt toevoegen aan elk weergaveobject in de gebeurtenisstroom van dat gebeurtenisobject en dat de listenerfunctie op elke locatie kan worden geplaatst. Verder kan een bepaalde listenerfunctie aan verschillende weergaveobjecten worden toegevoegd. Hoe groter en complexer een project is, des te nuttiger de eigenschap currentTarget is.

Methoden van de klasse Event

Er bestaan drie categorieën methoden van de klasse Event:

  • Hulpprogrammamethoden, waarmee u kopieën van een gebeurtenisobject kunt maken of dit in een tekenreeks kunt omzetten

  • Gebeurtenisstroommethoden, waarmee u gebeurtenisobjecten uit de gebeurtenisstroom kunt verwijderen

  • Standaardgedragsmethoden, die standaardgedrag voorkomen of controleren of dit is voorkomen

Hulpprogrammamethoden van de klasse Event

De klasse Event kent twee hulpprogrammamethoden. Met de methode clone() kunt u kopieën van een gebeurtenisobject maken. Met de methode toString() kunt u een tekenreeksrepresentatie genereren van de eigenschappen van een gebeurtenisobject en de waarden hiervan. Beide methoden worden intern gebruikt door het gebeurtenismodelsysteem, maar worden voor algemeen gebruik aan ontwikkelaars aangeboden.

Voor gevorderde ontwikkelaars die subklassen van de klasse Event maken, moet u van beide hulpprogrammamethoden een versie overschrijven en implementeren om te zorgen dat de Event-subklasse correct werkt.

Gebeurtenisstroom stoppen

U kunt de methode Event.stopPropagation() of de methode Event.stopImmediatePropagation() aanroepen om te zorgen dat de tocht van een gebeurtenisobject door de gebeurtenisstroom wordt afgebroken. De twee methoden zijn bijna identiek en verschillen in het feit of de andere gebeurtenislisteners van de huidige node al dan niet mogen worden uitgevoerd:

  • De methode Event.stopPropagation() voorkomt dat het gebeurtenisobject naar de volgende node doorgaat, maar pas nadat eventuele andere gebeurtenislisteners op de huidige node zijn uitgevoerd.

  • De methode Event.stopImmediatePropagation() voorkomt ook dat het gebeurtenisobject naar de volgende node doorgaat, maar in dit geval mogen geen andere gebeurtenislisteners op de huidige node meer worden uitgevoerd.

Het aanroepen van deze methoden heeft geen effect op het feit of het standaardgedrag dat aan een gebeurtenis is gekoppeld, wordt uitgevoerd. Voor het voorkomen van standaardgedrag gebruikt u de standaardgedragsmethoden van de klasse Event.

Standaardgedrag voor een gebeurtenis annuleren

De twee methoden waarmee standaardgedrag kan worden geannuleerd, zijn preventDefault() en isDefaultPrevented(). U roept de methode preventDefault() aan om het standaardgedrag te annuleren dat aan een gebeurtenis is gekoppeld. Als u wilt controleren of preventDefault() al op een gebeurtenisobject is aangeroepen, roept u de methode isDefaultPrevented() aan, die de waarde true retourneert als de methode al is aangeroepen en false als dat niet het geval is.

De methode preventDefault() werkt alleen als het standaardgedrag van een gebeurtenis kan worden geannuleerd. U kunt controleren of dit het geval is door de API-documentatie voor dat gebeurtenistype te raadplegen of door met behulp van ActionScript de waarde van de eigenschap cancelable van het gebeurtenisobject op te vragen.

Als u het standaardgedrag annuleert, heeft dit geen effect op de voortgang van een gebeurtenisobject in de gebeurtenisstroom. Als u een gebeurtenisobject uit de gebeurtenisstroom wilt verwijderen, gebruikt u de gebeurtenisstroommethoden van de klasse Event.

Subklassen van de klasse Event

Voor veel gebeurtenissen is de in de klasse Event gedefinieerde standaardset van eigenschappen voldoende. Andere gebeurtenissen hebben echter unieke kenmerken die niet kunnen worden vastgelegd met de in de klasse Event gedefinieerde eigenschappen. Voor deze gebeurtenissen zijn in ActionScript 3.0 een aantal subklassen van de klasse Event gedefinieerd.

Elke subklasse bevat aanvullende eigenschappen en gebeurtenistypen die uniek zijn voor die gebeurteniscategorie. Gebeurtenissen die te maken hebben met muisinvoer, hebben bijvoorbeeld diverse unieke kenmerken die niet kunnen worden vastgelegd met de in de klasse Event gedefinieerde eigenschappen. De klasse MouseEvent breidt de klasse Event uit door tien eigenschappen toe te voegen die bepaalde informatie bevatten, zoals de locatie van de muisgebeurtenis en of bepaalde toetsen zijn ingedrukt tijdens de muisgebeurtenis.

Een subklasse van de klasse Event bevat ook constanten die de gebeurtenistypen vertegenwoordigen die aan de subklasse zijn gekoppeld. De klasse MouseEvent definieert bijvoorbeeld constanten voor verschillende muisgebeurtenistypen, waaronder de gebeurtenistypen click, doubleClick, mouseDown en mouseUp.

Zoals in de sectie over hulpprogrammamethoden van de klasse Event onder Gebeurtenisobjecten is beschreven, moet u bij het maken van een subklasse van de klasse Event de methoden clone() en toString() opheffen om functionaliteit te bieden die specifiek is voor de subklasse.