事件:
import mx.Events.PropertyChangeEvent; import mx.Binding.utils.*; import mx.Events.FlexEvent; public var thiswatcher:ChangeWatcher; public function initFunction():void { watchInit(); } public function watchInit():void { thiswatcher=ChangeWatcher.watch(textInput,"text" func); // 告诉ChangeWatcher去监听那些变化 } public function stopEvent():void { if(thiswatch.isWatching()) { thiswatcher.unwatch();//取消监听 } } public function func():void { mylable.text=textInput.text; }
//移除事件监听器 在mxml中定义的定义的事件必须使用removeEventListener();
来实现
import mx.controle.Alert; [Bindable] public var labeltext:Stirng="hello word"; public var count:Number=0; public function clickFunction(event:Event):void { var messag:String="hello "+event.target.label; Alert.show(message); } public function addEvent():void { if(myButtion.hasEventListener(MousEvetn.MOUS_OVER)) { myButtion.removeEventListener (MousEvetn.MOUS_OVER,changeLabel); count=0; labeltext="remove"; }else { myButton.addEventListener (MousEvetn.MOUS_OVER,changeLabel); } } public function changeLabel(event:MouseEvent):void { count++; }
//自定义事件
import flash.events.Event; import mx.controls.Alert; public function initFunction():void { mybuttion.addEventListener("newEvent",respondEvent); } public function doEvent():void //click="doEvent" { mybutton.dispatchEvent(new Event("newEvent")); } public function respondEvent(e:Event):void { Alert.show(e.type); }
//自定义事件
import flash.events.Event;
public class TestEvent extends Event
{
public static const TEST_EVENT:String="TEST_EVENT";//事件类型
public var data:Object; //存储事件附加信息
/**
*自定义事件的构造器
*/
public function TestEvent(type:String, bubbles:Boolean = false,
cancelable:Boolean = false)
{
super(type,bubbles,cancelable);
}
} //end class
import flash.events.EventDispatcher;
import mx.controls.Alert;
public class TestEventDispacher extends EventDispatcher
{
public function TestEventDispacher()
{
super();
//将onTestEvent成员函数作为该对象所派发的TestEvent事件的侦听//器以处理
传递给该事件
this.addEventListener(TestEvent.TEST_EVENT,onTestEvent);
}
public function createAndDispatchTestEvent():void
{
//创建一个新事件对象,在被调度之前,事件对象的target属性为null
var testEvent:TestEvent=new TestEvent(TestEvent.TEST_EVENT);
//为事件添加附加信息data
testEvent.data="this is a test event";
//调度该事件,该方法执行后,事件的target属性被设置为
// 执行该方法的TestEventDispacher对象。
this.dispatchEvent(testEvent);
Alert.show("当testEvent对象所有侦听器都执行完毕你才会看到我!");
}
//事件侦听器,用来对侦听到的事件进行处理。
private function onTestEvent(event:TestEvent):void
{
//在控制台中打印侦听器侦听到的TestEvent事件对象data属性中所存//储的
事件附加信息
Alert.show(event.data.toString());
}
}//end class
private function doOnButtonClick():void
{
var ted:TestEventDispacher=new TestEventDispacher();
ted.createAndDispatchTestEvent();
}
在任何事件阶段都可以使用stopPropagation()和sotpimmediatePropagation();
这两个方法的本质上都是想相同的,区别在余是否允许同一个组件上
的其它时间按侦听器接受相应的事件换句话说,如果在事件上调用
evet.stopPropagation()
方法它会在给定的组件上的所有其它事件的侦听器完成对这个时间的响应之后停
止事件的传播
如果使用sotpimmediatePropagation();方法实践会在传播到其它任何事件侦听器
之前被终止,即使这些事件
侦听器侦听的是同一个组件
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="initFunction()"> <mx:Script> <![CDATA[ import mx.controls.Alert; public function initFunction():void { mybutton.addEventListener("click",respondToEvent,false,100);// 添加带有最高优先级的事件侦听器 myHBox.addEventListener("click",parentEventResponse,false,0); } public function respondToEvent(e:Event):void { var msg:String="this is the first responder"; Alert.show(msg,"first event listener"); e.stopImmediatePropagation(); } public function responedEventClick(e:Event):void { Alert.show("this is the mxml click Event"); } public function parentEventResponse(e:Event):void { Alert.show("you shoud never see ths alert","parent Event Response"); } ]]> </mx:Script> <mx:HBox x="158" y="180" width="291" height="165" id="myHBox"> <mx:Button label="Button" id="mybutton" click="responedEventClick(event)"/> </mx:HBox> </mx:Application>
如果把e.stopPropagation()修改成e.stopImmediatePropagation();
结果看到的是一个警告e.stopImmediateP事件ropagation()方法会在第一个事件
侦听器执行完毕后
立即终止传播而e.stopPropagation();终止当前的事件传播
stopImmediatePropagation():void
防止对事件流中当前节点中和所有后续节点中的事件侦听器进行处理。防止对事
件流中当前节点中和所有后续节点中的事件侦听器进行处理。此方法会立即生效
,并且会影响当前节点中的事件侦听器。相比之下,在当前节点中的所有事件侦
听器都完成处理之前,stopPropagation() 方法不会生效。
stopPropagation():void
防止对事件流中当前节点的后续节点中的所有事件侦听器进行处理。防止对事件
流中当前节点的后续节点中的所有事件侦听器进行处理。 此方法不会影响当前节
点 (currentTarget) 中的任何事件侦听器。相比之下,
stopImmediatePropagation() 方法可以防止对当前节点中和后续节点中的事件侦
听器进行处理。 对此方法的其它调用没有任何效果。可以在事件流的任何阶段中
调用此方法。
如果使用 e.stopPropagation(),结果
btn click
hbox click
否则如果没有使用的话,
btn click
hbox click
pan click
stage click
//主键添加元数据
<mx:Metadate>
[Event(name="customButtonClick",true)]
</mx:Metadate>
this.dispatchEvent(new Event("customButtonClick"),true);
相关code:
<?xml version="1.0" encoding="utf-8"?> <mx:VBox xmlns="*" xmlns:mx="http://www.adobe.com/2006/mxml"> <mx:Metadata> [Event(name="customButtonClick", type="flash.events.Event")] </mx:Metadata> <mx:Script> <![CDATA[ public function doCustomEvent():void { this.dispatchEvent(new Event("customButtonClick",true)); } ]]> </mx:Script> <mx:Button id="myButton" label="click me to dispatch custom event" click="doCustomEvent()"/> </mx:VBox>
------------------------------------------------------------------------------------------------------
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" xmlns:comp="components.*"> <mx:Script> <![CDATA[ import mx.controls.Alert; public function doAlert(e:Event):void { Alert.show("this is the alert thrown from the parent app in response to component custom event","component custom event"); } ]]> </mx:Script> <comp:CustomEventMeta customButtonClick="doAlert(event)"/> </mx:Application>
1.不是所有的事件都有三个阶段:Capture,Target,Bubbling。
事件只有在DisplayObject才上有Capturing和Bubbling阶段。
2.Target是派发该事件的对象。CurrentTarget是监听了该事件并正在处理该事
件的对象。
3.Capturing流程:StageàSystemManageràApplicationà…à派发该事件的父对象
。
4.Bubbling流程:派发该事件的父对象à…àApplicationàSystemManageràStage
。
5.在mxml标签中定义的事件监听器是无法用removeEventListener()去掉的,并
且无法设置useCapture和priority属性。
6.用removeEventListener()去掉未添加的事件器时是不会报错的,所有无需用
hasEventListener()判断,但添加时需要判断,否则可能会添加多次。
7.Priority越大的监听器,越先执行。
8.weakRef对于非内嵌函数没用。
9.一个对象可以给同一个事件多个监听器:
假如按添加顺序是eventListener1,eventListener2和eventListener3。
eventListener1没有调stopPropagation()和stopImmediatePropagation()方法。
假设eventListener2调了其中的stopPropatation(),则eventListener3还会继续
执行。但如果eventListener2调的是stopImmediatePropagation(),则
eventListener3不会继续执行。
10.removeEventListener()只能一次去掉一个监听器,为同一个事件添加了几个
监听器就需要调几次removeEventListener(),而且参数要相符。
11.hasEventListener()与willTrigger()的区别是:hasEventListener()只检查
它所属的对象,而willTrigge()检查整个事件流以查找由type参数指定的事件。
12.keyCode对应的是key在键盘上的键值,是一个数字;charCode对应的是该key
在当前字符集中的值,也是一个数字。因此就有下面的情况发生:1和!的keyCode
是一样的,但他们的charCode是不一样的。
事件只有在DisplayObject才上有Capturing和Bubbling阶段。
从根节点到叶节点的父对象
从叶节点的父对象到根节点
如果设为true,只有内嵌函数可能会被垃圾回收器处理。
指stopPropagation()和stopImmediatePropagation()
use_capture
包括检查所有的父对象。
keyCode和keyChar都是KeyBoardEvent的属性。