浏览 8340 次
精华帖 (1) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-07-15
8.2 事件机制的工作流程
目标对象:派发事件的对象
当事件发生后生成一个携带数据的对象,然后检查目标对象是否存在显示层中,并遍历从根容器一直到目标对象所在位置的所有对象,以树形势表示。自动检测所经过的节点是否注册了监听器。 事件流暗运行流程分为3步:
每个事件对象都有以下属性: target:事件的派发者 currentTarget:当前正在检测的的对象,帮助跟踪事件传播的过程。 默认情况下,捕获功能处于关闭状态,一般没有必要进行捕获跟踪。 事件只在bubbles 属性为true 时才进行冒泡,可以冒泡的事件包括:change、click、doubleClick、keyDown、keyUp、mouseDown、 mouseUp。并且不能在一个监听器中同时打开捕获和冒泡功能,要做到这一点,只能注册两个监听器,分别实现。 现在来看一个例子: <?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="initApp()"> <mx:Style source="style.css" /> <mx:Script> <![CDATA[ import flash.events.MouseEvent; internal function initApp():void{ canvas_1.addEventListener(MouseEvent.CLICK,pressBtn,true); canvas_2.addEventListener(MouseEvent.CLICK,pressBtn); btn_1.addEventListener(MouseEvent.CLICK,pressBtn); btn_2.addEventListener(MouseEvent.CLICK,pressBtn); } internal function output(msg:String):void{ debug_txt.text += msg+"\n"; } internal function pressBtn(evt:MouseEvent):void{ output("是否冒泡--"+evt.bubbles); output("目标对象-- "+evt.target+" -- "+evt.eventPhase); output("遍历对象-- "+evt.currentTarget); output("------------"); } ]]> </mx:Script> <mx:Canvas id = "canvas_1" styleName="box" x="37" y="63" width="445" height="216"> <mx:Text x="13" y="10" text="Canvas_1"/> <mx:Canvas id="canvas_2" styleName="box" x="10" y="102" width="173" height="90"> <mx:Text x="10" y="10" text="Canvas_2"/> <mx:Button id = "btn_2" x="10" y="38" label="Button_2"/> </mx:Canvas> <mx:Button id="btn_1" x="16" y="38" label="Button_1"/> </mx:Canvas> <mx:TextArea id="debug_txt" styleName="textBox" x="37" y="304" height="198" width="445"/> </mx:Application>
8.2.2 事件对象
EventDispatcher 是派发事件的武器,经它派发的事件对象必须是Event类型或者Event的子类。
Event对象中包含目标对象存放的数据,这些数据都成为Event的属性,以供侦听器使用: Event的属性:
构造函数: Event( type:String, 事件类型 bubbles:Boolean = false, 是否冒泡 cancelable:Boolean = false 是否可以停止 ) Event 的方法:
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="initApp()"> <mx:Style source="style.css" /> <mx:Script> <![CDATA[ import flash.events.MouseEvent; internal function initApp():void{ canvas_1.addEventListener(MouseEvent.CLICK,CanvasHandler); canvas_2.addEventListener(MouseEvent.CLICK,CanvasHandler); canvas_2.addEventListener(MouseEvent.CLICK,pressBtn); btn_1.addEventListener(MouseEvent.CLICK,pressBtn); } internal function output(msg:String):void{ debug_txt.text += msg+"\n"; } internal function pressBtn(evt:MouseEvent):void{ output("是否冒泡--"+evt.bubbles); output("目标对象-- "+evt.target+" -- "+evt.eventPhase); output("遍历对象-- "+evt.currentTarget); output("------------"); } internal function CanvasHandler(evt:MouseEvent):void{ output("目标对象-- "+evt.currentTarget+" -- "+evt.eventPhase); //停止事件流的传播 evt.stopImmediatePropagation(); //evt.stopPropagation(); } ]]> </mx:Script> <mx:Canvas id = "canvas_1" styleName="box" x="37" y="63" width="425" height="160"> <mx:Text x="13" y="10" text="Canvas_1"/> <mx:Canvas id="canvas_2" styleName="box" x="10" y="52" width="173" height="90"> <mx:Text x="10" y="10" text="Canvas_2"/> <mx:Button id = "btn_1" x="10" y="38" label="Button_1"/> </mx:Canvas> </mx:Canvas> <mx:TextArea id="debug_txt" styleName="textBox" x="37" y="245" height="198" width="425"/> </mx:Application>
8.2.3 侦听和响应事件--一个侦听键盘事件的例子
要侦听一个事件,首先要创建一个函数来作为事件处理器,然后将这个函数注册给相应的时间类型。
this.addEventListener(KeyboardEvent.KEY_DOWN,keyHandler); 注册键盘按下事件,交给keyHandler处理,也可以在Application标签添加事件: keyDown="keyHandler(event)" 这种情况无法移除事件。 注册了事件监听器,使用完毕后,必须使用removeEcentListener 方法删除监听函数: removeEcentListener( type:String, 事件类型 listener:Function, 监听函数 useCapture:Boolean = false 是否开启捕获功能,如果注册时打开,移除也要打开。 ) <?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="initApp()"> <mx:Style source="style.css" /> <mx:Script> <![CDATA[ import flash.events.KeyboardEvent; internal function initApp():void{ this.addEventListener(KeyboardEvent.KEY_DOWN,keyHandler); } private function keyHandler(e:KeyboardEvent):void{ var str:String = "你按下的是: "+e.keyCode; debug_txt.text += str +"\n"; } ]]> </mx:Script> <mx:TextArea id="debug_txt" styleName="textBox" x="25" y="78" height="198" width="212" editable="false"/> <mx:Text x="25" y="50" text="按键盘上的任意键"/> </mx:Application> 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |