as3 rollOver or mouseOver使用說明
2024-09-12 17:51:30
供稿:網友
所以當監聽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上的其他偵聽器。