as3 rollOver or mouseOver使用說明_Flash as3
來源:互聯網
上載者:User
所以當監聽MouseEvent.ROLL_OVER事件後,滑鼠移動到panel的幾個按鈕時,程式仍然認為滑鼠移至上方在panel上方。假設我們監聽MouseEvent.MOUSE_OVER, 隨著滑鼠移到panel的按鈕上,程式立刻判斷滑鼠離開了panel,已經到了按鈕上方——這個結果不是我們需要的,此時本應去單擊按鈕,結果程式判斷滑鼠離開panel,會直接removeChild或者visible=false。
關於冒泡的話,不得不提AS3的事件流,簡單的說就是一個捕捉——目標——冒泡的迴圈過程:事件發生後,先從顯示層中的根容器開始往下層級逐個捕捉直至到達派發事件的目標對象後向上返回冒泡,而這一事件中的target屬性始終指向最內層的派發事件目標,currentTarget則顧名思義指向事件流中當前所在的對象。
事件發生後,從根節點到目標節點的父節點,這中間所有節點都有兩次機會可以響應事件,分別在捕獲和冒泡階段。在事件流經過的任意節點上註冊接聽程式都會觸發。當然前提是開啟了捕獲和冒泡功能。
預設情況下,捕獲功能處於關閉狀態,因為實際開發中,監聽目標很明確,沒必要捕獲。
而事件只有在bubbles屬性為true時才進行冒泡,預設冒泡的事件包括:change,click,doubleClick,keyDown,keyUp,mouseDown,mouseUp。一旦捕獲開啟,預設的冒泡將被取消。
因此在同一個監聽器中不能同時開啟捕獲和冒泡,只能註冊兩個監聽一個開捕獲一個開冒泡才行。
只有可視化對象(容器,控制項)才有捕獲和冒泡階段,而像XML,WebService等非可視化對象只有目標階段。
註冊接聽程式方法為:
addEventListener(type:String, listener:Function, useCapture:Boolean=false, priority:int=0, useWeakReference:Boolean=false)
useCapture即為是否開啟捕獲功能,
priority為優先順序設定,當有多個接聽程式時,priority越大,優先順序越高越先調用,如果同級的話則按註冊的順序來調用。這裡注意即使優先順序有先後也無法保證後一個偵聽調用執行時前一個偵聽函數已執行完畢。
useWeakReference為弱引用開關,推薦設為true,便於垃圾自動回收。但最規範的還是直接removeEventListener。注意當註冊監聽器開啟了捕獲,則removeEventListener(type:String, listener:Function, useCapture:Boolean=false)的useCapture必須設為true,否則無效
事件對象的構造方法為:
Event(type:String, bubbles:Boolean=false, cancelable:Boolean=false)
bubbles即為是否冒泡
cancelable為true時可以調用PreventDefault方法停止系統預設的行為。比如輸入文本,預設行為會馬上顯示在文本區,當cancelable為true時調用PreventDefault方法讓字元不出現。
另外,Event還有兩個方法可以停止事件流的繼續傳播,stopPropagation和stopImmediatePropagation,區別在於前者不會停止正在處理的對象。而後者還會停止同一object上的其他接聽程式。