原作者:菩提树下的杨过
转载出处:http://yjmyzz.cnblogs.com 
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

as3.0中的事件冒泡机制有时候会很烦人,比如一个Sprite(方便下文描述就命名为Container吧)把另一外Sprite(称为Child吧)做为子元素套进来以后,如果两个Sprite都注册了Mouse_Down事件,要想在Child上点击鼠标时系统只响应Child的Mouse_Down事件,默认是不行的,因为事件冒泡会让Container也响应Mouse_Down事件,示例代码:

 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()方法,即:

 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事件同时添加二个监听

 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改成:

private function subChildMouseDownHandler2(e:MouseEvent):void{
e.stopImmediatePropagation();
trace("_sub_child.MOUSE_DOWN_2");
}

重复刚才的测试,输出如下:

_sub_child.MOUSE_DOWN_2

再试下stopPropagation方法

 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中如何阻止事件冒泡的更多相关文章

  1. vue中click阻止事件冒泡,防止触发另一个事件

    在使用el-upload组件时,在其中放置了一个删除按钮的图片. 当点击图片,本想只删除上传的视频,但是意外触发了el-upload中的事件 解决办法:用stop,结果只删除当前预览,不触发上传事件. ...

  2. 【转】Flash AS3.0 中的自定义事件

    原文 http://www.cnblogs.com/acpp/archive/2010/10/19/1855670.html package { import flash.events.Event; ...

  3. React阻止事件冒泡的正确打开方式

    需求:点击导航list按钮出现侧弹框,点击空白处弹框消失 问题:绑定空白处的点击事件到document上,但是非空白处的点击也会触发这个点击事件,在react中如何阻止事件冒泡? 解决方法:e.sto ...

  4. JQuery中阻止事件冒泡的两种方式及其区别

    JQuery 提供了两种方式来阻止事件冒泡. 方式一:event.stopPropagation(); $("#div1").mousedown(function(event){ ...

  5. JQuery中阻止事件冒泡方式及其区别

    JQuery 提供了两种方式来阻止事件冒泡. 方式一:event.stopPropagation();         $("#div1").mousedown(function( ...

  6. js中阻止事件冒泡和浏览器默认行为

    在使用javascript编程时会遇到一个问题,就是当你给html添加事件时,由于浏览器默认的为冒泡型事件触发机制,所以会触发你不想触发的事件.那么通过如下的函数可以解决这个问题.[兼容IE和FF] ...

  7. 在点击div中的p时,如何阻止事件冒泡?

    今天整理笔记,发现在学习javaScript的过程中,遇到过一个在当时看来很棘手的问题,现在特地总结一下,也希望能帮助到曾像我一样迷惘的初学者. 我还是以一个案例来说明问题,html代码如下: < ...

  8. React 中阻止事件冒泡的问题

    在正式开始前,先来看看 JS 中事件的触发与事件处理器的执行. JS 中事件的监听与处理 事件捕获与冒泡 DOM 事件会先后经历 捕获 与 冒泡 两个阶段.捕获即事件沿着 DOM 树由上往下传递,到达 ...

  9. vue2.0阻止事件冒泡

    <!--picker弹窗--><transition name="fade"> <div class="picker_wrap" ...

随机推荐

  1. My sql 自增 虚拟列。

    在MYSQL 是没有类似MSSQL 2008 / oracle 数据库开窗函数 over() ,rank(), DENSE_RANK() ,ROW_NUMBER() 又叫窗口函数 . 当我们需要在查询 ...

  2. 1. 报错:1130-host ... is not allowed to connect to this MySql server 开放mysql远程连接 不使用localhost

    在服务器上打开mysql命令行,依次执行下面这两句: GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRA ...

  3. django之setup()

    #django包的__init__.py包含setup函数def setup(): """ Configure the settings (this happens as ...

  4. Spring MVC 的springMVC.xml疑问解析

    <mvc:annotation-driven /> <mvc:annotation-driven /> 会自动注册DefaultAnnotationHandlerMapping ...

  5. leetcode1016

    class Solution(object): def queryString(self, S: str, N: int) -> bool: return all(S.find(bin(i)[2 ...

  6. [手把手教你] 用Swoft 搭建微服务(TCP RPC)

    序言 Swoft Framework 基于 Swoole 原生协程的新时代 PHP 全栈式协程框架 Swoft 是什么? Swoft 框架是首个基于Swoole 原生协程的新时代 PHP高性能协程全栈 ...

  7. F1026 File not found DockForm.dcu

    xe6 [dcc32 Fatal Error] ToolsAPI.pas(18): F1026 File not found: 'E:\...\DockForm.dcu' delphi,xe6,包含了 ...

  8. 自动调整linux系统时间和时区与Internet时间同步

    调整linux系统时间和时区与Internet时间同步 一.修改时区:# cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime修改为中国的东八区# v ...

  9. PLSQLDeveloper_免安装自带client

    PLSQLDeveloper_解压版 免安装并且自带有client客户端. 要安装解压附带的readme.txt进行配置. 一. 目录结构 D:\install\PLSQL |-- instantcl ...

  10. Windows 8 禁用强制驱动签名

    打开管理员模式的命令行,运行命令: bcdedit.exe -set loadoptions DDISABLE_INTEGRITY_CHECKS bcdedit/set testsigning on ...