(轉載)冒泡事件理解
原文鏈接:http://bbs.9ria.com/viewthread.php?tid=59522發生事件時,該事件在事件流的三個階段中移動:
捕獲階段,該階段從顯示列表層次結構的頂部流動到目標節點之前的節點;
目標階段,該階段只包括目標節點;
冒泡階段,該階段從目標節點的后續節點沿顯示列表層次結構向上往回流動。
EventDispatcher 類實現 IEventDispatcher 接口,并且是 DisplayObject 類的基類。 EventDispatcher 類允許顯示列表上的任何對象都是一個事件目標,同樣允許使用 IEventDispatcher 接口的方法。
事件目標是 Flash ® Player 事件模型的重要組成部分。
事件目標是事件如何通過顯示列表層次結構這一問題的焦點
當發生鼠標單擊或按鍵等事件時,Flash Player 會將事件對象調度到從顯示列表根開始的事件流中
然后該事件對象在顯示列表中前進,直到到達事件目標,然后從這一點開始其在顯示列表中的回程
在概念上,到事件目標的此往返行程被劃分為三個階段:
、、捕獲階段包括從根到事件目標節點之前的最后一個節點的行程,
、、目標階段僅包括事件目標節點,
、、冒泡階段包括回程上遇到的任何后續節點到顯示列表的根。
通常,使用戶定義的類能夠調度事件的最簡單方法是擴展 EventDispatcher。 如果無法擴展(即,如果該類已經擴展了另一個類),則可以實現 IEventDispatcher 接口,創建 EventDispatcher 成員,并編寫一些簡單的掛鉤,將調用連接到聚合的 EventDispatcher 中。
二、說明 首先明確幾個概念
1、顯示列表根:假如你有abc 三個panel c在b中 b在a中這樣的嵌套關系 那么c-->b-->a a就是列表的根
2、目標:假如你在c上發了一個事件那么c就是事件的目標 有些復雜控件有click事件 不過發事件的目標不是它本身 那個currenttarget才是它本身
3、事件傳遞的流程:首先你派發事件在c上 事件首先從a-->b-->c-->b-->a這樣一個完整的循環
4、捕獲階段:事件在a-->b的這個階段(注意和b-->a不同)
5、目標階段 僅當事件到達c的時候
6、冒泡階段 b-->a這樣經過的階段
三、具體應用
當你在c上面派發了一個事件 然后你想在c的頂層a上監聽到
你可能這么做
首先你在c上this.dispatchEvent(new Event("cevent",false)); 這樣發了一個事件
藍色字體 意味著這個事件只會在捕獲和目標階段 a->b->c
然后你在a上監聽這個事件 a.addEventListener("cevent",function():void{trace("原始論壇目標發出的事件");},false);
紅色字體 意味著你打算 讓偵聽器只在目標或冒泡階段處理事件 就是c->b->a
四、簡單說來就是 你發出的事件走的是a->b->c的階段 而你偵聽只想偵聽b->a階段c只走了一次所以不會檢測到c的事件
任何一個false改成true就可以了
藍色改成true意味著事件在所有過程傳遞
紅色改成true意味著偵聽捕獲階段
再簡單說 新建事件不冒泡 默認偵聽只偵聽冒泡
posted on 2011-06-05 18:04 天空布藍 閱讀(537) 評論(0) 編輯 收藏 所屬分類: Flex4