一. 事件簡介
事件可以由外設觸發, 比如:鍵盤,鼠標, 也可能是外部輸入, 比如:web service的返回.
事件還能由組件的外觀和生命周期發生變化時觸發, 比如:組件的創建或者改變大小.
所有用戶與應用交互都會產生事件.用戶沒有直接與應用交互也可能產生事件, 比如:數據裝載完畢.
你可以在程序中使用事件監聽器監聽這些事件. 事件監聽器是函數方法用于響應指定的事件. 有時也稱之為事件處理器.
Flex的事件模型基于DOM3事件模型.
組件產生派發事件并消費(監聽)其他事件.如果一個對象想要了解其他對象事件的信息, 可以注冊一個監聽器.
當事件發生時,對象派發此事件到所有注冊過的監聽器中.
組件有Flex提供的內建事件. 也可以使用派發-監聽模型定義自己的事件監聽器, 并指定監聽器監聽何種事件.
二. 事件流簡介
當一個事件被派發出來時, 事件對象從根節點開始自上而下開始掃描display list, 一直到目標對象, 檢查每個節點是否有相應的監聽器.
目標對象指的是display list中產生事件的對象. 比如:
<mx:Panel>
<mx:HBox>
<mx:VBox>
<mx:Button />
</mx:VBox>
</mx:HBox>
</mx:Panel>
如何此時 resize了VBox, 則會從根(Application)開始, 下來檢查Panel, HBox, 直到目標對象-產生resize事件的VBox為止.
三. 事件的派發
Flex中可以通過dispatchEvent()方法手工派發事件, 所有UIComponent的子類都可以調用此方法.
語法:
objectInstance.dispatchEvent(new Event("event_type"):Boolean
參數event_type是Event對象的type屬性. 函數的返回值總是True.
可以使用此方法派發任意事件, 而不僅僅是用戶自定義事件, 比如: 可以派發一個Button的Click事件.
var result:Boolean = buttonInstance.dispatchEvent(new Event(MouseEvent.CLICK));
在Flex應用中不是必須對新派發的事件進行處理, 如果觸發了一個事件, 而沒有對應的Listener時,Flex忽略此事件.
如果想給Event對象添加新屬性, 就必須繼承Event類,然后定義新屬性
四.事件的傳播:
事件觸發后, Flex有3個檢測事件監聽器的階段, 3個階段的發生的順序如下:
1. 捕獲
2. 目標
3. 上浮
在任意一個階段, 節點們都有機會操作事件. 比如: 用戶點擊了一個在VBox中的Button,
在捕獲階段, Flex檢查Application對象(根節點)和VBox是否有監聽器處理此事件. Flex然后在目標階段觸發按鈕的監聽器.
在上浮階段, VBox和應用以與捕獲階段相反的順序再次獲得機會處理事件.
在ActionScript3.0中,你可以在任意目標節點上注冊事件監聽器. 但是部分事件會被直接傳給目標節點,比如Socket類.
捕獲階段的節點順序是從父節點到子節點的, 而上浮階段剛好相反.
捕獲事件缺省是關閉的,也就是說如果要捕獲事件, 必須顯式指定在捕獲階段進行處理.
每一個Event都有target和currentTarget屬性, 幫助跟蹤事件傳播的過程.
捕獲階段:
在捕獲階段,Flex在顯示列表中檢查事件的祖先是否注冊了事件的監聽器. Flex從根節點開始順序而下.
大多數情況中, 根節點是Application對象. 同時, Flex改變事件的currentTarget值.
缺省情況下, 在此階段,沒有容器監聽事件. use_capture參數的值是False,在此階段添加監聽的唯一方法是在調用add_listener時,
傳入一個為True值的use_capture參數, 比如:
myAccordion.addEventListener(MouseEvent.MOUSE_DOWN, customLogEvent, true);
如果是在Mxml中添加監聽, Flex設置此參數為False, 沒有辦法進行修改.
如果設置了use_capture為True, 那么事件將不會上浮. 如果既想捕獲又想上浮就必須調用 addEventListener兩次.
一次use_capture參數為true, 一次為false;
捕獲很少使用, 上浮的使用更為普遍.
目標階段:
在目標階段, Flex激發事件的監聽程序, 不檢查其他的節點.
上浮階段:
事件只在bubbles屬性為True時才進行上浮. 可以上浮的事件包括: change, click, doubleClick, keyDown, keyUp, mouseDown, mouseUp.
在上浮階段, Flex改變事件的currentTarget屬性, 而target屬性是初始派發事件的對象.
查詢事件階段:
使用事件的eventPhase可以獲得事件當前的階段,
1: CAPTURE_PHASE
2: AT_TARGET
3: BUBBLING_PHASE
示例: private function determineState(event:MouseEvent):Void { Debug.trace(event.eventPhase + ":" + event.currentTarget.id); }
停止傳播:
使用下面兩個函數停止事件的傳播:
stopPropagation()
stopImmediatePropagation()