当前位置: 代码迷 >> Web前端 >> 事件源和自定义事件
  详细解决方案

事件源和自定义事件

热度:100   发布时间:2012-11-05 09:35:12.0
事件流和自定义事件
下面有两个很简单的一个例子:
    例子一:
    button.addEventListener("click",showText);       //给按钮添加一个事件,第一个参数是事件的类型,第二个参数是调用什么方法
    internal function showText(evt:MouseEvent):void{
         txt.text = "click a button";
    }


    例子二:
    btn1.addEventListener(MouseEvent.CLICK,onClick);

    internal function onClick(evt:MouseEvent):void{
        Alert.show("你点击了一下按钮","提示");
    }



  

    事件流:
        调用事件会经过三个阶段:
            1、捕获阶段:从根节点到子节点,检测对象是否注册了监听器,是则调用监听函数
            2、目标阶段:调用目标对象本身注册的监听程序
            3、冒泡阶段:从目标节点到根节点,检测对象是否注册了监听器,是则调用监听函数
            注意:事件发生后,每个节点可以有2个机会(2选1)响应事件,分别是捕获和冒泡阶段,默认关闭捕获阶段

    上面事件流可能看的有些生疏,比如一个界面中放了画布1,在画布1上放置了画布2,在画布2上面放置了按钮,在按钮1上注册了一个事件,
    捕获阶段是从画布1->画布2->按钮1,然后到达目标阶段,检测到按钮1有注册事件,然后从按钮1->画布2->画布1(这个阶段称为冒泡阶段)


    IEventDispatcher接口:
        addEventListener();        //注册事件监听器
        removeEventListener();  //移除事件监听器
        dispatchEvent();             //派发事件
        EventDispatcher类,参见手册


    addEventListener()方法
          此方法有5个参数:
                参数1:调用事件的类型
                参数2:调用什么方法
                参数3:捕获阶段调用是否开启,默认不开启
                参数4:优先级,值越大,优先级越高,
                参数5:是否使用弱引用,默认是false,不使用弱引用(使用强引用),这个类似于java中的垃圾收集,如果改为true时就会收回垃圾





Event对象
    Event类作为创建Event对象的基类,当发生事件时,Event对象将作为参数传递给事件监听器
    最长见得如:MouseEvent,KeyboardEvent


自定义事件
        1、创建自定义事件名称的Event
                dispatchEvent(new Event("myEvent",true,false));
        2、创建扩产事件类
                Public class MyEvent extends Event{
                        ......
                }

        示例一:dispatchEvent()方法的使用方法:本示例效果是:点击按钮后会弹出文本框“触发了"+Event1_.0.cav注册的:testEvent"事件”
<mx:Script>
        <![CDATA[
                import mx.controls.Alert;

                internal function init():void{
                        cav.addEventListener("testEvent",onShow);
                        btn.addEventListener(MouseEvent.CLICK,onClick);
                        trace("1:addEventListener");
                }
			
                internal function onClick(evt:MouseEvent):void{
                        trace("2:dispatchEvent");
                        cav.dispatchEvent(new Event("testEvent",true,false));
                }
			
                public function onShow(evt:Event):void{
                       //evt.currentTarget:目前的事件流进了那个组件
                       //evt:target:是谁调用了这个事件(就是说事件流的目标是什么)
                       //如果不用if:要是按钮放在画布或其他容器上,其他容器注册了和按钮相同的事件,那么点击一次按钮后同一个方法就可能执行两次以上
                       if(evt.currentTarget == evt.target){
                               Alert.show("触发了"+evt.currentTarget+"注册的:"+evt.type+"事件");
                       }
                }
        ]]>
        </mx:Script>
	
	
        <mx:Canvas x="37" y="47" width="200" height="299" id="cav" borderColor="#08436C" backgroundColor="#563D3D">
        </mx:Canvas>
        <mx:Button x="421" y="57" label="Button" id="btn"/>




        第二个示例:定义类使用extends关键字自定义方法
//此自定义事件的功能是:调用事件的时候在构造方法中传入值,然后将值赋值到data变量中
                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);
	                }
                         }
                }





  相关解决方案