event.stopPropagation();
防止对事件流中当前节点的后续节点中的所有事件侦听器进行处理。此方法不会影响当前节点 (currentTarget) 中的任何事件侦听器。相比之下,stopImmediatePropagation() 方法可以防止对当前节点中和后续节点中的事件侦听器进行处理。对此方法的其它调用没有任何效果。可以在事件流的任何阶段中调用此方法。
注意:此方法不会取消与此事件相关联的行为;有关此功能的信息,请参阅 preventDefault()。
event.stopImmediatePropagation();
防止对事件流中当前节点中和所有后续节点中的事件侦听器进行处理。此方法会立即生效,并且会影响当前节点中的事件侦听器。相比之下,在当前节点中的所有事件侦听器都完成处理之前,stopPropagation() 方法不会生效。
注意:此方法不会取消与此事件相关联的行为;有关此功能的信息,请参阅 preventDefault()。
Flex事件 是一种触发机制,当满足一定的条件后会触发这个事件。Flex事件分为用户事件和系统事件,用户事件是人触发的,系统事件是Flex自身触发的。事件的传播分为三个阶段:捕获阶段、目标阶段、冒泡阶段。冒泡是捕获的相反阶段。这三个阶段,我们记住两个对象,target和currentTarget,简单说,target是引发事件的源对象,currentTarget是监听这个事件的对象。
Target:事件指向的目标,但并非事件的派发者。
currentTarget:事件的派发者。简单的说是派发事件的对象。
事件有两种处理方式:第一种在子组件的metadata标签中声明一个事件,如果没有声明,就找不到这个事件名称的属性,只能通过addEventListener()这种处理方式来处理。
继承EventDispatcher对象都会含有dispatchEvent这个方法,事件是由这个方法分发出去的,分发是没有目的的,一种广播形式,Flex的事件监听会接收到各种各样的事件,通过事件的type属性来区分哪种才是你想要的事件。
整个AS3事件的生命周期和DOM对象上JS 事件生命周期完全相同。这套机制最大的好处是可以减少同一个UI对象监听器数量,从而带来性能优化,举个例子:canvas上有n个button,如果给每个button注册一个click事件,那么内存中就需要维护n个listener。由于click事件是冒泡的,那么更好的解决方法是给canvas注册一个click事件。通过事件的冒泡阶段由n个button共同的父元素canvas来派发click事件,并通过事件参数target属性来决定调用哪个button对应的处理函数。这样做的好处是只注册一个事件监听从而代替为n个button注册事件监听。
AS3中为IEventDispatcher类型对象注册事件监听的接口
addEventListener(type:String,listener:Function,useCapture:Boolean=false,priority:int=0,useWeakReference:Boolean=false):void
useCapture=true,那就是说事件只能在捕获阶段被派发
Priority监听函数的优先级,priority为整数类型,数字越大,级别越高,级别越高的最先被调用
如果没有useCapture这个参数,那么走完整个事件的生命周期,所有目标父节点上注册的事件都会被执行两次(捕获阶段一次冒泡阶段一次)拿上面n个button例子来说,如果用户点击某个button会触发click事件,我们来看整个click事件的生命周期会经历的UI对象
Stage->canvas->button->canvas->stage
首先是捕获阶段事件从该button所处显示对象根出发,也就是stage ,stage上未注册click事件,不会做出任何响应,然后来到子节点canvas,我们在canvas上注册了click事件,而此时click事件不会被派发,因为我们注册的click事件使用默认的useCapture=false参数,即click事件必须在目标和冒泡阶段才能被派发。
然后进入目标阶段,尽管目标是button,但由于其未注册任何click事件监听所以也不做任何响应,由于click事件是冒泡事件,所以最后进入冒泡阶段,从button 到canvas,canvas注册了click事件监听,所以canvas派发该事件,进入事件处理函数,此时target是button ,currentTarget是canvas。
如果useCapture为true呢?这样有三点好处:1、事件不会经历目标和捕获阶段,这样只有当且仅当事件的target为监听对象的子对象时,事件才会被派发。点击canvas本身,事件流首先会进入捕获阶段从目标(canvas)所在显示对象列表根(stage)开始向下,来到canvas,这时event.target==canvas进入目标阶段,尽管canvas注册了click事件,但useCapture参数为true,那就是说事件只能在捕获阶段被派发,所以这个事件不会被派发出来,也就是点击canvas没有任何响应。2、不用考虑事件是否支持冒泡。3、由于少了两个阶段,必然少折腾一些传递。
参考:
深入理解Flex的事件机制
http://www.cnblogs.com/yuxuanji/articles/2126275.html