name:Kingda EventSender version:1.5.0 author:kingda § 黑羽翔天 Kingda's EventSender版本|Latest Version: http://www.kingda.org/ 用法: 侦听事件: EventSender.addListener(eventType:String, lisener:Object); 侦听器可以是函数也可以是对象。 发送事件: 先定义evtObj {type:"eventName", target:xxx}, 然后EventSender.dispatch(evtObj:Object); 快速发送事件 : EventSender.send(eventType:String, eventTarget:Object) 例子: import org.kingda.tools.EventSender EventSender.addListener("gogo", lisFunc); var o:Object = {type:"gogo", target:this}; EventSender.dispatch(o); function lisFunc(eO):Void { trace ("listened:" + eO.target); } APIs: public static var debug:Boolean = false; //if set true, it will trace a lot of useful msgs to help you debug public static function send(evtType:String, targetObj:Object):Void public static function dispatch(evtObj:Object):Void; public static function addListener(evtType:String, lisObj:Object) ; public static function removeListener(evtType:String, lisObj:Object) ; public static function showQueue(); //abandoned: reserve to keep campatibility to old applications; public static function getQueue(); public static function removeEvents (evtType:String) public static function removeListeners(lisObj:Object); public static function reset(lisObj:Object); 详细用法和介绍: 只要是编过一点稍微有规模的AS2程序的人都知道,查找Event发送者是一件很痛苦的事儿。如果事件发送者是在和我们打交道的类下面的组成子类中的组成子类,那么我们要做多层桥接来getEventDispatcher(),非常不方便。 AS3中有事件冒泡机制,可以层层上递,非常方便。那么AS2就一定要受这个苦吗?不必要。用事件发送器EventSender发送和接受都很简单。使用方法见: 【黑羽】超简便的事件发送器:EventSender类 这个工具类编程不难,但也花了一些我不少时间来编写调试和写帮助。希望对大家有所助益!当然了,如果你在你项目中使用了这个小工具,能够在感谢中给我和我的博客留个名,我也是非常高兴的。如果空间不够,那就算了。:-) 本次1.5版本新增功能有: 1.EventSender.debug = true; 如上句,设置debug标志等于true后,那么使用EventSender会出现很多对调试有帮助的信息。 2.removeListener(evtType:String, lisObj:Object) 代码范例: //随时随地 EventSender.removeListener(事件名称,侦听器); 早就加入的移除函数侦听,但一直没有在公布的版本中更新。抱歉,这次大家一起更新了吧。用法格式与官方相同,大家一定很习惯。 如果将EventSender. debug设为true后: (a)如果你remove了一个并不存在的(事件,侦听器),那么会输出面板会出现提示信息: <<<< EventSender:!!!!Error: eventtype=事件名or listener=[侦听器类型] is not in the EventSender's queue (b)如果你不小心多remove 了一次某个(事件,侦听器),那么输出面板会出现提示信息: <<<< EventSender:!!!!Warning: eventtype=sdf or listener=[type Function] is already removed 更有意思的功能来了: 3.removeListeners(lisObj) 呵呵,比removeListener多了一个s,意思是将侦听器为lisObj绑定的所有事件统统清除。 方便吧,呵呵。 适合在destroy()函数中使用。再说明白点,举个例子,如果你注册了很多事件给lisObj,那么只需要下面一句就可以统统删除 EventSender.removeListeners(侦听器); 如果debug设为true,那么: (a) 如果你用对了,会告知你共删除了几次listener,你心里也就知道了去掉了几个侦听器。对调试很有帮助。 EventSender:==========found Listener=[侦听器类型]:次数 times, and removed all of them ====== (b) 如果你删除错了侦听器,那么会输出: <<<< EventSender:!!!!Error: listener=[侦听器类型] is not in the EventSender's queue (c)之前已经删过这个的侦听器了,那么会告诉你之前删除过几次 <<<< EventSender:!!!!Warnging: listener=[侦听器类型] is not found this time!! this Listener was removed 次数 times before. please check again. 4.removeEvents(事件名称); 和上一个功能相似,清除所有事件名为“事件名称”的事件侦听机制。 调试信息与以上相似,不赘述了。 5.getQueue():Array 返回所有事件队列,每个Array元素结构为 "{type:String, listener:Object}"。本功能供高级使用者使用。 如果设置debug= true,那么会在输出面板显示信息: EventSender:==========all events and listeners ====== No.0 type:事件名 listener:[侦听器类型]; No.1 type:事件名 listener:[侦听器类型]; No.2 type:事件名 listener:[侦听器类型]; ============ END =============== 6.reset():Void 删除EventSender中所有的事件侦听机制,重新开始。 如果设置debug=true,会告诉我们共清空了几个机制: EventSender:==========all events and listeners are cleared. Total Number:次数 API介绍完了。可以看出使用EventSender来发送和管理事件非常方便,顺手。但如果在大项目中使用,那么有以下几点要注意: 1.事件名称的管理。 (a)如果有几百个事件名称,难保不发生冲突。比较好的办法是,为每个项目建立一个Event类,集中管理事件名称。 class TestEventList { public static var CLICKSPOT:String = "clickspot"; public static var CLICKPOINT:String = "clickpoint"; public static var CLICKSQUARE:String = "clicksquare"; } 使用时,就这样使用,有点像AS3提倡的用法 EventSender.addListener(TestEventList.CLICKPOINT, listenerObj); (b)更好的方法是借鉴AS3的思路,建立相应的Event类,和EventList类进行管理。EventSender来dispatch的都不是一般的Object,而是定义好的Event类的实例。 Event类和EventList类都可以继续扩展,适应整个系统的科学架构。 以下是我项目中的实例代码 class com.test.plugin.events.NoteEvent extends TestEvent { public var type:String = SimtestPluginMng.NOTE; public var target:Object; 估计看到这一部分的都是有经验的老手,我也不多废话了,看一点就都会明白我是什么意思了。 2.定期的释放和清理 以前使用官方的事件机制时,要特别注意清除侦听器。一旦注册事件过多,很难管理。但现在有了removeListeners(ListenerObj)和 removeEvents(Event)就可以轻松管理大量事件。更有reset()。拿不准的还有getQueue()供调试和特殊使用。 getQueue()可以给你所有的事件和侦听器列表,让你从始到终,对事件的管理井井有序,清清楚楚。不再为以前来无踪去无影或层层嵌套的事件机制烦恼了。 希望大家喜欢。 www.kingda.org e-mail:kingda1980@yahoo.com