(如蒙转载,请留下我的Blog链接:www.kingda.org, thx)
(2) addEventListener语法的不同,原因,和const型必要性和用法
本例如果是AS2.0,那么代码是这样写的:
outsideChild.addEventListener("click", inclassHandler)
本例是3.0,如果你trace一下其中的MouseEvent.CLICK,输出的也是字符串"click"。
看起来AddEventListener的方法和以前也没什么大的出入。和这世界上大多数相同的事物一下,表象的类似却掩盖着本质的巨大差异。
我们先从最小的差异讲起:
1.使用类静态属性,用const定义事件字符串名称变量
AS3.0中用了一个新的关键字定义了事件名称字符串变量,代码是
public static const CLICK:String = "click"
const,是英文constant的缩写,意思使不变的,常量。那就意思很明白了,一旦这种类型的常量被定义就不可再更改。好处通俗的说就是规范好项目,规范你自己,也规范任何其他项目人员,动不了这个变量。
你可能还是会不屑一顾,这么小的一个改动,对我没什么用!
可我的AS2.0开发血泪经验是,我曾经花了一个下午来找bug,最后却发现是某个类的addEventlistener()里面的事件名称"click"手误打成了"cilck"。编译器可不管这个。
如果是3.0,你打成了MouseEvent.CILCK,那么编译时立刻会报错提醒你,多好啊。一个项目一个人做十几个类还好办,自己认真点还能顶的住;如果是一个项目几个人几十个类,那么没有const和static的帮忙,管理事件类型还真是有点麻烦。即使实现了也没有AS3.0这么简单直观。
回到代码,我们要记住,日后我们开发自己的Event类时,也要像这样,用public static const来定义我们自己的事件名称。
如何自定义自己的事件,我会在EventDispatch那一节讲述。
看看代码,我们还发现AS3.0中侦听器也发生变化了,只能用function来做侦听器,不再用Object。
2.addEventListener高级运用
AS3.0中对侦听器的改进远远不止以上这些,看一看addEventListener的实现接口:
function addEventListener(eventName:String,
listener:Object,
useCapture:Boolean=false,
priority:Integer=0,
useWeakReference:Boolean=false):Boolean;
哇塞,有三个莫名奇妙的参数。可是当你知道这三个参数背后隐藏的巨大改进之后,相信你要大叫三个哇塞。
第一个神秘参数,目前暂不解释,埋个伏笔,留到EventDispatcher那一节,讲ActionScript3崭新的Event Flow事件流机制.
第二个参数:优先级。 有趣吧,在ActionScript 3.0中我们可以控制事件的优先级,从而达到控制function侦听器的执行顺序。如果你不填这个参数,那么事件默认为同一个级别0,事件的执行按先来后到的天经地义的顺序。
如果设为1,那么事件级别降一个档次,稍后执行。数字越高优先级越高。级别可以为负数。
(注意: Flex Builder 2 Beta3中事件级别是越低越高)
好好利用这个功能吧,在AS2.0中要想达到同样效果可不知道要多费多少力气!
第三个参数,讲的是是否设为弱引用。
兄弟们初学As2.0时一定经常忘了在删除Listener对象时,却忘了removeEventListener吧。这会导致很多莫名奇妙的情况发生。也是最常见的诡异bug种类之一。即使老鸟偶尔也会被阴一把。
最郁闷的是这种情况往往不被发现,在后台默默的消耗大量资源。
现在可以用弱引用可以在某种程度上解决这种bug。
设为true,就是告诉垃圾回收器,这个侦听器function的引用是弱引用。一旦这个侦听器在运行时只剩下了这一个弱引用,那么垃圾回收器可以不理它,直接把它回收咯屁了,节省资源。
从AS3.0引入这个弱引用这个概念就可以看出,AS3.0是如何的重视资源管理和有效率的运用。一个标准的重量级的程序语言必须具有这样的特征。
现在AS3.0有了!
下一节:
(3) Listener和As2.0有何不同,和this关键字的“改进了的记忆力”
P.S:本教程受Creative Commons License.协议保护,未经作者同意,不得用于商业用途。







Comments (15)
呵呵,沙发:)
支持,期待继续学习中:)
加油啊!
Posted by 乖乖 | July 29, 2006 9:31 PM
Posted on July 29, 2006 21:31
黑羽大哥,能不能给我介绍一本专门讲解学习AS3的书呢?
等你教程我急啊:)
Posted by 乖乖 | July 30, 2006 3:28 PM
Posted on July 30, 2006 15:28
呵呵,目前哪有AS3.0的书啊。英文的都没有。估计等Flash 9出来后才会多起来。
Posted by 黑羽 | July 30, 2006 5:40 PM
Posted on July 30, 2006 17:40
啊?
黑羽大哥教我可以么?
现在对AS3真是毫无头绪啊:(
Posted by 乖乖 | July 30, 2006 6:43 PM
Posted on July 30, 2006 18:43
纠正文中的错误:
1.第二个参数:优先级应该是越大优先级越高,并不是文中所讲的"越低优先级越高"
2.addEventListener的实现接口正确的应该为
addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void
Posted by frogcjn | July 30, 2006 8:38 PM
Posted on July 30, 2006 20:38
.想请教些问题,但在blog上又找不到联系方式....偶的Email:soddyque#gmail.com
Posted by 残冰雨落 | July 31, 2006 12:48 AM
Posted on July 31, 2006 00:48
to frogcjn:
1.谢谢你,你说得对。
我刚刚核对了一下Flex builder 2正式版,发现优先级改成了越高执行的越快。
我已经在教程中改过了。
之前我用的是Beta3版,Beta3版的addEventListener是越低越快。
在此提醒所有用惯Beta3的兄弟们,这个改动要注意了!!
2.这个部分我没有弄错。情况是这样的,你写的是的EventDispatcher 的API接口,而实际上的EventDispatcher是应用了IEventDispacher接口。 IEventDispacher接口代码如下:
function removeEventListener(eventName:String,
listener:Object,
useCapture:Boolean=false):Boolean;
function dispatchEvent(eventObject:Event):Boolean;
function hasEventListener(eventName:String):Boolean;
function willTrigger(eventName:String):Boolean;
}
}
本质的区别是listener:Object,说明在IEventDispacher中是允许Object作为Listener的。这样的一个小区别让人很值得玩味。
Posted by 黑羽 | July 31, 2006 12:55 AM
Posted on July 31, 2006 00:55
回复可真认真啊,谢谢黑羽对于我们这些小辈儿的关照
关于IEventDispacher在Flex 2.0正式版的说明中的Listener,请看图片http://www.blogba.cn/batch.download.php?aid=461
,也许是版本不同吧,这里的IEventDispacher接口的Listener是声明为Function的.
Posted by frogcjn | July 31, 2006 1:30 AM
Posted on July 31, 2006 01:30
to frogcjn:
这个不是版本的不同的原因了。是这样的,上方的IEventListener代码也是正式版help中发布的。
我是这样理解,由于AS3是按照DOM Level 3事件机制设计的。而Level 3中规定的是用Object来做listener.
在ActionScript3中,Function实质也是一种特殊的Object,和AS2.0有相似之处。
见我的文章:
ActionScript高级技巧:深入了解Function
因此AS3.0中在公开文档中限定用Function做侦听器,严格说也没有违背DOM 3标准。至于为什么限定用Function,这和它的架构有关,不细说了。
但在IEventDispatcher代码中仍然按照DOM3标准用Object来做Listener。
因此我觉得上述代码是可信的,也是符合 DOM3标准的。
P.S:
另外要指出的是AS帮助提供的信息和真正的实现有出入是常有的事,比如AS2.0中很多公开的文档和真正的代码实现就不完全一样。
Posted by 黑羽 | July 31, 2006 9:21 AM
Posted on July 31, 2006 09:21
谢谢
Posted by frogcjn | July 31, 2006 2:18 PM
Posted on July 31, 2006 14:18
You are welcome.
^_^
B.T.W:我刚刚去你博客转了一圈。
Posted by 黑羽 | July 31, 2006 2:33 PM
Posted on July 31, 2006 14:33
public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void
官方文件,listener只能是function
小羽是不是有筆誤呢
Posted by milkmidi | March 30, 2007 11:47 AM
Posted on March 30, 2007 11:47
to milkmidi:
hi,这个问题在上面已经讨论过了。
这不是笔误,反倒是说了官方文档中没有说明的东西。
看我上面对frogcjn的回复,有详细的说明。
^_^
Posted by 黑羽 | March 30, 2007 7:03 PM
Posted on March 30, 2007 19:03
不错
Posted by BlueOnly | April 20, 2007 3:56 PM
Posted on April 20, 2007 15:56
addEventListener(type:String, listener:Function, useCapture:Boolean, priority:int, useWeakReference:Boolean) — Method in class flash.display.Stage
Posted by 小建 | June 20, 2007 9:12 PM
Posted on June 20, 2007 21:12