標籤雲

搜尋此網誌

2009/04/17

MOUSE_OVER 跟 ROLL_OVER

這一點相信是一定會讓初學者困擾的問題
在 Flash 的 MouseEvent 裡面有兩組很相似的事件
就是 MOUSE_OVER, MOUSE_OUT 跟 ROLL_OVER, ROLL_OUT
長期以來我也一直不是很清楚

之前有人說分別在於 MOUSE_OVER 這組會一直觸發, 而 ROLL_OVER 這組只會觸發一次
這樣說其實是不對的

在網路上搜尋了一下
很快的找到結論
趕快記下來免得以後又搞混

真正的差別在於
MOUSE_OVER 與 MOUSE_OUT 在事件的傳遞上面會 bubbling 上去
也就是偵聽該事件的實體若還有 child 實體存在
則 child 實體也會觸發該事件
也就是說在事件偵聽函式中得到的 target 屬性(觸發者)未必會是偵聽該事件的實體
而有可能會是它的 child
(但 currentTarget 會是偵聽該事件的實體)

而 ROLL_OVER 跟 ROLL_OUT 則比較特殊
只有偵聽該事件的實體會觸發
其 child 實體不會多觸發一次事件
如果 child 實體也註冊了 ROLL_OVER 跟 ROLL_OUT 事件
則事件實體會有兩個
(相同的狀況在 MOUSE_OVER 與 MOUSE_OUT 這一組則會是只有一個事件實體, 但在 bubbling 階段廣播到不同實體)

以往概念不清楚時我常常用麻煩的方法
叫物件實體去偵聽 MOUSE_OVER 與 MOUSE_OUT
卻又不希望child 實體來干擾
所以會去停用物件實體的 mouseChildren 屬性
並使用事件的 currentTarget 屬性
觀念清楚後發覺自己怎麼這麼笨....
遇上這種狀況只要偵聽 ROLL_OVER 跟 ROLL_OUT 就好了阿
不過 MOUSE_OVER 與 MOUSE_OUT 也還是有它適合的狀況歐
要視不同狀況善加利用內建的事件才是最好的^^

參考網站:(他做了範例, 概念馬上就很清楚)
http://www.zedia.net/2008/difference-between-mouseeventroll_over-and-mouseeventmouse_over-in-as3/
另外在 Ticore 的網站也很久之前就討論過
http://ticore.blogspot.com/2007/08/as3-mouseover-rollover-2.html

沒有留言: