Flex事件传播路径:Flex事件传播分为三个阶段:捕获、目标、冒泡
<application> <panel id=”panel1”> <hgroup> <button id=”btn”/> </hgroup> </panel> <panel panel=”panel2”> </panel> </application>
例如:点击panle1中组建button触发click事件执行流程:
捕获:最外层组件application检测自身是否定义了click事件的监听,如果定义了监听则执行监听函数,如果没有定义监听函数,则什么都不做;继续向内部容器传播事件,内部容器同样检查是否定义了监听函数,如果定义了监听函数则相应事件;事件由application容器一级一级的传播到hgroup容器,捕获阶段结束;
目标:事件的派发容器检测自身是否有定义相应函数,如果定义则执行;
冒泡:捕获的反过程。
捕获事件传播的路径:顶层容器->……->组件的父容器->派发事件对象的组件的兄弟组件;
目标组件传播路径:派发事件对象的组件
冒泡阶段传播路径:组件的父容器->……->顶层容器
注:由事件的传播路径可知:派发事件对象的组件父容器的兄弟容器检测不到其派发的事件。
阻止事件执行:在事件的执行过程中,可以通过stopPropagation()或stopImmediatePropagation()函数阻止事件的继续执行,二者的区别在与当前容器的兄弟容器的事件监听器是否被调用,执行stopPropagation()函数,当前容器的兄弟容器的监听器会运行;stopImmediatePropagation()当前容器的兄弟容器事件监听器不会执行,同时它还会阻止priority比它低的事件监听器的执行。
preventDefault():在当前事件的相应函数里面执行,取消默认的动作,例如在textinput中监听
如果在捕获阶段的事件相应函数里,执行stopPropagation()函数,则目标阶段和冒泡阶段将都不会再执行。
如果想在捕获和冒泡阶段分别执行不同的函数,可以设置useCapture=true或false,并定义相应的执行函数,在不同的事件传播阶段捕获事件。
添加事件监听:obj.addEventListener(type,listener,useCapture,priority,weekReference)
派发事件:obj.dispatchEvent(new Event(Event.type))
移除事件监听:obj.removeEventListener(type,listener)
判断是否定义了事件监听:obj.hasEventListener(type)
AS类继承EventDispatcher派发事件;AS类开始前用[Event(name=”type”,type=”package.EventName”)]声明可以派发的事件类型,当调用该类或调用或用该类声明组件时,可以添加type(EventName)的事件监听;MXML组件的<fx:Metadata>中声明[Event(name=”type”,type=”package.EventName”)]实现AS类类似的效果。
自定义的事件类继承自Event类,自定义类的构造方法中需要包含如下参数:type ,bubbles,cancelable,super(type,bubbles,cancelable);重写(overrider)clone():EventName方法,设置事件传递过程中需要传递的数据,以免丢失数据,如下,data是事件传递数据。
public override function clone():Event{
return new AppEvent(this.type, this.bubbles,this.cancelable);
}
Event类中属性currentTarget与target的区别:target是派发事件对象的对象,currentTarget处理事件对象的对象;如果在一个<s:button>组件中设置click事件,则该事件的target和currentTarget都是该button对象。
在事件中传递数据的方法:在自定义事件的构造方法中指定事件传递的数据,并在重写clone()方法时,保存传递数据的副本;通过Event对象的target属性和currentTarget属性获取传递的数据;
区别:在自定义事件中指定需要传递的数据后,在监听执行函数中可以直接通过自定义事件的数据get方法获取传递的数据,不管派发事件对象的对象类型;通过Event对象的target方法获取派发事件对象的对象,如果需要获取其中的数据,必须知道派发事件对象的对象的类型,并且派发事件对象的对象中必须有相应的get方法或者要获取的数据为public类型。