Flex事件機制是觀察者模式,即首先要註冊事件,事件分發後通過事件響應函數進行處理。
例如在AS3中:
button.addEventListener(“click”,onClick);//向button註冊一個click事件
internal function onClick(evt:MouseEvent):void{txt.text=“click a button!”;}//事件響應函數
那麼註冊事件註冊什麼呢?通過addEventListener註冊函數的參數可以看出,首先需要註冊事件類型(第一個參數),然後註冊響應函數,即事件發生後需要做什麼事情,也就是說調用哪一個方法。
那麼響應函數需要什麼要求呢?響應函數必須要一個參數,指明註冊的事件的事件類型,如上面的例子,我們註冊的是一個滑鼠事件類型,即按一下滑鼠事件。
註冊的事件類型必須和響應函數的事件類型一致!
到底有哪些事件類型呢?除了有系統預設的事件類型外,我們可以定義自己的事件和事件類型。
簡單的說,事件類型就是定義在事件類別的常量屬性。
事件流
1.捕獲階段(從根節點到子節點,檢測對象是否註冊了監聽器,是則調用監聽函數)
2.目標階段(調用目標對象本身註冊的監聽程式)
3.冒泡階段(從目標節點到根節點,檢測對象是否註冊了監聽器,是則調用監聽函數)
註:事件發生後,每個節點可以有2個機會(2選1)響應事件,預設關閉捕獲階段。
從上到下(從根到目標)是捕獲階段,到達了目標後是目標階段,然後從目標向上返回是冒泡階段。
怎樣理解事件流?
當事件發生時,FLEX通過事件的分發器EventDispatcher進行事件分發,分發的順序是:從上往下到達目標,然後從下往上,從目標開始返回。如上面1、2、3所說的那樣,這裡就會有一個問題,在事件的流經過程中,不是目標的對象如果註冊了事件,也有了相應的事件響應函數,那麼不是目標的對象響應了事件的處理,這怎麼辦呢?
由於上面說的那樣,addEventListener在只有如上兩個參數的牧人情況下是關閉捕獲階段的,也就是說事件流是從目標階段開始的,然後是冒泡階段,當出現容器包含控制項的時候,可以使用判斷
if(evt.target == evt.currentTarget)
來確定當前事件流上的當前流經對象是否就是目標對象,如果是就進行相應的處理。
移除對象的事件流:removeEventListener(),參數與註冊事件相同。
阻斷事件流中目標對象的後繼事件,即通過了目標階段後阻止冒泡階段:
event類的方法:public function stopImmediatePropagation():void
Event類
Event 類作為建立 Event 對象的基類,當發生事件時,Event 對象將作為參數傳遞給事件接聽程式。 如MouseEvent 、KeyboardEvent ,更多的可以查參考手冊。
Event類有幾個常用的公用屬性:
是否冒泡:bubbles;
目標對象:target;
所處階段:eventPhase;
當前對象:currentTarget;
從參考手冊可以event類的建構函式:
Event () 建構函式 public function Event(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包中可以看見系統內建的事件。
如何自訂事件
自訂事件,也就是向監聽器傳遞自己定義的事件類型,同時可以通過事件傳遞參數。
1.建立自訂事件名稱的Event
dispatchEvent(new Event(“myEvnet”,true,false));
2.建立自訂事件類別
Public class MyEvent extends Event{
….
}
dispatchEvent是EventDispatcher的方法:public function dispatchEvent(event:Event):Boolean將事件調度到事件流中。 事件目標是對其調用 dispatchEvent() 方法的 EventDispatcher 對象。
這句話就是說是哪個對象調用 dispatchEvent() ,那麼該事件就會被分發到那個對象的事件流中,如果沒有指明對象,那麼預設為this對象,即應用程式。這時該事件被分發到應用程式物件的事件流中,而沒有分發到特定對象的事件流中。一旦兩個對象的不是父子關係(控制項樹),那麼事件流不會在這兩個對象之間有聯絡,那麼事件不會被響應;如果是,則還是要響應。(這種情況dispatchEvent的參數Event對象的參數必須是三個,如上)。dispatchEvent就是說明有了新的事件,只要註冊了該事件,就可以響應。