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