(2012-01-08 旧博文搬运)[EssentialActionScript3.0中文版]无责任翻译-21章事件与显示层级(1)

17 篇文章 0 订阅

刚接触as3的时候,边对着字典边翻译的,知识不足所以很多地方翻得不对,由于太懒现在也不打算再改了。。

21.2. Event Dispatch Phases

当AS在显示层级上发送一个事件目标时,它将会同时通知这个目标以及它的父级显示对象。这个目标和它的父级被通知事件的过程被分为3个阶段。事件发送的第一个阶段称为capture phase,捕获阶段,这个目标的父级被通知一个事件已经发生。一旦这个目标对象的父级收到了事件的通知,就会进行下一个阶段,称为target phase,目标阶段。在目标阶段的一开始,AS会通知目标对象这个事件已经发生。某些类型的事件会在目标阶段结束后就结束掉事件发送。而另一些类型的事件则会进入第三个阶段称之为bubbling phase.冒泡阶段,目标对象的父级们会被告知目标已经成功收到了事件通知。具有冒泡阶段的事件叫做冒泡事件。不带冒泡阶段的叫做不冒泡事件。

 

NOTE

4种类型的事件:Event.ACTIVATE, Event.DEACTIVATE, Event.ENTER_FRAME, 以及 Event.RENDER, 只有目标阶段。其他所有的以object为目标的发生在显示层上的事件都有捕获阶段和目标阶段,有一些还有冒泡阶段

 

在一个事件发送时,对象们收到通知的顺序是被事件阶段管理的。在捕获阶段,父级们被按照这样的顺序被通知:由目标的显示层级的根部开始,然后继续往下经过每一个目标父级对象直到目标的直接上一级父级。然后在目标阶段,这个目标本身才收到通知。在冒泡阶段,父级们会以于捕获阶段相反的顺序收到通知,来自目标的直接父级对象,去往这个显示层级的根部。整个过程为:事件通知经过目标的父级们(捕获),传递给目标(目标阶段),然后向上返回给目标的父级们(冒泡阶段)。这个过程叫做事件流 。这个事件的通知在事件流中传递,被称作一个事件从对象到对象的传播。

 

21.3. Event Listeners and the Event Flow

(type:,listener:,useCapture:,priority:,useWeakReference:)

 

在一个以显示对象为目标的事件的发送过程中,这个显示对象的父级会在捕获阶段和冒泡阶段(如果有的话)收到事件通知。所以,当我们为目标的父级对象注册事件侦听器的时候,我们必须指明这个侦听器是在捕获阶段调用还是冒泡阶段

 

为事件对象的父级在捕获阶段注册事件侦听,我们设置addEventListener()的第三个属性useCapture 为true:

theAncestor.addEventListener(theEvent, theListener,true)

这行代码会在theAncestor 的任何子级对象发送theEvent 事件的时候调用theListener 函数,而且这时候发生事件的子级对象自身还没有收到事件通知。反之,要把侦听器设置在冒泡阶段,把第三个属性设置为false:

theAncestor.addEventListener(theEvent, theListener,false)

由于默认属性就是false,所以也可以不设:

theAncestor.addEventListener(theEvent, theListener)

 

NOTE

为了后面方便,我们使用非正式的说法父级侦听器来代表“注册在事件目标的父级显示对象上的侦听器”。用目标侦听器 来代表“直接注册在事件目标对象上的侦听器”

 

当为一个非冒泡事件注册父级侦听器的时候,我们只能注册在捕获阶段(设置useCapture 为 true);否则这个侦听器就无法被调用。当为一个冒泡事件注册父级侦听器的时候,我们可以选择是在捕获阶段还是在冒泡阶段,或者根据应用程序的需要也可以都注册。捕获阶段使得父级侦听器可以很早就行使一个事件在事件的目标侦听器收到这个通知之前。代表性地,捕获阶段的侦听器一般被用作有条件地停止一个事件在它到达目标之前。比如,有一个具有“可”、“不可”2个状态的仪表板(panel widget),它可以当它的状态是“不可”的时候,使用捕获阶段侦听器来防止它的子级对象接收鼠标事件(我们会在“Stopping an Event Dispatch.”学习如何停止一个事件)

 

相比之下,冒泡阶段使得父级侦听器可以在事件目标响应了事件之后处理这个事件。代表性地,冒泡阶段一般是在程序继续运行之前、屏幕更新之前,对目标对象状态的变化作出响应。比如,一个包含了可拖拽图标的仪表板可以使用冒泡阶段侦听器在这个图标被拖曳后进行位置的校准。

 

不像父级侦听器,直接注册在事件目标上的侦听器仅仅在目标阶段被调用。要为事件目标在目标阶段注册侦听器,我们在addEventListener()中把useCapture 设为false—就好像我们在冒泡阶段注册父级侦听器一样。

theEventTarget.addEventListener(theEvent, theListener,false)

或者也可以不设置:

theEventTarget.addEventListener(theEvent, theListener)

这时,侦听器就会在父级侦听器在捕获阶段操作过之后才调用

 

NOTE

当在目标阶段直接在事件目标上注册侦听器时, useCapture 属性应该都被设置为false 或者缺省,否则侦听器将无法被触发

 

 

21.3.1. 为捕获阶段注册一个父级侦听器

Example 21-1. A sample displayhierarchy

// 创建 Sprite

var theSprite:Sprite = newSprite();

// 创建 TextField

var theTextField:TextField =new TextField();

theTextField.text ="enter input here";

theTextField.autoSize =TextFieldAutoSize.LEFT;

theTextField.type = TextFieldType.INPUT;

// 添加 TextField 到 Sprite

theSprite.addChild(theTextField);

// 添加Sprite 到舞台实例. 注意someDisplayObject 必须是

//一个处于显示列表的对象,这样才可以访问到舞台实例someDisplayObject.stage.addChild(theSprite);

 

现在假设我们想要为在 theSprite 的TextEvent.TEXT_INPUT事件注册一个函数textInputListener(),下面是 textInputListener() 函数:

 

private functiontextInputListener (e:TextEvent):void {

trace("The user enteredsome text");

}

 

我们希望在捕获阶段(TextField收到通知之前)调用函数textInputListener(),所以我们使用下面代码来注册:

theSprite.addEventListener(TextEvent.TEXT_INPUT,textInputListener, true)

 

每次AS以theTextField 为目标发出一个TextEvent.TEXT_INPUT 事件, textInputListener() 侦听器就会在 theTextField 收到事件通知之前被调用.

 

21.3.2. 在冒泡阶段注册一个父级侦听器

theSprite.addEventListener(TextEvent.TEXT_INPUT, textInputListener, false)

 

或者直接用

theSprite.addEventListener(TextEvent.TEXT_INPUT, textInputListener)

这样,侦听器就会在目标接收到事件通知后被执行,注意,如果这个事件是一个非冒泡事件,那么这个侦听器就永远不会被执行。.必须要再提醒一次:如果一个侦听器是注册给一个非冒泡事件的,并且把useCapture 设置为了false,或者缺省,那么这个侦听器就永远不会被执行。所以一个非冒泡事件的父级侦听器的useCapture 必须设为 true.

 

要判断一个事件是不是冒泡事件,我们可以采用:

• 查阅这个事件在Adobe's ActionScript 语言参考中的说明.

• 用一个事件侦听器在事件的捕获阶段或目标阶段进行处理,检查Event 对象的bubbles 属性,如果为true, 则该事件是冒泡的,否则不冒泡.

 

下面的代码展示了这个技巧:.

// 为舞台实例的MouseEvent.CLICK事件注册一个函数clickListener(),注意

//  someDisplayObject 必须处于显示列表中以实现对舞台的访问

someDisplayObject.stage.addEventListener(MouseEvent.CLICK,clickListener);

// ...后面的代码定义clickListener()

private function clickListener(e:MouseEvent):void {

// 当事件发生,检查它是否是冒泡事件

if (e.bubbles) {

trace("TheMouseEvent.CLICK event is a bubbling event.");

} else {

trace("TheMouseEvent.CLICK event is a non-bubbling event.");

}

}

 

为了方便, Adobe's ActionScript 语言参考列出了所有内置事件的bubbles 属性。一般来说,大部分以显示对象为目标的内置事件都是冒泡的.\

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值