全面認識Flex事件機制

Web開發者發表於2012-03-05

Flex有很多值得學習的地方,本文就向大家簡單介紹一下Flex事件機制,主要包括事件流,自定義事件等內容,相信通過本文的簡單介紹你對Flex事件機制一定會有深刻的認識。

Flex事件機制

Flex事件機制是觀察者模式,即首先要註冊事件,事件分發後通過事件響應函式進行處理。

例如在AS3中:

button.addEventListener(“click”,onClick);//向button註冊一個click事件
internalfunctiononClick(evt:MouseEvent):void{txt.text=“clickabutton!”;}
//事件響應函式 

那麼註冊事件註冊什麼呢?通過addEventListener註冊函式的引數可以看出,首先需要註冊事件型別(第一個引數),然後註冊響應函式,即事件發生後需要做什麼事情,也就是說呼叫哪一個方法。

◆那麼響應函式需要什麼要求呢?

響應函式必須要一個引數,指明註冊的事件的事件型別,如上面的例子,我們註冊的是一個滑鼠事件型別,即滑鼠單擊事件。註冊的事件型別必須和響應函式的事件型別一致!

◆到底有哪些事件型別呢?

除了有系統預設的事件型別外,我們可以定義自己的事件和事件型別。簡單的說,事件型別就是定義在事件類的常量屬性。

Flex事件機制中的事件流

1.捕獲階段(從根節點到子節點,檢測物件是否註冊了監聽器,是則呼叫監聽函式) 2.目標階段(呼叫目標物件本身註冊的監聽程式) 3.冒泡階段(從目標節點到根節點,檢測物件是否註冊了監聽器,是則呼叫監聽函式)注:事件發生後,每個節點可以有2個機會(2選1)響應事件,預設關閉捕獲階段。從上到下(從根到目標)是捕獲階段,到達了目標後是目標階段,然後從目標向上返回是冒泡階段。

怎樣理解事件流?

當事件發生時,FLEX通過事件的分發器EventDispatcher進行事件分發,分發的順序是:從上往下到達目標,然後從下往上,從目標開始返回。如上面1、2、3所說的那樣,這裡就會有一個問題,在事件的流經過程中,不是目標的物件如果註冊了事件,也有了相應的事件響應函式,那麼不是目標的物件響應了事件的處理,這怎麼辦呢?由於上面說的那樣,addEventListener在只有如上兩個引數的牧人情況下是關閉捕獲階段的,也就是說事件流是從目標階段開始的,然後是冒泡階段,當出現容器包含控制元件的時候,可以使用判斷 if(evt.target==evt.currentTarget) 來確定當前事件流上的當前流經物件是否就是目標物件,如果是就進行相應的處理。

移除物件的事件流:removeEventListener(),引數與註冊事件相同。阻斷事件流中目標物件的後繼事件,即通過了目標階段後阻止冒泡階段: event類的方法:publicfunctionstopImmediatePropagation():void

Flex事件機制中的Event類

Event類作為建立Event物件的基類,當發生事件時,Event物件將作為引數傳遞給事件偵聽器。如MouseEvent、KeyboardEvent,更多的可以查參考手冊。

Event類有幾個常用的公共屬性:

是否冒泡:bubbles; 目標物件:target; 所處階段:eventPhase; 當前物件:currentTarget; 從參考手冊可以event類的建構函式:

Event()建構函式publicfunctionEvent(type:String,bubbles:Boolean=false,cancelable:Boolean=false) 建立一個作為引數傳遞給事件偵聽器的Event物件。引數type:String—事件的型別,可以作為Event.type訪問。 bubbles:Boolean(default=false)—確定Event物件是否參與事件流的冒泡階段。預設值為false。 cancelable:Boolean(default=false)—確定是否可以取消Event物件。預設值為false。在flash.events包中可以看見系統自帶的事件。

Flex事件機制中如何自定義事件

自定義事件,也就是向監聽器傳遞自己定義的事件型別,同時可以通過事件傳遞引數。

1.建立自定義事件名稱的Event

dispatchEvent(newEvent(“myEvnet”,true,false)); 

2.建立自定義事件類

PublicclassMyEventextendsEvent{
   ....    
} 

dispatchEvent是EventDispatcher的方法:publicfunctiondispatchEvent(event:Event):Boolean將事件排程到事件流中。事件目標是對其呼叫dispatchEvent()方法的EventDispatcher物件。這句話就是說是哪個物件呼叫dispatchEvent(),那麼該事件就會被分發到那個物件的事件流中,如果沒有指明物件,那麼預設為this物件,即應用程式。這時該事件被分發到應用程式物件的事件流中,而沒有分發到特定物件的事件流中。一旦兩個物件的不是父子關係(控制元件樹),那麼事件流不會在這兩個物件之間有聯絡,那麼事件不會被響應;如果是,則還是要響應。(這種情況dispatchEvent的引數Event物件的引數必須是三個,如上)。dispatchEvent就是說明有了新的事件,只要註冊了該事件,就可以響應。

來源:xinem csdn.net

相關文章