- 浏览: 102012 次
- 性别:
- 来自: 北京
-
文章分类
最新评论
-
chensong215:
无法获取到ProgressEvent中的bytesTotal
自定义DownloadProgressBar -
qq2464785999:
非常感谢。
测试后,发现要用相对路径的话,好像要这么写
va ...
Flex写XML文件
as3.0中如何阻止事件冒泡?
as3.0中的事件冒泡机制有时候会很烦人,比如一个Sprite(方便下文描述就命名为Container吧)把另一外Sprite(称为Child吧)做为子元素套进来以后,如果两个Sprite都注册了Mouse_Down事件,要想在Child上点击鼠标时系统只响应Child的Mouse_Down事件,默认是不行的,因为事件冒泡会让Container也响应Mouse_Down事件,示例代码:
View Code?
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 package{ import flash.display.*; import flash.events.MouseEvent; public class EventTest extends Sprite { public function EventTest() { var _container:Sprite = createRectangle(); var _child:Sprite = createRectangle(50,50,0x00ff00); var _sub_child:Sprite = createRectangle(25,25,0x0000ff); _child.addChild(_sub_child); _container.addChild(_child); addChild(_container); _container.y = _container.x = 50; _child.x = _container.width/2-_child.width/2; _child.y = _container.height/2-_child.height/2; _sub_child.x = _child.width/2-_sub_child.width/2; _sub_child.y = _child.height/2-_sub_child.height/2; _container.addEventListener(MouseEvent.MOUSE_DOWN,containerMouseDownHandler); _child.addEventListener(MouseEvent.MOUSE_DOWN,childMouseDownHandler); _sub_child.addEventListener(MouseEvent.MOUSE_DOWN,subChildMouseDownHandler); } private function subChildMouseDownHandler(e:MouseEvent):void{ trace("_sub_child.MOUSE_DOWN"); } private function subChildMouseDownHandler2(e:MouseEvent):void{ trace("_sub_child.MOUSE_DOWN_2"); } private function childMouseDownHandler(e:MouseEvent):void{ trace("_child.MOUSE_DOWN"); } private function containerMouseDownHandler(e:MouseEvent):void{ trace("_container.MOUSE_DOWN"); } private function createRectangle(width:uint=100,height:uint=100,color:uint=0xff0000):Sprite{ var s:Sprite = new Sprite(); s.graphics.beginFill(color,1); s.graphics.drawRect(0,0,width,height); s.graphics.endFill(); return s; } } }
鼠标点击最小的矩形后,输出如下:
_sub_child.MOUSE_DOWN
_child.MOUSE_DOWN
_container.MOUSE_DOWN
相当于点一个,触发了三个,要想阻止事件冒泡,可以调用e.stopImmediatePropagation()或stopPropagation()方法,即:
View Code?
123456 private function subChildMouseDownHandler(e:MouseEvent):void{ e.stopImmediatePropagation(); //或 //e.stopPropagation(); trace("_sub_child.MOUSE_DOWN"); }
这样在_sub_Child上点击时,另外二个Sprite就不会响应Mouse_Down事件,但是stopImmediatePropagation方法与stopPropagation有什么区别呢?Adobe总不至于傻到弄二个功能一样的东东吧
官方的解释:
stopImmediatePropagation():void
防止对事件流中当前节点中和所有后续节点中的事件侦听器进行处理。
stopPropagation():void
防止对事件流中当前节点的后续节点中的所有事件侦听器进行处理。
有点绕口, 还是直接来看代码吧,把上面的示例改造一下,让_sub_Child的Mouse_Down事件同时添加二个监听
View Code?
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 package{ import flash.display.*; import flash.events.MouseEvent; public class EventTest extends Sprite { public function EventTest() { var _container:Sprite = createRectangle(); var _child:Sprite = createRectangle(50,50,0x00ff00); var _sub_child:Sprite = createRectangle(25,25,0x0000ff); _child.addChild(_sub_child); _container.addChild(_child); addChild(_container); _container.y = _container.x = 50; _child.x = _container.width/2-_child.width/2; _child.y = _container.height/2-_child.height/2; _sub_child.x = _child.width/2-_sub_child.width/2; _sub_child.y = _child.height/2-_sub_child.height/2; _container.addEventListener(MouseEvent.MOUSE_DOWN,containerMouseDownHandler); _child.addEventListener(MouseEvent.MOUSE_DOWN,childMouseDownHandler); //注意:这里同时添加了二个监听,并设置了优点级(subChildMouseDownHandler2的优先级高于subChildMouseDownHandler1) _sub_child.addEventListener(MouseEvent.MOUSE_DOWN,subChildMouseDownHandler1,false,1); _sub_child.addEventListener(MouseEvent.MOUSE_DOWN,subChildMouseDownHandler2,false,2); } private function subChildMouseDownHandler1(e:MouseEvent):void{ trace("_sub_child.MOUSE_DOWN_1"); } private function subChildMouseDownHandler2(e:MouseEvent):void{ trace("_sub_child.MOUSE_DOWN_2"); } private function childMouseDownHandler(e:MouseEvent):void{ trace("_child.MOUSE_DOWN"); } private function containerMouseDownHandler(e:MouseEvent):void{ trace("_container.MOUSE_DOWN"); } private function createRectangle(width:uint=100,height:uint=100,color:uint=0xff0000):Sprite{ var s:Sprite = new Sprite(); s.graphics.beginFill(color,1); s.graphics.drawRect(0,0,width,height); s.graphics.endFill(); return s; } } }
重复刚才的测试,在最小的矩形_sub_Child上点击,输入如下:
_sub_child.MOUSE_DOWN_2
_sub_child.MOUSE_DOWN_1
_child.MOUSE_DOWN
_container.MOUSE_DOWN
然后把subChildMouseDownHandler2改成:
View Code?
1234 private function subChildMouseDownHandler2(e:MouseEvent):void{ e.stopImmediatePropagation(); trace("_sub_child.MOUSE_DOWN_2"); }
重复刚才的测试,输出如下:
_sub_child.MOUSE_DOWN_2
再试下stopPropagation方法
?1234 private function subChildMouseDownHandler2(e:MouseEvent):void{ e.stopPropagation(); trace("_sub_child.MOUSE_DOWN_2"); }
这回输出不同了:
_sub_child.MOUSE_DOWN_2
_sub_child.MOUSE_DOWN_1
小结:如果某对象的一个事件同时添加多个监听,stopPropagation将把该事件注册的所有监听处理函数执行完后,再阻止该事件继续向上冒泡;而stopImmediatePropagation方法将本次处理函数执行完后就立即阻止事件继续向上冒泡(即同一事件的其它监听函数将不会执行)。
作者:菩提树下的杨过
出处:http://yjmyzz.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
as3.0中的事件冒泡机制有时候会很烦人,比如一个Sprite(方便下文描述就命名为Container吧)把另一外Sprite(称为Child吧)做为子元素套进来以后,如果两个Sprite都注册了Mouse_Down事件,要想在Child上点击鼠标时系统只响应Child的Mouse_Down事件,默认是不行的,因为事件冒泡会让Container也响应Mouse_Down事件,示例代码:
View Code?
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 package{ import flash.display.*; import flash.events.MouseEvent; public class EventTest extends Sprite { public function EventTest() { var _container:Sprite = createRectangle(); var _child:Sprite = createRectangle(50,50,0x00ff00); var _sub_child:Sprite = createRectangle(25,25,0x0000ff); _child.addChild(_sub_child); _container.addChild(_child); addChild(_container); _container.y = _container.x = 50; _child.x = _container.width/2-_child.width/2; _child.y = _container.height/2-_child.height/2; _sub_child.x = _child.width/2-_sub_child.width/2; _sub_child.y = _child.height/2-_sub_child.height/2; _container.addEventListener(MouseEvent.MOUSE_DOWN,containerMouseDownHandler); _child.addEventListener(MouseEvent.MOUSE_DOWN,childMouseDownHandler); _sub_child.addEventListener(MouseEvent.MOUSE_DOWN,subChildMouseDownHandler); } private function subChildMouseDownHandler(e:MouseEvent):void{ trace("_sub_child.MOUSE_DOWN"); } private function subChildMouseDownHandler2(e:MouseEvent):void{ trace("_sub_child.MOUSE_DOWN_2"); } private function childMouseDownHandler(e:MouseEvent):void{ trace("_child.MOUSE_DOWN"); } private function containerMouseDownHandler(e:MouseEvent):void{ trace("_container.MOUSE_DOWN"); } private function createRectangle(width:uint=100,height:uint=100,color:uint=0xff0000):Sprite{ var s:Sprite = new Sprite(); s.graphics.beginFill(color,1); s.graphics.drawRect(0,0,width,height); s.graphics.endFill(); return s; } } }
鼠标点击最小的矩形后,输出如下:
_sub_child.MOUSE_DOWN
_child.MOUSE_DOWN
_container.MOUSE_DOWN
相当于点一个,触发了三个,要想阻止事件冒泡,可以调用e.stopImmediatePropagation()或stopPropagation()方法,即:
View Code?
123456 private function subChildMouseDownHandler(e:MouseEvent):void{ e.stopImmediatePropagation(); //或 //e.stopPropagation(); trace("_sub_child.MOUSE_DOWN"); }
这样在_sub_Child上点击时,另外二个Sprite就不会响应Mouse_Down事件,但是stopImmediatePropagation方法与stopPropagation有什么区别呢?Adobe总不至于傻到弄二个功能一样的东东吧
官方的解释:
stopImmediatePropagation():void
防止对事件流中当前节点中和所有后续节点中的事件侦听器进行处理。
stopPropagation():void
防止对事件流中当前节点的后续节点中的所有事件侦听器进行处理。
有点绕口, 还是直接来看代码吧,把上面的示例改造一下,让_sub_Child的Mouse_Down事件同时添加二个监听
View Code?
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 package{ import flash.display.*; import flash.events.MouseEvent; public class EventTest extends Sprite { public function EventTest() { var _container:Sprite = createRectangle(); var _child:Sprite = createRectangle(50,50,0x00ff00); var _sub_child:Sprite = createRectangle(25,25,0x0000ff); _child.addChild(_sub_child); _container.addChild(_child); addChild(_container); _container.y = _container.x = 50; _child.x = _container.width/2-_child.width/2; _child.y = _container.height/2-_child.height/2; _sub_child.x = _child.width/2-_sub_child.width/2; _sub_child.y = _child.height/2-_sub_child.height/2; _container.addEventListener(MouseEvent.MOUSE_DOWN,containerMouseDownHandler); _child.addEventListener(MouseEvent.MOUSE_DOWN,childMouseDownHandler); //注意:这里同时添加了二个监听,并设置了优点级(subChildMouseDownHandler2的优先级高于subChildMouseDownHandler1) _sub_child.addEventListener(MouseEvent.MOUSE_DOWN,subChildMouseDownHandler1,false,1); _sub_child.addEventListener(MouseEvent.MOUSE_DOWN,subChildMouseDownHandler2,false,2); } private function subChildMouseDownHandler1(e:MouseEvent):void{ trace("_sub_child.MOUSE_DOWN_1"); } private function subChildMouseDownHandler2(e:MouseEvent):void{ trace("_sub_child.MOUSE_DOWN_2"); } private function childMouseDownHandler(e:MouseEvent):void{ trace("_child.MOUSE_DOWN"); } private function containerMouseDownHandler(e:MouseEvent):void{ trace("_container.MOUSE_DOWN"); } private function createRectangle(width:uint=100,height:uint=100,color:uint=0xff0000):Sprite{ var s:Sprite = new Sprite(); s.graphics.beginFill(color,1); s.graphics.drawRect(0,0,width,height); s.graphics.endFill(); return s; } } }
重复刚才的测试,在最小的矩形_sub_Child上点击,输入如下:
_sub_child.MOUSE_DOWN_2
_sub_child.MOUSE_DOWN_1
_child.MOUSE_DOWN
_container.MOUSE_DOWN
然后把subChildMouseDownHandler2改成:
View Code?
1234 private function subChildMouseDownHandler2(e:MouseEvent):void{ e.stopImmediatePropagation(); trace("_sub_child.MOUSE_DOWN_2"); }
重复刚才的测试,输出如下:
_sub_child.MOUSE_DOWN_2
再试下stopPropagation方法
?1234 private function subChildMouseDownHandler2(e:MouseEvent):void{ e.stopPropagation(); trace("_sub_child.MOUSE_DOWN_2"); }
这回输出不同了:
_sub_child.MOUSE_DOWN_2
_sub_child.MOUSE_DOWN_1
小结:如果某对象的一个事件同时添加多个监听,stopPropagation将把该事件注册的所有监听处理函数执行完后,再阻止该事件继续向上冒泡;而stopImmediatePropagation方法将本次处理函数执行完后就立即阻止事件继续向上冒泡(即同一事件的其它监听函数将不会执行)。
作者:菩提树下的杨过
出处:http://yjmyzz.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
发表评论
-
flex 自定义多个命名空间以及标签名
2013-01-22 15:21 1363flex 自定义多个命名空 ... -
FLEX中使用AS动态创建DataGrid
2013-01-09 16:24 930FLEX中使用AS动态创建DataGrid 2010年2月6日 ... -
flex与flash之间相互调用
2012-12-12 12:39 648http://www.cnblogs.com/kaixuan/ ... -
Flex与Flex创建的swf通信
2012-12-12 10:16 753加载子SWF的Flex程序代码 <?xml vers ... -
[AS3]加载视频(FLV)文件
2012-12-06 15:11 875[AS3]加载视频(FLV)文件 分类: FLEX/CS3-- ... -
通过FileReference打开本地图片崩溃的解决方法
2012-12-06 14:02 728通过FileReference打开本地图片崩溃的解决方法 最近 ... -
使用FileReference的load()方法加载本地图片
2012-12-06 13:56 9621、要想使用FileReference的load()方法和da ... -
[AS3]Bitmap序列化(将BitmapData保存为原生Binary/ByteArray)
2012-12-06 13:48 765[AS3]Bitmap序列化(将BitmapData保存为原生 ... -
as3 画五角星算法
2012-12-05 16:49 2651as3 画五角星算法 阅读:10次 时间:2012-03- ... -
flex嵌入完整html
2012-11-29 11:18 821有时候我们需要在Flex应用中嵌入HTML代码,根据嵌入HTM ... -
flex4 textArea的htmlText属性
2012-11-29 11:13 3136它现在包含Text布局框架(Text Layout Frame ... -
Tooltip应用
2012-11-29 11:11 741创建ToolTip: var errorToolTip:To ... -
数据绑定显示问题
2012-10-27 12:11 714数据绑定实时变化。 XMLListCollection 可以变 ... -
待解决问题
2012-09-18 23:48 7361.仪表盘 2.渐变填充的使用 3.发光效果的完美运用 能在一 ... -
as3加载外部图片的两种方式
2012-09-09 11:46 1074package net.burchin.loading { ... -
公式as3
2012-09-06 18:13 0as3 1人收藏此文章, 我要收藏 发表于1年前(2011-0 ... -
Flex中多线程的实现
2012-09-06 10:49 3550破阵子_如是我闻 如是我闻。一时佛在舍卫国,祗树给孤独园.. ... -
自定义column renderer
2012-08-09 15:07 985<?xml version="1.0" ... -
drowshadowFilter
2012-08-09 15:05 699DropShadowFilter 类,在Flash中为各种对象 ... -
123123
2012-08-08 17:16 0http://www.oschina.net/code/sni ...
相关推荐
这个文件会包含AS3.0的语法、类库、方法、事件、属性等全面信息,便于开发者查询和学习。它会按照类库结构组织内容,例如DisplayObject容器、EventDispatcher、Sound和Video等,还会详细解释ActionScript的基础概念...
在这个项目中,你使用AS3.0构建了一个音乐播放器,这涉及到多媒体处理、用户界面设计以及事件处理等多个方面的知识。 首先,AS3.0在处理音乐播放时,主要使用了`Sound`类和`SoundChannel`类。`Sound`类用于加载和...
AS3.0 算法大全是一份集合了多种Flash ActionScript 3.0中常见算法的教程资源,特别适合初学者和有一定经验的开发者学习。这个教程涵盖了许多实用的编程技巧和理论知识,旨在帮助用户提升在Flash平台上的开发能力。 ...
在AS3.0中,可以设置一个定时器(Timer)对象,每隔一段时间触发一个事件,进而改变当前显示的图片。手动切换则是用户通过点击或拖动等交互方式来选择想要查看的图片。这通常涉及到事件监听(addEventListener)和...
14. **数据结构排序算法**:这部分内容介绍了各种排序算法的实现,包括但不限于冒泡排序、快速排序等,并讨论了它们在AS3.0中的应用。 15. **AS文本计算器**:通过解析文本输入并执行计算操作,实现了一个简单的...
2. 事件驱动编程:AS3.0的事件模型使得程序能响应用户交互和其他系统事件。理解事件监听器、事件对象和事件冒泡机制是编写交互式应用的关键。 3. 数据类型和变量:AS3.0支持基本数据类型(如Number、Boolean、...
8. **事件驱动编程**:书中也会涉及AS3.0中的事件系统,包括事件监听、事件冒泡和事件处理,这对于创建响应用户输入的互动动画至关重要。 9. **最佳实践**:书中还将分享一些AS3.0动画开发的最佳实践,帮助开发者...
4. **事件模型**:AS3的事件模型是基于观察者模式的,它支持事件冒泡、事件捕获和事件目标,使得程序的交互逻辑更加简洁和高效。 5. **强大的类库**:AS3包含许多内置类,如DisplayObject容器、Sprite和MovieClip,...
与早期版本相比,AS3中的事件处理更加高效,事件监听器可以被添加和移除,使得程序可以根据用户交互或特定条件动态响应。事件模型包括冒泡、捕获和目标三个阶段,使事件处理更为灵活。 在AS3中,DisplayObject容器...
在Flash CS4中,ActionScript 3.0(AS3)是主要的编程语言,用于创建交互式的动画、游戏和应用程序。下拉菜单是网页和应用程序界面中的常见元素,它提供了一种有效的方式来组织和展示大量的选项。这篇教程将深入探讨...
在AS3.0中,事件模型得到了统一,所有事件都基于事件流机制,包括捕获阶段、目标阶段和冒泡阶段。事件流允许事件从舞台的最顶层(捕获阶段)向下传播,直到达到事件源(目标阶段),然后再从底部向上冒泡回舞台顶层...
在AS3.0中,事件处理机制使得代码结构更加清晰,可以将界面逻辑与业务逻辑分离,从而提升代码的可读性和可复用性。书中会讲解如何使用addEventListener、removeEventListener和dispatchEvent方法来添加、移除事件...
2. **事件模型**:AS3的事件模型更加成熟,支持事件冒泡和事件捕获,增强了组件间的通信。 3. **面向对象**:完全支持类、接口和继承,使得代码结构更加清晰。 4. **性能提升**:AS3的执行速度显著提升,因为它运行...
在ActionScript 3.0(AS3)中,事件监听是程序交互和响应用户操作的核心机制。本案例将深入探讨如何使用EventListener进行事件监听,并通过实际的代码示例来帮助初学者理解这一概念。 首先,事件是AS3中的一个重要...
2. **事件驱动编程**:AS3中的事件处理机制是游戏响应用户输入和系统状态变化的关键。事件监听器、事件对象和事件冒泡是理解这一机制的核心。 3. **图形绘制和显示对象**:Flash舞台上的一切都是DisplayObject,...
4. **事件处理**:AS3中的事件模型是其强大之处,文档会涵盖Event类、EventDispatcher接口、事件监听器注册与移除,以及不同类型的事件(如MouseEvent、KeyboardEvent)。 5. **显示列表和图形编程**:学习如何操作...
在AS3.0中,XML处理变得更加简单和强大,可以方便地用于数据交换和存储,这对于构建数据驱动的应用程序非常有用。 接下来的五到十部分聚焦于ActionScript 3.0的事件机制。事件模型是AS3.0的一个核心组件,它允许...
在ActionScript 3.0 (简称AS3)中,事件处理机制是程序设计的核心之一。掌握AS3中的事件属性及其应用场景对于开发高质量的交互式应用程序至关重要。本文将深入探讨AS3事件流中的两个关键属性——`target`与`...
本部分将详细介绍如何在AS3中添加事件监听器、处理事件以及理解事件流的概念。 - **事件监听器**: 通过`addEventListener`方法可以为对象添加事件监听器。 - **事件处理**: 当触发特定事件时,事件处理函数会被调用...
- **事件冒泡和捕获**:事件可以在目标对象及其祖先对象之间传递,允许在不同层级上处理事件。 4. **显示列表**: - **DisplayObject容器**:如Sprite和MovieClip,用于组织和管理舞台上的可视元素。 - **坐标...