Händelseflödet

Flash Player 9 och senare, Adobe AIR 1.0 och senare

Flash Player och AIR skickar händelseobjekt varje gång en händelse inträffar. Om händelsemålet inte finns med i visningslistan, skickar Flash Player eller AIR händelseobjektet direkt till händelsemålet. Flash Player skickar till exempel progress-händelseobjektet direkt till ett URLStream-objekt. Om händelsemålet däremot finns med i visningslistan, skickar Flash Player händelseobjektet till visningslistan och sedan förflyttar sig händelseobjektet igenom visningslistan till händelsemålet.

Händelseflödet beskriver hur ett händelseobjekt förflyttar sig i visningslistan. Visningslistan är ordnad i en hierarki ungefär som ett träd. Överst i visningslistans hierarki finns scenen, som är en särskild behållare för visningsobjekt och fungerar som visningslistans rot. Scenen representeras av klassen flash.display.Stage och går bara att komma åt via ett visningsobjekt. Varje visningsobjekt har en egenskap med namnet stage som refererar till scenen för det programmet.

När Flash Player eller AIR skickar ett händelseobjekt för en händelse som rör visningslistan gör händelseobjektet en rundresa från scenen till målnoden . DOM-händelsespecifikationen definierar målnoden som den nod som representerar händelsemålet. Målnoden är med andra ord visningslisteobjektet där händelsen inträffade. Om en användare till exempel klickar på ett visningslisteobjekt med namnet child1 , skickar Flash Player eller AIR ett händelseobjekt och använder child1 som målnod.

Händelseflödet är begreppsmässigt indelat i tre delar. Den första delen kallas för hämtningsfasen och består av alla noder från scenen till målnodens överordnade nod. Den andra delen kallas för målfasen och består enbart av målnoden. Den tredje delen kallas för bubblingsfasen. Bubblingsfasen består av noderna som påträffades på tillbakavägen från målnodens överordnade nod till scenen.

Namnen på faserna blir mer logiska om du tänker på visningslistan som en lodrät hierarki med scenen högst upp som i följande diagram:

Om en användare klickar på Child1 Node skickar Flash Player eller AIR ett händelseobjekt till händelseflödet. Som nedanstående bild visar börjar objektets resa vid Stage , rör sig nedåt till Parent Node , vidare till Child1 Node och ”bubblar” sedan tillbaka till Stage genom att passera genom Parent Node igen på vägen tillbaka till Stage .

I det här exemplet utgörs hämtningsfasen av Stage och Parent Node under den inledande resan nedåt. Målfasen utgörs av tiden vid Child1 Node . Bubblingsfasen utgörs av Parent Node och Stage när de påträffas under resan tillbaka uppåt till rotnoden.

Händelseflödet ger ett mer effektivt händelsehanteringssystem än det som tidigare fanns tillgängligt för ActionScript-programmerare. I tidigare versioner av ActionScript finns inte händelseflödet, vilket gör att händelseavlyssnare bara kan läggas in i objektet som genererar händelsen. I ActionScript 3.0 kan du lägga till händelseavlyssnare till valfri nod i händelseflödet och inte bara till målnoden.

Möjligheten att kunna lägga till händelseavlyssnare längs händelseflödet är användbart när en komponent i användargränssnittet består av flera objekt. Ett knappobjekt består till exempel ofta av ett textobjekt som fungerar som knappens etikett. Utan möjligheten att kunna lägga till en avlyssnare till händelseflödet skulle du behöva lägga till en avlyssnare till både knappobjektet och textobjektet för att se till att du meddelas om klickningshändelser som inträffar på knappen. Händelseflödet gör dock att du kan placera en enda händelseavlyssnare i knappobjektet som hanterar klickningshändelser som inträffar i textobjektet eller de områden av knappobjektet som inte är dolda av textobjektet.

Det finns vissa händelseobjekt som inte deltar i alla tre faserna av händelseflödet. Vissa typer av händelser, som enterFrame och init , skickas direkt till målnoden och deltar inte i varken hämtningsfasen eller bubblingsfasen. Andra händelser kan ha målobjekt som inte finns med i visningslistan, till exempel händelser som skickas till en instans av klassen Socket. Sådana händelseobjekt går även direkt till målobjektet utan att delta i hämtnings- och bubblingsfaserna.

För att ta reda på hur en viss typ av händelse fungerar kan du antingen läsa i API-dokumentationen eller undersöka händelseobjektets egenskaper. Hur du undersöker händelseobjektets egenskaper beskrivs i nästa avsnitt.