先从一个红绿灯例子看起,
<?xml version="1.0"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="init()"> <mx:Script> <![CDATA[ private function init():void{ hbox.addEventListener(MouseEvent.CLICK,eventHandler); } private function eventHandler(event:Event):void{ if(event.target is Button){ lab.text="交通信号为:"+Button(event.target).label; } } ]]> </mx:Script> <mx:VBox width="100%" height="100%" id="vbox"> <mx:Label text="关闭" id="lab"/> <mx:HBox id="hbox"> <mx:Button label="绿色" id="btnGreen"/> <mx:Button label="红色" id="btnRed"/> <mx:Button label="蓝色" id="btnBlue"/> </mx:HBox> </mx:VBox> </mx:Application>
事件的三个要素:
- 事件源:事件源指的是发生事件的对象。本例中即是三个按钮。
- 监听器:监听器是一个具体的方法,负责处理事件响应。监听器被注册到某个可以接收到事件通知的对象上。本例中监听器是eventHandler方法,被注册到按钮的父容器hbox上
- 事件:事件本身就是一个对象。监听器在处理事件的时候,有时候需要知道事件的来龙去脉,比如事件源是谁?发生了什么事情?事件对象中封装了这些信息,本例中,监听器eventHandler方法的参数既是事件对象。
上面的监听器必须解决两个问题:
- 如何判断用户点击的是按钮?
if(event.target is Button)
在hbox上添加了鼠标点击事件,如果此容器中包含有除了Button之外的其它组件,Flash Player也会调用eventHandler,但是监听器是比较聪明的,他会检测事件源是不是按钮,这里的秘密在于event,Event是在事件发生时,有FlashPlayer隐式创建的。Event描述了所发生的事件,event.target is Button检测事件源是否为按钮对象。
2. 用户按了哪个按钮?
Event对象实例event通过event.target告诉了谁是事件源,继而通过强制类型转换Button(event.target),得到了发生事件源对象,从而获得了他的label属性。
讨论下creationComplete
creationComplete事件并不是由用户触发的,Application初始化完毕,FlashPlayer就会自动触发该事件。
如果在as3中为添加creationComplete方法,只需要addEventListenter.add("creationComplete",函数)就可以了。
上面的事件监听之能传一个参数,如果想传多个参数,请参考事件监听传多个参数这篇文章。