as3.0中的事件Event(位于包flash.events内,继承至Object,子类有…)

关于AS3的事件移除释疑

既然是释疑,主要是在与同事聊天的过程中提及的几个问题:

1、addEventListener重复监听是否会被多次调用?

2、如何移除一个匿名函数的监听?

3、target、currentTarget之间的区别

4、关于Event对象的其它需要注意的地方

 

/*****************************************

*  addEventListener重复监听是否会被多次调用?

******************************************/

这里重点在于“重复”两个字,如果监听一个对象,事件类型相同,监听函数也是相同,则该监听函数在事件被触发时只被调用一次。如果监听的事件类型不同或是监听函数不同,则该监听函数,在该事件类型被触发时调用。

关于AS3的事件移除释疑

上面的写法,onClickHandler函数在对象的CLICK事件被触发时被调用一次。

关于AS3的事件移除释疑

使用removeEventListener则会移除该事件,CLICK事件被触发时不再调用onClickHandler函数。

 

如果监听函数为匿名函数:

关于AS3的事件移除释疑

需要移除匿名函数时,一是可以使用变量保存该匿名函数的引用,二是可以在该匿名函数内使用arguments.callee获取该匿名函数的引用,使用removeEventListener移除对指定事件类型的监听。

 

使用闭包获得的匿名函数,每次调用时获得的匿名函数都不是同一个引用,所以对事件的监听将会被多次调用。例如有一个函数为:getClickFn()。

关于AS3的事件移除释疑

当多次使用该函数进行监听时,将会被多次调用。

关于AS3的事件移除释疑

 

而addEventListener方法,属于类EventDispatcher(flash.events,继承至Object,实现IEventDispatcher),子类有(DisplayObject…)

关于AS3的事件移除释疑

该方法有5个参数。addEventListener(eventType, listenerFn, useCapture:Boolean=false, priority:int=0, useWeakReference:Boolean=false);

一般很少用到后面的参数,分别是:

useCapture –> 是否在捕获阶段监听事件,默认在冒泡阶段进行监听

priority –> 默认为0,也就是监听事件时,回调监听函数的“层次”顺序,比如之后监听的函数要在事件触发时有拦截操作等(取消事件冒泡,阻止其后事件的触发stopPropagation、stopImmediatePropagation)

useWeakReference –>  是否为弱引用,强烈建议避免使用该参数,不易控制。

hasEventListener用来检查对象是否为特定的事件类型注册了监听器。

 

 

/*****************************************

* target、currentTarget的区别

******************************************/

这个是比较容易混淆,但也非常常见。一句话概括来讲就是:

target -- 触发事件的事件源,currentTarget -- 触发事件的监听对象。

 

 

/*****************************************

* 关于Event其它要注意的地方

******************************************/

首先要很清楚,一个事件它经历了哪几个阶段:捕获阶段 –> 目标阶段 –> 冒泡阶段

关于AS3的事件移除释疑

然后就是stopPropagation、stopImmediatePropagation这两个方法它们的区别,写个例子就知道了<从方法的说明中就能知道大概意思,写个Demo加深印象就可以了>

 

写了一堆,最后还是写一个demo,比较实际一点:

package
   2: {
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.filters.GlowFilter;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
import flash.text.TextFieldType;
import flash.text.TextFormat;
/**
     * ...
     * @author Meteoric
     */
extends Sprite
  16:     {
  17:         
public function EventDemo() 
  19:         {
  20:             initView();
  21:         }
  22:         
private var txt:TextField;
  24:         
private function getTextGlowFilter(colorVal:uint=0x000000, blur:Number=2):GlowFilter
  26:         {
  27:             var color:uint = colorVal;
  28:             var alpha:Number = 1;
  29:             var blurX:Number = blur;
  30:             var blurY:Number = blur;
  31:             var strength:Number = 255;
  32:             var quality:Number = 1;
  33:             
new GlowFilter(color, alpha, blurX, blurY, strength, quality);
  35:         }
  36:         
void
  38:         {
new TextField();
  40:             txt.x = 200;
  41:             txt.y = 50;
  42:             txt.selectable = false;
  43:             txt.mouseEnabled = false;
  44:             txt.autoSize = TextFieldAutoSize.LEFT;
  45:             txt.width = 350;
//txt.height = 100;
  47:             txt.wordWrap = true;
  48:             txt.multiline = true;
  49:             txt.type = TextFieldType.INPUT;
  50:             txt.background = true;
  51:             txt.backgroundColor = 0x232323;
  52:             
new TextFormat();
  54:             txtfor.size = 15;
;
  56:             txtfor.bold = true;
  57:             txtfor.color = 0xffffff;
  58:             
  59:             txt.defaultTextFormat = txtfor;
  60:             txt.filters = [getTextGlowFilter(0xffcc66)];
  61:             
  62:             addChild(txt);
  63:             
//监听事件
new MovieClip();
  66:             
  67:             mc.graphics.clear();
  68:             mc.graphics.beginFill(0xcc0000, .7);
  69:             mc.graphics.drawCircle(100, 100, 50);
  70:             mc.graphics.endFill();
  71:             
  72:             addChild(mc);
  73:             
  74:             mc.buttonMode = true;
  75:             
  76:             
//重复的监听只会被调用一次
  78:             mc.addEventListener(MouseEvent.CLICK, onClickHandler);
  79:             mc.addEventListener(MouseEvent.CLICK, onClickHandler);
  80:             mc.addEventListener(MouseEvent.CLICK, onClickHandler);
  81:             
//检测是否绑定了指定的事件
'是否监听了MouseEvent.CLICK事件:' + mc.hasEventListener(MouseEvent.CLICK));
  84:             
//移除指定的监听事件
  86:             mc.removeEventListener(MouseEvent.CLICK, onClickHandler);
  87:             
//重复监听的事件,移除一次后将不再被监听
'是否监听了MouseEvent.CLICK事件:' + mc.hasEventListener(MouseEvent.CLICK));
  90:             
//使用匿名函数进行事件的监听
void {
  93:                     var _mc:MovieClip = e.target as MovieClip;
  94:                     _mc.removeEventListener(MouseEvent.CLICK, arguments.callee);
  95:                     
'~~haha~~我就是匿名函数【remove】');
  97:                 });
  98:                 
//下面使用getClickFn获得的是两个不同的匿名函数引用                
void {
 101:                     
 102:                     var _mc:MovieClip = evt.target as MovieClip;
 103:                     
 104:                     _mc.removeEventListener(MouseEvent.CLICK, fn);
 105:                     
);
 107:                     
 108:                 }), false, 1);
 109:             
 110:             mc.addEventListener(MouseEvent.CLICK, getClickFn(50));
 111:         }
 112:         
void 
 114:         {
 + getNow());
 116:         }
 117:         
private function getClickFn(n:Number=0, fn:Function=null):Function
 119:         {
 120:             var num:Number = n;
 121:             
void {                
 123:                 fn && fn(arguments.callee, evt);
 124:                 
'当前num的值:' + (++num));
 126:             }
 127:         }
 128:         
private function getNow():String
 130:         {
new Date();
 132:             var year:Number = date.getFullYear();
 133:             var month:Number = date.getMonth() + 1;
 134:             var day:Number = date.getDay();
 135:             
 136:             var hours:Number = date.getHours();
 137:             var minutes:Number = date.getMinutes();
 138:             var seconds:Number = date.getSeconds();
 139:             
);
 141:         }
 142:         
void
 144:         {
'\n');
 146:             
 147:             trace(str);
 148:         }
 149:         
 150:     }
 151:  
 152: }

相关文章:

  • 2021-12-31
  • 2021-09-06
  • 2021-10-01
  • 2022-12-23
  • 2021-12-26
  • 2021-08-16
猜你喜欢
  • 2021-05-09
  • 2021-09-27
  • 2022-01-09
  • 2021-12-20
  • 2022-12-23
  • 2022-12-23
  • 2021-07-26
相关资源
相似解决方案