AS 3 学习笔记【25】(原创连载)
第18章 事件发送和处理
昨日忘记发了,今天补充上。
*事件(Event)处理机制的产生和原理
AS 3采用DOM3事件模型来解决有效安全地交流信息的问题。DOM3事件的优点在于,事件发送者只需要发送事件对象,事件监听者只需要接受事件对象。事件接收者可以改变自己的外部接口,只需要确保发送的事件对象不变即可。事件监听者也不必关心事件接收者是否变化,只需要保证自己能够正确处理接收到的事件对象即可。
DOM3事件的执行流程:
- 注册侦听器(Add Event Listener):即指定发出的事件由哪个对象方法来接受。
- 发送事件
- 侦听事件
- 移除侦听器
*ActionScript 3事件机制的新特色
AS 3事件处理机制形式上的不同:
- 首先,注册侦听形式同意。全部事件侦听清一色使用assEventListener( )。
- 其次,侦听器同意使用Function,不再允许使用Object当侦听器。
- 最后,所发送的事件对象,必须是Event或其子类的实例。
新特色,事件流机制与试图元件的紧密结合:AS 3中所有显示对象(指舞台上的元件)可以接受和发送事件。在AS 3中也引入了崭新的事件流机制。如果一个显示对象是一个容器,包含着一些子显示对象,那么子显示对象接收到了鼠标事件,就可以层层上递到它的父容器,直到最上层的舞台。
新特色,侦听器优先级:在AS 3中注册侦听器时,可以设置侦听器优先级,从而控制侦听器的执行顺序。不填的时候默认为0。
新特色,侦听器弱引用:如果侦听器设为弱引用,而且在程序运行的时候只剩下了这一个弱引用指向侦听器,那么垃圾回收器可以不理它,直接就把侦听器回收了,可以节省资源。
*事件
Event类的属性:Event类公开的实例属性只有6个:type、target、currentTarget、eventPhase、bubbles、cancelable。这些属性都是只读属性。其中只有type、bubbles、cancelable可以由用户在构造函数中指定初值。
- Type用来存储事件对象的名称,是字符串类型。
- Target是Object类型,持有引用、指向最初发出事件的那个对象。
- currentTarget、eventPhase、bubbles这3个属性和事件流机制相关。
- Cancelable属性是一个布尔值,表示这个事件引起的默认动作是否可以被取消。这个属性一般是和preventDefault( )方法结合在一块儿使用的。
Event类的构造函数:Event类的构造函数有3个参数分别是type、bubbles、cancelable3个属性。其中bubbles、cancelable默认值是false。一般情况下只使用type一个参数创建Event对象。
Event类的方法:clone( )、formatToString( )、toString( )、isDefaultPrevented( )、preventDefault( )、stopImmediatePropagation( )、stopPropagation( )
自定义事件类:当需要在事件对象中加入额外的属性或方法时,才需要自定义事件类。如不需要额外加入属性和方法,那么使用“new Event(“新事件名称”)”就可以发送出“新事件名称”类型的事件对象。
*侦听器
在AS 3中侦听器必须是Function(函数类型)。
创建侦听器:侦听器必须只有一个参数,且这个参数必须是Event类实例或其子类的实例,而且返回值必须为空
代码:
Function litenerName(evt : Event) : void {……}侦听器中的this关键字:在类方法中this就指向当前类实例对象,使用在包外定义的function做侦听,那么this就指向Global。
注册侦听器和移除侦听器:只有事件发送者才可以注册侦听器,事件发送者必须是EventDispatcher类或其子类的实例。
代码:
事件发送者.addEventListenner(事件类型,侦听器);//注册侦听器
事件发送者.removeEventListenner(事件类型,侦听器);
//移除侦听器代码
检测事件侦听器:hasEventListenner( )方法和willTragger( )方法,都可以检测当前的事件发送者是否为了某事件类型注册了侦听器。有返回true,没有返回false。
*自定义类发送事件的3种方式
在AS 3中有3种发送事件的方式:
- 继承EventDispatcher类
- 复合EventDispatcher对象
- 实现IEventDispatcher接口
继承EventDispatcher类:让自定义类直接继承EventDispatcher
复合EventDispatcher对象:当一个类因为本身已经继承其他类,无法再继承EventDispatcher类时,又不愿意这个类单纯是一个事件发送类,而是执行某个方法时附带发送一些事件,这个事件发送者往往是这个类的组成部分,这种时候使用复合。
实现IEventDispatcher接口:当一个类因为本身已经继承其他类,无法再继承EventDispatcher类时使用。
总结:略显生涩,看了半天,还是觉得有点不熟,先放过,回头再看一般吧。









