(二)addEventListener語法的不同,原因,和const型必要性和用法 本例如果是AS2.0,那么代碼是這樣寫的:
outsideChild.addEventListener("click", inclassHandler)
本例是3.0,如果你trace一下其中的MouseEvent.CLICK,輸出的也是字符串"click"。 看起來AddEventListener的方法和以前也沒什么大的出入。和這世界上大多數(shù)相同的事物一下,表象的類似卻掩蓋著本質的巨大差異。
我們先從最小的差異講起:
1.使用類靜態(tài)屬性,用const定義事件字符串名稱變量
AS3.0中用了一個新的關鍵字定義了事件名稱字符串變量,代碼是
public static const CLICK:String = "click"
const,是英文constant的縮寫,意思使不變的,常量。那就意思很明白了,一旦這種類型的常量被定義就不可再更改。好處通俗的說就是規(guī)范好項目,規(guī)范你自己,也規(guī)范任何其他項目人員,動不了這個變量。 你可能還是會不屑一顧,這么小的一個改動,對我沒什么用! 可我的AS2.0開發(fā)血淚經驗是,我曾經花了一個下午來找bug,最后卻發(fā)現(xiàn)是某個類的addEventlistener()里面的事件名稱"click"手誤打成了"cilck"。編譯器可不管這個。 如果是3.0,你打成了MouseEvent.CILCK,那么編譯時立刻會報錯提醒你,多好啊。一個項目一個人做十幾個類還好辦,自己認真點還能頂?shù)淖;如果是一個項目幾個人幾十個類,那么沒有const和static的幫忙,管理事件類型還真是有點麻煩。即使實現(xiàn)了也沒有AS3.0這么簡單直觀。 回到代碼,我們要記住,日后我們開發(fā)自己的Event類時,也要像這樣,用public static const來定義我們自己的事件名稱。 如何自定義自己的事件,我會在EventDispatch那一節(jié)講述。
看看代碼,我們還發(fā)現(xiàn)AS3.0中偵聽器也發(fā)生變化了,只能用function來做偵聽器,不再用Object。
2.addEventListener高級運用
AS3.0中對偵聽器的改進遠遠不止以上這些,看一看addEventListener的實現(xiàn)接口:
function addEventListener(eventName:String, listener:Object, useCapture:Boolean=false, priority:Integer=0, useWeakReference:Boolean=false):Boolean;
有三個莫名奇妙的參數(shù)。可是當你知道這三個參數(shù)背后隱藏的巨大改進之后,相信你要大叫三個哇塞。
第一個參數(shù),目前暫不解釋,埋個伏筆,留到EventDispatcher那一節(jié),講ActionScript3嶄新的Event Flow事件流機制.
第二個參數(shù):優(yōu)先級。 有趣吧,在ActionScript 3.0中我們可以控制事件的優(yōu)先級,從而達到控制function偵聽器的執(zhí)行順序。如果你不填這個參數(shù),那么事件默認為同一個級別0,事件的執(zhí)行按先來后到的天經地義的順序。 如果設為1,那么事件級別降一個檔次,稍后執(zhí)行。數(shù)字越高優(yōu)先級越高。級別可以為負數(shù)。 (注意: Flex Builder 2 Beta3中事件級別是越低越高)
第三個參數(shù),講的是是否設為弱引用。兄弟們初學As2.0時一定經常忘了在刪除Listener對象時,卻忘了removeEventListener吧。這會導致很多莫名奇妙的情況發(fā)生。也是最常見的詭異bug種類之一。(這種情況往往不被發(fā)現(xiàn),在后臺默默的消耗大量資源。)現(xiàn)在可以用弱引用可以在某種程度上解決這種bug: 設為true,就是告訴垃圾回收器,這個偵聽器function的引用是弱引用。一旦這個偵聽器在運行時只剩下了這一個弱引用,那么垃圾回收器可以不理它,直接把它回收了,節(jié)省資源。 從AS3.0引入這個弱引用這個概念就可以看出,AS3.0是如何的重視資源管理和有效率的運用。一個標準的重量級的程序語言必須具有這樣的特征。 現(xiàn)在AS3.0有了!
出處:藍色理想
責任編輯:moby
上一頁 強大的事件機制 [2] 下一頁 強大的事件機制 [4]
◎進入論壇Flash專欄版塊參加討論
|