采用观察者模式
即首先要注册事件,事件分发后通过事件响应函数进行处理。
XXX.addEventListener(“注册事件类型”,事件响应函数);

理解事件流:
1.捕获阶段(从根节点到子节点,检测对象是否注册了监听器,是则调用监听函数)
2.目标阶段(调用目标对象本身注册的监听程序)
3.冒泡阶段(从目标节点到根节点,检测对象是否注册了监听器,是则调用监听函数)
注:事件发生后,每个节点可以有2个机会(2选1)响应事件,默认关闭捕获阶段。
从上到下(从根到目标)是捕获阶段,到达了目标后是目标阶段,然后从目标向上返回是冒泡阶段。
图示:
(假设该Button注册了监听:button.addEventListener(“click”,onClick);)
点击按钮之后出发了click事件,以此来分析事件流:
cav1Canvas:cav1
cav2Canvas:cav2
btnButton:点击我
当点击 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

只有注册用户登录后才能发表评论。


网站导航: