`
it_liuyong
  • 浏览: 102012 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

as3.0中如何阻止事件冒泡?

    博客分类:
  • flex
 
阅读更多
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帮助文档coolbook

    这个文件会包含AS3.0的语法、类库、方法、事件、属性等全面信息,便于开发者查询和学习。它会按照类库结构组织内容,例如DisplayObject容器、EventDispatcher、Sound和Video等,还会详细解释ActionScript的基础概念...

    as3.0做的音乐播放器

    在这个项目中,你使用AS3.0构建了一个音乐播放器,这涉及到多媒体处理、用户界面设计以及事件处理等多个方面的知识。 首先,AS3.0在处理音乐播放时,主要使用了`Sound`类和`SoundChannel`类。`Sound`类用于加载和...

    AS3.0 算法大全

    AS3.0 算法大全是一份集合了多种Flash ActionScript 3.0中常见算法的教程资源,特别适合初学者和有一定经验的开发者学习。这个教程涵盖了许多实用的编程技巧和理论知识,旨在帮助用户提升在Flash平台上的开发能力。 ...

    as3.0简单相册源码

    在AS3.0中,可以设置一个定时器(Timer)对象,每隔一段时间触发一个事件,进而改变当前显示的图片。手动切换则是用户通过点击或拖动等交互方式来选择想要查看的图片。这通常涉及到事件监听(addEventListener)和...

    AS3.0算法大全,非常有用。

    14. **数据结构排序算法**:这部分内容介绍了各种排序算法的实现,包括但不限于冒泡排序、快速排序等,并讨论了它们在AS3.0中的应用。 15. **AS文本计算器**:通过解析文本输入并执行计算操作,实现了一个简单的...

    ActionScript 3.0 Cookbook 中文完整版

    2. 事件驱动编程:AS3.0的事件模型使得程序能响应用户交互和其他系统事件。理解事件监听器、事件对象和事件冒泡机制是编写交互式应用的关键。 3. 数据类型和变量:AS3.0支持基本数据类型(如Number、Boolean、...

    foundation Actionscript3.0 Animation.pdf

    8. **事件驱动编程**:书中也会涉及AS3.0中的事件系统,包括事件监听、事件冒泡和事件处理,这对于创建响应用户输入的互动动画至关重要。 9. **最佳实践**:书中还将分享一些AS3.0动画开发的最佳实践,帮助开发者...

    ActionScript3.0帮助文档完整版

    4. **事件模型**:AS3的事件模型是基于观察者模式的,它支持事件冒泡、事件捕获和事件目标,使得程序的交互逻辑更加简洁和高效。 5. **强大的类库**:AS3包含许多内置类,如DisplayObject容器、Sprite和MovieClip,...

    ActionScript 3.0 编程.rar

    与早期版本相比,AS3中的事件处理更加高效,事件监听器可以被添加和移除,使得程序可以根据用户交互或特定条件动态响应。事件模型包括冒泡、捕获和目标三个阶段,使事件处理更为灵活。 在AS3中,DisplayObject容器...

    FLASH CS4 AS3 各式各样的下拉菜单

    在Flash CS4中,ActionScript 3.0(AS3)是主要的编程语言,用于创建交互式的动画、游戏和应用程序。下拉菜单是网页和应用程序界面中的常见元素,它提供了一种有效的方式来组织和展示大量的选项。这篇教程将深入探讨...

    flash action script

    在AS3.0中,事件模型得到了统一,所有事件都基于事件流机制,包括捕获阶段、目标阶段和冒泡阶段。事件流允许事件从舞台的最顶层(捕获阶段)向下传播,直到达到事件源(目标阶段),然后再从底部向上冒泡回舞台顶层...

    01.对象交互与事件处理pdf

    在AS3.0中,事件处理机制使得代码结构更加清晰,可以将界面逻辑与业务逻辑分离,从而提升代码的可读性和可复用性。书中会讲解如何使用addEventListener、removeEventListener和dispatchEvent方法来添加、移除事件...

    Flex ActionScript3.0 API中文帮助文档

    2. **事件模型**:AS3的事件模型更加成熟,支持事件冒泡和事件捕获,增强了组件间的通信。 3. **面向对象**:完全支持类、接口和继承,使得代码结构更加清晰。 4. **性能提升**:AS3的执行速度显著提升,因为它运行...

    AS事件侦听案例,源码

    在ActionScript 3.0(AS3)中,事件监听是程序交互和响应用户操作的核心机制。本案例将深入探讨如何使用EventListener进行事件监听,并通过实际的代码示例来帮助初学者理解这一概念。 首先,事件是AS3中的一个重要...

    源文件_ActionScript 3.0游戏编程

    2. **事件驱动编程**:AS3中的事件处理机制是游戏响应用户输入和系统状态变化的关键。事件监听器、事件对象和事件冒泡是理解这一机制的核心。 3. **图形绘制和显示对象**:Flash舞台上的一切都是DisplayObject,...

    Actionscript3.0使用手册

    4. **事件处理**:AS3中的事件模型是其强大之处,文档会涵盖Event类、EventDispatcher接口、事件监听器注册与移除,以及不同类型的事件(如MouseEvent、KeyboardEvent)。 5. **显示列表和图形编程**:学习如何操作...

    ActionScript 3 教程

    在AS3.0中,XML处理变得更加简单和强大,可以方便地用于数据交换和存储,这对于构建数据驱动的应用程序非常有用。 接下来的五到十部分聚焦于ActionScript 3.0的事件机制。事件模型是AS3.0的一个核心组件,它允许...

    as3事件属性

    在ActionScript 3.0 (简称AS3)中,事件处理机制是程序设计的核心之一。掌握AS3中的事件属性及其应用场景对于开发高质量的交互式应用程序至关重要。本文将深入探讨AS3事件流中的两个关键属性——`target`与`...

    ActionScript 3.0的学习

    本部分将详细介绍如何在AS3中添加事件监听器、处理事件以及理解事件流的概念。 - **事件监听器**: 通过`addEventListener`方法可以为对象添加事件监听器。 - **事件处理**: 当触发特定事件时,事件处理函数会被调用...

    ActionScript 3.0 语言和组件参考

    - **事件冒泡和捕获**:事件可以在目标对象及其祖先对象之间传递,允许在不同层级上处理事件。 4. **显示列表**: - **DisplayObject容器**:如Sprite和MovieClip,用于组织和管理舞台上的可视元素。 - **坐标...

Global site tag (gtag.js) - Google Analytics