采用观察者模式
即首先要注册事件,事件分发后通过事件响应函数进行处理。
XXX.addEventListener(“注册事件类型”,事件响应函数);
理解事件流:
1.捕获阶段(从根节点到子节点,检测对象是否注册了监听器,是则调用监听函数)
2.目标阶段(调用目标对象本身注册的监听程序)
3.冒泡阶段(从目标节点到根节点,检测对象是否注册了监听器,是则调用监听函数)
注:事件发生后,每个节点可以有2个机会(2选1)响应事件,默认关闭捕获阶段。
从上到下(从根到目标)是捕获阶段,到达了目标后是目标阶段,然后从目标向上返回是冒泡阶段。
图示:
(假设该Button注册了监听:button.addEventListener(“click”,onClick);)
点击按钮之后出发了click事件,以此来分析事件流:
当点击 btn时,
终端-->cav1-->cav2-->btn(捕获阶段)
-->调用btn的监听程序(目标阶段)
-->btn-->cav2-->cav1-->终端(冒泡阶段)
每个事件对象都有以下属性:
target:事件的派发者
currentTarget:当前正在检测的的对象,帮助跟踪事件传播的过程。
当事件发生时,FLEX通过事件的分发器EventDispatcher进行事件分发,分发的顺序是:从上往下到达目标,然后从下往上,从目标开始返回。
在事件的流经过程中,不是目标的对象如果注册了事件,也有了相应的事件响应函数,使得不是目标的对象也响应了事件的处理
addEventListener在只有如上两个参数的情况下是关闭捕获阶段的,也就是说事件流是从目标阶段开始的,然后是冒泡阶段,
当出现容器包含控件的时候,可以使用判断
if(evt.target == evt.currentTarget)
来确定当前事件流上的当前流经对象是否就是目标对象,如果是就进行相应的处理。
事件只在bubbles 属性为true
时才进行冒泡,可以冒泡的事件包括:change、click、doubleClick、keyDown、keyUp、mouseDown、
mouseUp。并且不能在一个监听器中同时打开捕获和冒泡功能,要做到这一点,只能注册两个监听器,分别实现。
移除对象的事件流:
cav1.addEventListener(MouseEvent.MOUSE_OVER,onMOver);
btn.addEventListener(MouseEvent.CLICK,onRemove);
internal function onRemove(evt:MouseEvent):void{
cav1.removeEventListener(MouseEvent.MOUSE_OVER,onMOver);
}
阻断事件流中目标对象的后继事件
即通过了目标阶段后阻止冒泡阶段:
event类的方法:public function stopImmediatePropagation():void
即:
evt.stopImmediatePropagation();
自定义事件
1.创建自定义事件名称的Event
dispatchEvent(new Event(“myEvnet”,true,false));
2.创建自定义事件类
Public class MyEvent extends Event{
….
}
package com.events
{
import flash.events.Event;
public class NewEvent extends Event{
public static const NEWCLICK:String="newevent";
public var data:String;
public function NewEvent(type:String,data:String){
this.data=data;
super(type,false,false);
}
}
}
dispatchEvent是EventDispatcher的方法:public function dispatchEvent(event:Event):Boolean将事件调度到事件流中。 事件目标是对其调用
dispatchEvent()
方法的 EventDispatcher 对象。
这句话就是说是哪个对象调用
dispatchEvent()
,那么该事件就会被分发到那个对象的事件流中,如果没有指明对象,那么默认为this对象,即应用程序。这时该事件被分发到应用程序对象的事件流中,而没
有分发到特定对象的事件流中。一旦两个对象的不是父子关系(控件树),那么事件流不会在这两个对象之间有联系,那么事件不会被响应;如果是,则还是要响
应。(这种情况dispatchEvent的参数Event对象的参数必须是三个,如上)。dispatchEvent就是说明有了新的事件,只要注册了
该事件,就可以响应。
posted on 2010-03-03 16:16
Ying-er 阅读(509)
评论(0) 编辑 收藏 所属分类:
Flex3.0