浏览 3079 次
锁定老帖子 主题:As3 Event
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-09-06  

target 属性:

 

target 属性包含对作为事件目标的对象的引用。在某些情况下,这很简单,例如当麦克风变
为活动状态时,事件对象的目标是 Microphone 对象。但是,如果目标在显示列表中,则必
须考虑显示列表层次结构。
例如,如果用户在包括重叠的显示列表对象的某一点输入一个鼠
标单击,则 Flash Player 始终会选择距离舞台层次最深的对象作为事件目标。 

对于复杂的 SWF 文件,特别是那些通常使用更小的子对象来修饰按钮的 SWF 文件,
target 属性可能并不常用,因为它通常指向按钮的子对象,而不是按钮。在这些情况下,常
见的做法是将事件侦听器添加到按钮并使用 currentTarget 属性,因为该属性指向按钮,而
target 属性可能指向按钮的子对象。

 

ActionScript 3.0 中包括它是为了在组织事件侦听器时提供更大的灵活性。调用
addEventListener() 时,可以将一个整数值作为 priority 参数传递,以设置该事件侦听
器的优先级。默认值为 0,但您可以将它设置为负整数值或正整数值。将优先执行此数字较
大的事件侦听器。对于具有相同优先级的事件侦听器,则按它们的添加顺序执行,因此将优
先执行较早添加的侦听器。

 

从概念上来说,事件流分为三部分。

第一部分称为捕获阶段,该阶段包括从舞台到目标节点的父节点范围内的所有节点。

第二部分称为目标阶段,该阶段仅包括目标节点。

第三部分称为冒泡阶段。冒泡阶段包括从目标节点的父节点返回到舞台的行程中遇到的节点。

 

Example:

定义一个Event类型Class:

ActionScript 3语言:
package
{
  import flash.events.Event;

  /**
   * When user want to user Event , then create a class extends
   * flash.events.Event
   */
  public class UserEvent extends Event
  {
    public static const EVENT_TEST:String="EventTest";

    private var _message:String;
    /**
     * @param type              定义该Event的Type值,外部addListener通过该值确定是否监听该Event
     * @param bubbles        此Event是否参与冒泡阶段
     *  bubbles 属性
     *  如果事件对象参与事件流的冒泡阶段,则将该事件称为 “冒泡” ,这指的是从目标节点将事
     *  件对象往回传递,经过目标节点的父节点,直到到达舞台。Event.bubbles 属性存储一个布
     *  尔值,用于指示事件对象是否参与冒泡阶段。由于冒泡的所有事件还参与捕获和目标阶段,
     *  因此这些事件参与事件流的所有三个阶段。如果值为 true,则事件对象参与所有三个阶段。
     *  如果值为 false,则事件对象不参与冒泡阶段。
     *
     * @param cancelable
     *
     */
    public function UserEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false)
    {
      super(type, bubbles, cancelable);
    }

    public function get message():String{ return _message; }
    public function set message(v:String):void{ _message=v; }
  }
}

 

 

定义EventReceive:

 

ActionScript 3语言:
package
{
  import flash.display.Sprite;

  public class EventReceiver extends Sprite
  {
    private var receiverName:String;
    public function EventReceiver(_name:String)
    {
      super();
      this.receiverName = _name;
      this.addEventListener(UserEvent.EVENT_TEST , onEvent);
    }

    public function sendEvent():void{
      var userEvent:UserEvent = new UserEvent(UserEvent.EVENT_TEST ,true); //①
      userEvent.message = "(**&&**)";
      this.dispatchEvent( userEvent );
    }

    private function onEvent(e:UserEvent):void{
      trace(receiverName + " receive message :"+ e.message );
    }
  }
}

Main:

ActionScript 3语言:
package
{
  import flash.display.Sprite;

  public class TestEvent extends Sprite
  {
    public function TestEvent()
    {
       var node1:EventReceiver = new EventReceiver("Node1");
       var node11:EventReceiver = new EventReceiver("Node11");
       var node12:EventReceiver = new EventReceiver("Node12");
       var node121:EventReceiver = new EventReceiver("Node121");
       var node13:EventReceiver = new EventReceiver("Node13");
       var node2:EventReceiver = new EventReceiver("Node12");

       this.addChild(node1);
       this.addChild(node2);

       node1.addChild(node11);
       node1.addChild(node12);
       node1.addChild(node13);
       node12.addChild(node121);
       node12.sendEvent();
    }
  }
}

整体树结构

Stage---Node1

               --------------Node11

               --------------Node12  //发送事件(事件产生)

                         -------------------Node121

        ---Node2

运行结果

Node12 receive message :(**&&**)
Node1 receive message :(**&&**)

 

结果分析:

1· 由于事件不是由舞台操作(点击鼠标,键盘操作等)导致的事件触发 所以事件的捕获阶段并不存在

   捕获节点应为从舞台到事件发生点的阶段,若存在应为Stage--->Node1----->Nodel12

2· 第一行Node12 receive message :(**&&**) Trace出来消息属于事件流第二部分 这部分仅包括事件目标阶段

3· 第二行Node1 receive message :(**&&**) Trace消息之所以存在是因为 在①中 设置bubbles属性为True及Event参与冒泡阶段,所以Node1可以接收到Node12冒泡到Stage回来的消息

 

 

 

 

论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics