首頁»Flash»全面認識Flex事件機制

全面認識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

QQ群:WEB開發者官方群(515171538),驗證消息:10000
微信群:加小編微信 849023636 邀請您加入,驗證消息:10000
提示:更多精彩內容關注微信公眾號:全棧開發者中心(fsder-com)
網友評論(共1條評論) 正在載入評論......
理智評論文明上網,拒絕惡意謾罵 發表評論 / 共1條評論
登錄會員中心
大发国际网址 鹤庆县| 宽城| 长子县| 大埔区| 台东县| 广河县| 抚松县| 左权县| 平遥县| 陇西县| 通渭县| 平安县| 德钦县| 民勤县| 会泽县| 英超| 徐汇区| 大足县| 呼图壁县| 遂宁市| 和硕县| 镇沅| 峨眉山市| 普宁市| 彰化县| 宜章县| 巴青县| 内丘县| 定日县| 安国市| 蒙阴县| 全椒县| 商丘市| 长丰县| 商河县| 马尔康县| 二连浩特市| 巢湖市| 周宁县| 阳原县| 永嘉县| 日土县| 东乡族自治县| 武义县| 天峻县| 夹江县| 大兴区| 周口市| 和龙市| 德格县| 鄂温| 临猗县| 河曲县| 浏阳市| 和静县| 普格县| 英德市| 普格县| 垦利县| 兰州市| 舟曲县| 荔波县| 铜山县| 东方市| 化隆| 枣强县| 胶州市| 江西省| 修水县| 永安市| 开封市| 漳平市| 沁水县| 大英县| 呼玛县| 肥东县| 靖西县| 宜川县| 五台县| 昭觉县| 林口县| 西贡区| 保靖县| 拜泉县| 呼玛县| 科技| 景泰县| 嫩江县| 湖南省| 津南区| 龙泉市| 随州市| 安西县| 凤城市| 英吉沙县| 三都| 开封市| 会理县| 卢氏县| 柘城县| 万全县| 旌德县| 留坝县| 宜春市| 赤水市| 岑巩县| 丰镇市| 三门峡市| 泸水县| 扬州市| 西贡区| 梁平县| 城市| 阳泉市| 潢川县| 天峨县| 织金县| 井陉县| 喀喇| 凯里市| 庄浪县| 怀柔区| 大竹县| 锡林浩特市| 盘锦市| 玉屏| 古蔺县| 兴和县| 福泉市| 江达县| 内乡县| 仙居县| 延川县| 林口县| 桐城市| 耒阳市| 三门县|