我们来看看相关的API知识
public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void
我们平时用到的addEventListener其实它后边是有5个参数的 ,其中第一 第二个是最常用的 必须指定的参数,其它3个可根据情况使用 所以有默认值
参数 type:String — 事件的类型。
listener:Function — 处理事件的侦听器函数。此函数必须接受 Event 对象作为其唯一的参数,并且不能返回任何结果,如下面的示例所示:
function(evt:Event):void函数可以有任何名称。
useCapture:Boolean (default = false) — 确定侦听器是运行于捕获阶段、目标阶段还是冒泡阶段。如果将 useCapture 设置为 true,则侦听器只在捕获阶段处理事件,而不在目标或冒泡阶段处理事件。如果 useCapture 为 false,则侦听器只在目标或冒泡阶段处理事件。要在所有三个阶段都侦听事件,请调用 addEventListener 两次:一次将 useCapture 设置为 true,一次将 useCapture 设置为 false.
priority:int (default = 0) — 事件侦听器的优先级。优先级由一个带符号的 32 位整数指定。数字越大,优先级越高。优先级为 n 的所有侦听器会在优先级为 n -1 的侦听器之前得到处理。如果两个或更多个侦听器共享相同的优先级,则按照它们的添加顺序进行处理。默认优先级为 0。
useWeakReference:Boolean (default = false) — 确定对侦听器的引用是强引用,还是弱引用。强引用(默认值)可防止您的侦听器被当作垃圾回收。弱引用则没有此作用。
类级别成员函数不属于垃圾回收的对象,因此可以对类级别成员函数将 useWeakReference 设置为 true 而不会使它们受垃圾回收的影响。如果对作为嵌套内部函数的侦听器将 useWeakReference 设置为 true,则该函数将作为垃圾回收并且不再是永久函数。如果创建对该内部函数的引用(将该函数保存到另一个变量中),则该函数将不作为垃圾回收并仍将保持永久。
举例:
1)在父节点里面用子节点监听事件(如子节点1.addEventListener(。。。。))此时不需要设置addEventListener中的useCapture参数和new Event时Event的bubbles参数。就可以直接监听到子节点1的事件,因为此时直接在目标阶段捕捉事件。
2)直接用在父节点中加入但是addEventListener(。。。)也可以监听子节点1的事件,但是前提条件是在父节点监听事件的时候要把addEventListener中的useCapture参数设置成true(如addEventListener(MenuEvent.MENU_Event, handler,true)或者字节点1中new Event时将Event的bubbles参数设置为true( new MenuEvent(MenuEvent.MENU_Event,true))。如果都不这样的话,父节点是无法监听到事件的。
因为addEventListener中的useCapture的default模式是false也就是侦听器只在目标或冒泡阶段处理事件,而new Event时将Event的bubbles参数default也是false也就是说不参与事件流的冒泡阶段。如果不设置useCapture或者bubbles为true那父节点肯定无法监听到事件。
(3)如果非要在子节点2中监听子节点1中发出的事件怎么办?
1)办法有很多种,说一下最常用的一种,就是向子节点1 与子节点2 都传入一个相同的对象的实例,在子节点1中用这个对象实例发出事件,在子节点2中用这个对象实例监听事件(在目标阶段捕获事件)。这样就可以收到字节点1的事件了。
非自定义事件(如mouseEvent):
1)当是非自定义事件时。直接用在父节点中加入但是addEventListener(。。。)就可以监听子节点1的事件。
2)有人可能要问如果我要在子节点2监听子节点1的非自定义事件呢?可以用(上面的2 标题里面 3)),但是完全没有必要,比如,你说你在子节点2中监听子节点1的mouseClick 事件干吗??