[转]AS3事件流的研究结果
http://www.flashas.net/asbc/20090215/3921.html
AS3的 事件流就三个阶段,捕获 > 目标 > 冒泡
而在鼠标事件中,共有10种鼠标事件,分别如下:
点击事件: MouseEvent.CLICK ,MouseEvent.DOUBLE_CLICK
按键事件: MouseEvent.MOUSE_DOWN ,MouseEvent.MOUSE_UP
悬停事件: MouseEvent.MOUSE_OVER ,MouseEvent.MOUSE_OUT ,MouseEvent.ROLL_OVER ,MouseEvent.ROLL_OUT
移动事件: MouseEvent.MOUSE_MOVE
滚轮事件: MouseEvent.MOUSE_WHEEL
最令我不解的就是
悬停事件: MOUSE_OVER ,MOUSE_OUT ,ROLL_OVER ,ROLL_OUT
它们的具体工用是相似的
MOUSE_OVER = ROLL_OVER
MOUSE_OUT = ROLL_OUT
唯一不同的是前者参与事件流的冒泡阶段,而后者则不参加,
黑羽书上的例子类似,一个内部有文本框的按钮,
MOUSE_OVER ,MOUSE_OUT 事件中,鼠标移到按钮上,会触发over事件,当鼠标继续移,移到按钮里的文本上时,
就会触发文本的MOUSE_OVER事件,同一时间,按钮的MOUSE_OUT事件也会触发
而如果使用ROLL_OVER ,ROLL_OUT呢,这种情况下,鼠标移入按钮后,只要不移出按钮范围,按钮的OUT事件是不会触发的.
(________________________________
//括号内的内容为后期补充,实然是最终结果,建议先跳过看后面的,回头再看本段文字
此处我掉入了一个误区,不明白为什么移上子mc会触发移出事件,然后又触发移入事件,
其实不然,是事件流的原因,因为事件流机制默认是在冒泡阶段侦听的
所以整个流程解析就是,
1.先是鼠标移入按钮范围,触发按钮mc的①MOUSE_OVER事件,向上冒泡,没有其它对象侦听了,
2.鼠标继续移,移入内部影片剪辑a的范围时,触发mc的②MOUSE_OUT事件,同时又触发a的③MOUSE_OVER事件,
3.进入子影片剪辑a的冒泡阶段,因为a的父对象mc有侦听④MOUSE_OVER事件的,所以会触发mc的移入事件
4.鼠标移出a影片剪辑范围(仍未移出mc范围)时,触发a侦听的⑤MOUSE_OUT事件,
5.进入子影片剪辑a的冒泡阶段,触发mc的移出事件⑥MOUSE_OUT
6.鼠标重新移入到mc影片剪辑的范围,触发mc的⑦MOUSE_OVER事件
7.鼠标移出mc范围,触发mc的⑧MOUSE_OUT事件
//鼠标移入mc范围,未移入子影片剪辑a范围
//外部_移入_当前 mc _目标 mc <<mc的MOUSE_OVER生效 ①
//鼠标移入子影片剪辑a范围
//外部_移出_当前 mc _目标 mc <<mc的MOUSE_OUT生效 ②
//内部_移入_当前 a _目标 a <<mc.a的MOUSE_OVER生效 ③
//外部_移入_当前 mc _目标 a <<冒泡阶段,mc的MOUSE_OVER生效 ④
//鼠标移出子影片剪辑a范围
//内部_移出_当前 a _目标 a <<mc.a的MOUSE_OUT生效 ⑤
//外部_移出_当前 mc _目标 a <<冒泡阶段,mc的MOUSE_OUT生效 ⑥
//外部_移入_当前 mc _目标 mc <<mc的MOUSE_OVER生效 ⑦
//鼠标移出影片剪辑mc范围,回到舞台
//外部_移出_当前 mc _目标 mc <<mc的MOUE_OUT生效⑧
上面是trace出来的结果,下面是源代码,场景中一个大影片剪辑mc,套一个小影片剪辑a
mc.a.addEventListener(MouseEvent.CLICK,onFunA)mc.addEventListener(MouseEvent.CLICK,onFunB)function onFunA(_evt:MouseEvent){trace(_evt.currentTarget.name,"_",_evt.target.name)}function onFunB(_evt:MouseEvent){trace(_evt.currentTarget.name,"_",_evt.target.name)}