zoukankan      html  css  js  c++  java
  • Aa3.0 事件机制

    说明:本文由多处网络文章整理而成,在此未一一注明原文链接,敬请谅解!

    AS3:事件流机制

     事件流
    1. 只要发生事件,Flash Player就会调度该事件对象。
    2. 如果事件目标不在显示列表中,则Flash Player将事件对象直接调度到事件目标。
    3. 如果事件目标在显示列表中,则Flash Player将事件对象调度到显示列表,然后该事件对象将在显示列表中进行一次从舞台到“目标节点”的往返行程。
    4. 事件流说明事件对象如何在显示列表中穿行,分为三部分:
      • 第一部分称为捕获阶段,该阶段包括从舞台到目标节点的父节点范围内的所有节点。
      • 第二部分称为目标阶段,该阶段仅包括目标节点。
      • 第三部分称为冒泡阶段,冒泡阶段包括从目标节点的父节点返回到舞台的行程中遇到的节点。

    事件流示意图

    AS3中的事件流机制 - 炎舞残月 - unable to able

    其他

    并所有事件对象都参与事件流的所有三个阶段。某些类型的事件(例如enterFrame和init类型的事件)会直接调度到目标节点,并不参与捕获阶段和冒泡阶段。其它事件可能以不在显示列表中的对象为目标,例如调度到Socket类的实例的事件。这些事件对象也将直接流至目标对象,而不参与捕获和冒泡阶段。

    扩展理解

     在事件流中的每一层显示对象都能够采用addEventListener()方法监听该事件对象,但是考虑到addEventListener()方法的一个参数useCapture:Boolean(default = false),在默认情况下监听器只工作在目标阶段和冒泡阶段,而忽略捕获阶段。

    其它述明:

    1、事件机制的核心

    核心主要有两个类:EventDispatcher(事件的派发和接收者),Event(事件类)

    EventDispatcher是事件的源头和终点,而Event则充当着整个事件流中的引线。

    2、事件机制的3个阶段

    Event有一个属性:eventPhase,可以为以下3个值:

    • 捕获阶段 (EventPhase.CAPTURING_PHASE)。
    • 目标阶段 (EventPhase.AT_TARGET)。
    • 冒泡阶段 (EventPhase.BUBBLING_PHASE)。

    注意:事件中的捕获阶段以及冒泡阶段只会在可视对象的事件流中发生,也就是说事件的派发者是DisplayObject才会发生捕获阶段以及冒泡阶段!!!

    实例:

    如下图所示(A、B、C都是Sprite)

    注意:MouseEvent.CLICK默认是会冒泡的!!!

    先有如下代码:

    A.addEventListener(MouseEvent.CLICK, clickA);
    A.addEventListener(MouseEvent.CLICK, clickA_capture, ture);//捕获
    B.addEventListener(MouseEvent.CLICK, clickB);
    B.addEventListener(MouseEvent.CLICK, clickB_capture, ture);//捕获
    C.addEventListener(MouseEvent.CLICK, clickC);
    C.addEventListener(MouseEvent.CLICK, clickC_capture, ture);//捕获
     
    function clickA(e:MouseEvent):void
    {
          trace("clickA");
    }
     
    function clickA_capture(e:MouseEvent):void
    {
          trace("clickA_capture");
    }
     
    function clickB(e:MouseEvent):void
    {
          trace("clickB");
    }
     
    function clickB_capture(e:MouseEvent):void
    {
          trace("clickB_capture");
    }
     
    function clickC(e:MouseEvent):void
    {
          trace("clickC");
    }
     
    function clickC_capture(e:MouseEvent):void
    {
          trace("clickC_capture");
    }

    (1)、第一种情况:点击A

    输出为:

    clickA_capture

    clickA

    (2)、第二种情况:点击B

    输出为:

    clickA_capture

    clickB_capture

    clickB

    clickA

    (3)、第三种情况:点击C

    输出为:

    clickA_capture

    clickB_capture

    clickC_capture

    clickC

    clickB

    clickA

    结论:由以上实验,再结合官方的说明可以知道:

    *捕获是第一个阶段,当一个事件发生后,首先进入捕获阶段,从事件派发者的父亲一直找到stage,将所有一遍历的结点保存,然后从stage开始查找是否有捕获方法,一直到事件派发者为止,这时候捕获阶段结束。

    *目标阶段是第二个阶段,目标阶段从名称上就可以知道就是事件的派发者这个阶段,会依次查找捕获方法和非捕获方法,然后结束目标阶段。

    *冒泡阶段是最后一个阶段,从事件派发者开始一路向parent找是否有监听方法,依次调用,一直到stage。

    4、关于target和currentTarget

    首先,target永远是事件的派发者,而currentTarget则会根据当前不同的阶段有所改变,也就是说谁监听事件,当执行这个事件方法的时候谁就是currentTarget。

    5、冒泡的应用

    举个例子,当一个可视对象容器包含了100个按钮的时候,如果对每一个按钮都去监听其实很不划算。

    更好的做法是对这个容器监听,然后在监听方法中判断target是哪个对象。

  • 相关阅读:
    (转)eclipse使用技巧
    smartupload 上传文件时 把页面编码改成gbk 解决乱码
    引入外部js如何通知页面其编码格式
    OGNL表达式中的#、%和$
    javaweb提示框问题
    理解iOS 8中的Self Sizing Cells和Dynamic Type
    淘宝内部的兼容大屏幕iPhone设计流程
    ReactiveCocoa & MVVM 学习总结一
    ReactiveCocoa & MVVM 学习总结二
    Objective-C GCC Code Block Evaluation C Extension ({…})语法
  • 原文地址:https://www.cnblogs.com/-yan/p/5158029.html
Copyright © 2011-2022 走看看