zoukankan      html  css  js  c++  java
  • as3.0中如何阻止事件冒泡

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

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

     1 package
     2 {
     3     import flash.display.*;
     4     import flash.events.MouseEvent;
     5      
     6     public class EventTest extends Sprite
     7     {
     8         public function EventTest()
     9         {
    10             var _container:Sprite = createRectangle();
    11             var _child:Sprite = createRectangle(50,50,0x00ff00);
    12             var _sub_child:Sprite = createRectangle(25,25,0x0000ff);    
    13          
    14             _child.addChild(_sub_child);
    15             _container.addChild(_child);            
    16             addChild(_container);
    17              
    18             _container.y = _container.x = 50;
    19             _child.x = _container.width/2-_child.width/2;
    20             _child.y = _container.height/2-_child.height/2;     
    21             _sub_child.x = _child.width/2-_sub_child.width/2;
    22             _sub_child.y = _child.height/2-_sub_child.height/2;     
    23              
    24             _container.addEventListener(MouseEvent.MOUSE_DOWN,containerMouseDownHandler);           
    25             _child.addEventListener(MouseEvent.MOUSE_DOWN,childMouseDownHandler);           
    26             _sub_child.addEventListener(MouseEvent.MOUSE_DOWN,subChildMouseDownHandler);
    27              
    28         }
    29          
    30          
    31         private function subChildMouseDownHandler(e:MouseEvent):void{           
    32             trace("_sub_child.MOUSE_DOWN");
    33         }
    34          
    35         private function subChildMouseDownHandler2(e:MouseEvent):void{          
    36             trace("_sub_child.MOUSE_DOWN_2");
    37         }
    38          
    39         private function childMouseDownHandler(e:MouseEvent):void{
    40             trace("_child.MOUSE_DOWN");         
    41         }
    42          
    43  
    44          
    45         private function containerMouseDownHandler(e:MouseEvent):void{
    46             trace("_container.MOUSE_DOWN");
    47         }   
    48  
    49          
    50         private function createRectangle(uint=100,height:uint=100,color:uint=0xff0000):Sprite{
    51             var s:Sprite = new Sprite();
    52             s.graphics.beginFill(color,1);
    53             s.graphics.drawRect(0,0,width,height);
    54             s.graphics.endFill();
    55             return s;
    56         }
    57     }
    58 }
    View Code

    鼠标点击最小的矩形后,输出如下:

    _sub_child.MOUSE_DOWN
    _child.MOUSE_DOWN
    _container.MOUSE_DOWN

    相当于点一个,触发了三个,要想阻止事件冒泡,可以调用e.stopImmediatePropagation()或stopPropagation()方法,即:

    1 private function subChildMouseDownHandler(e:MouseEvent):void{
    2     e.stopImmediatePropagation(); 
    3     //
    4     //e.stopPropagation();
    5     trace("_sub_child.MOUSE_DOWN");
    6 }
    View Code

    这样在_sub_Child上点击时,另外二个Sprite就不会响应Mouse_Down事件,但是stopImmediatePropagation方法与stopPropagation有什么区别呢?Adobe总不至于傻到弄二个功能一样的东东吧

    官方的解释:

    stopImmediatePropagation():void
    防止对事件流中当前节点中和所有后续节点中的事件侦听器进行处理。 

    stopPropagation():void
    防止对事件流中当前节点的后续节点中的所有事件侦听器进行处理。

    有点绕口, 还是直接来看代码吧,把上面的示例改造一下,让_sub_Child的Mouse_Down事件同时添加二个监听

     1 package
     2 {
     3     import flash.display.*;
     4     import flash.events.MouseEvent;
     5      
     6     public class EventTest extends Sprite
     7     {
     8         public function EventTest()
     9         {
    10             var _container:Sprite = createRectangle();
    11             var _child:Sprite = createRectangle(50,50,0x00ff00);
    12             var _sub_child:Sprite = createRectangle(25,25,0x0000ff);    
    13              
    14             _child.addChild(_sub_child);
    15             _container.addChild(_child);            
    16             addChild(_container);
    17              
    18             _container.y = _container.x = 50;
    19             _child.x = _container.width/2-_child.width/2;
    20             _child.y = _container.height/2-_child.height/2;     
    21             _sub_child.x = _child.width/2-_sub_child.width/2;
    22             _sub_child.y = _child.height/2-_sub_child.height/2;     
    23              
    24             _container.addEventListener(MouseEvent.MOUSE_DOWN,containerMouseDownHandler);           
    25             _child.addEventListener(MouseEvent.MOUSE_DOWN,childMouseDownHandler);
    26             //注意:这里同时添加了二个监听,并设置了优点级(subChildMouseDownHandler2的优先级高于subChildMouseDownHandler1)
    27             _sub_child.addEventListener(MouseEvent.MOUSE_DOWN,subChildMouseDownHandler1,false,1);
    28             _sub_child.addEventListener(MouseEvent.MOUSE_DOWN,subChildMouseDownHandler2,false,2);
    29         }
    30          
    31          
    32         private function subChildMouseDownHandler1(e:MouseEvent):void{          
    33             trace("_sub_child.MOUSE_DOWN_1");
    34         }
    35          
    36         private function subChildMouseDownHandler2(e:MouseEvent):void{          
    37             trace("_sub_child.MOUSE_DOWN_2");
    38         }
    39          
    40         private function childMouseDownHandler(e:MouseEvent):void{
    41             trace("_child.MOUSE_DOWN");         
    42         }
    43          
    44          
    45          
    46         private function containerMouseDownHandler(e:MouseEvent):void{
    47             trace("_container.MOUSE_DOWN");
    48         }   
    49          
    50          
    51         private function createRectangle(uint=100,height:uint=100,color:uint=0xff0000):Sprite{
    52             var s:Sprite = new Sprite();
    53             s.graphics.beginFill(color,1);
    54             s.graphics.drawRect(0,0,width,height);
    55             s.graphics.endFill();
    56             return s;
    57         }
    58     }
    59 }
    View Code

    重复刚才的测试,在最小的矩形_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");
    }
    View Code

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

    _sub_child.MOUSE_DOWN_2

    再试下stopPropagation方法

    1 private function subChildMouseDownHandler2(e:MouseEvent):void{
    2     e.stopPropagation();
    3     trace("_sub_child.MOUSE_DOWN_2");
    4 }
    View Code

    这回输出不同了:

    _sub_child.MOUSE_DOWN_2
    _sub_child.MOUSE_DOWN_1

    小结:如果某对象的一个事件同时添加多个监听,stopPropagation将把该事件注册的所有监听处理函数执行完后,再阻止该事件继续向上冒泡;而stopImmediatePropagation方法将本次处理函数执行完后就立即阻止事件继续向上冒泡(即同一事件的其它监听函数将不会执行)。

    作者:菩提树下的杨过
    出处:http://yjmyzz.cnblogs.com 
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
     
  • 相关阅读:
    [VBS]遍历XML文档
    [VBS]带参数删除扩展名不是*.h、*.c、*.cpp的全部文件
    [VBS]脚本中的字典、动态数组、队列和堆栈
    [VBS]检测计算机各硬件信息
    [cmd]如何设置 Windows 默认命令行窗口大小和缓冲区大小
    VB.NET and C# 差异
    host-only局域网络
    高并发、死锁、幂等性问题
    elasticsearch简单实现
    记一次504 Gateway Time-out
  • 原文地址:https://www.cnblogs.com/buerjiongjiong/p/4721286.html
Copyright © 2011-2022 走看看