Flex事件機制

2021-09-30 07:07:27 字數 2586 閱讀 2178

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

例如在as3中:

button.addeventlistener(「click」,onclick);//向button註冊乙個click事件

internal function onclick(evt:mouseevent):void//事件響應函式

那麼註冊事件註冊什麼呢?通過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就是說明有了新的事件,只要註冊了該事件,就可以響應。

Flex事件機制

事件流按執行流程分為3步 1 捕獲階段 捕獲事件 capturing,從根節點開始順序而下,檢測每個節點是否註冊了 同時,flex 將事件物件的currenttarget 值改為當前正在檢測的物件。如果註冊了 則呼叫監聽函式。2 目標階段 檢測目標的 targeting 觸發在目標物件本身註冊的監聽...

Flex事件機制 2

event類方法 1 實用程式方法 clone event formattostring classname string,parameters string tostring string 2 事件流方法 stopimmediatepropagation void stoppropagation ...

Flex中的事件機制

件是乙個非常有用的功能,通常用於資訊傳遞互動大大提高程式編寫的靈活性。在高階語言中都會整合這方面特性 flex也不例外幾乎所有控制項中都整合了大量的事件,如果button的click事件等。但實際應用中控制項自有的事件是不能滿真實需要的,特別在自己編寫自定義控制項時,自定義控制項內部資訊的改變如何及...