先說明一下,我并不會把所有的内容都寫出來,隻列我認為有必要講解一下的内容。如果要了解全部内容,請參看Flash自帶的幫助檔案。該系列文章都是按照這個思路寫的。
先說一個本人覺得很實用的通用方法:toString()。基本上所有的事件都帶有這個方法,不肯定的時候就trace(event.toString())看一下,會發現内容比幫助文檔還要全。囧一個。
下面進入正題,今天講的是MouseEvent(滑鼠事件)。
一、MOUSE_OVER、MOUSE_OUT和ROLL_OVER、ROLL_OUT的差別是什麼?
唯一的差別就是:MOUSE_OVER、MOUSE_OUT采用的是冒泡機制;而ROLL_OVER、ROLL_OUT采用的是非冒泡機制(關于冒泡機制的講解請詳細看我上一篇文章)。是以如果你非常習慣AS2程式設計,可以使用ROLL_OVER、ROLL_OUT,和原來的沒什麼差別。但我建議你還是習慣冒泡機制,畢竟這個是AS3的指導方向。
同時,MouseEvent的事件中,也隻有ROLL_OVER、ROLL_OUT這兩個采取的還是非冒泡機制。
下面我給出一個比較差別的例子,但不做很具體的說明了:
如圖所示,整個圖形是一個MC,執行個體名為t1。裡面的粉紅色框為t1内的一個MC,執行個體名為t2。
(1) 在第一幀寫入代碼,給兩個MC都增加偵聽如下:
function p1(event:MouseEvent):void
{
trace("t1");
}
t1.addEventListener(MouseEvent.ROLL_OUT, p1);
function p2(event:MouseEvent):void
trace("t2");
t1.t2.addEventListener(MouseEvent.ROLL_OUT, p2);
編譯該段代碼,當滑鼠從最左邊沿中間移動,最終從右邊移出。螢幕輸出:
t2
t1
(2)代碼還是上面,僅僅是把MouseEvent.ROLL_OUT修改為MouseEvent.MOUSE_OUT,編譯後同樣操作,螢幕輸出:
說明ROLL_OUT采取的是非冒泡機制,而MOUSE_OUT采取的是冒泡機制。
二、令人困惑的DOUBLE_CLICK:滑鼠輕按兩下動作
這個動作在AS2.0是沒有的,屬于AS3.0新加的事件。但是在使用的過程中,卻有不少的麻煩問題,讓我們一步步分析:
(1) 預設是關閉的,必須手動打開。
我們在舞台上建立一個MC,執行個體名為t1,在第一幀寫入代碼如下:
t1.addEventListener(MouseEvent.DOUBLE_CLICK, p1);
運作後,發現無效。為什麼呢?因為t1沒有打開支援滑鼠輕按兩下,需要在第一行添加代碼如下: t1.doubleClickEnabled = true;現在再運作,可以了吧?
但這個用法和大多的事件是很不相同的。
(2) 我們在t1内再建立一個MC,執行個體名為t2,然後再運作上述代碼。
問題出現了,在新建立的MC區域,DOUBLE_CLICK事件不響應了。
為什麼會發生這樣的事情呢?難道因為新建立的t2,doubleClickEnabled為false,是以t1的輕按兩下冒泡事件受到t2的影響,冒不出來了嗎?...囧
為證明并解決這個問題,我在第二行寫入代碼如下:
t1.t2.doubleClickEnabled = true;
運作後,果然,問題排除。
可有人要問了,那如果我的MC裡面包含了許多子MC怎麼辦?難道要一個個打開?
那倒也不用那麼麻煩,加入下面的代碼即可:
t1.mouseChildren = false; //t1的子項不支援滑鼠動作
但這個給人的感覺就像是打一個更新檔...
(3) 詭異的冒泡事件
我們把代碼稍稍修改下,如下所示:
trace(t1.doubleClickEnabled)
t1.t2.addEventListener(MouseEvent.DOUBLE_CLICK, p2);
運作後,第二行的trace傳回的結果是false,說明t1的輕按兩下屬性沒有打開。
然後我們在t2區域上方輕按兩下滑鼠,靈異事件發生了!下面的2個函數均被觸發了!
依次傳回t2,t1。
這個究竟是怎麼回事呢?我隻好從說明上找根源,然後看到這麼一段官方說明:“要使 doubleClick 事件發生,它必在以下一系列事件後面:mouseDown、mouseUp、click、mouseDown、mouseUp。 所有這些事件必須共享與 doubleClick 事件相同的目标。”
難道說,是因為DOUBLE_CLICK是由那5個事件組成,而打開t1.t2.doubleClickEnabled,相當于把t2所在區域的限制打開,導緻處于該區域範圍的t1也無效了嗎?
總之,感覺AS3的滑鼠輕按兩下事件,隻是為了解決AS2沒有該事件而做的一個半成品,并不能真正意義上稱其為一個獨立的事件。
以上!
本文轉自 windtoto 51CTO部落格,原文連結:http://blog.51cto.com/windtoto/372515,如需轉載請自行聯系原作者