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

时间:2021-06-27 18:58:22

[EssentialActionScript3.0中文版]无责任翻译-21章事件与显示层级(5)

  • 空间

21.8. 事件优先级和事件流

当一个事件侦听器注册在一个处于显示层级的某个对象上,则priority属性就会影响都注册在这个

对象上的侦听器的调用顺序。priority 属性不会、也不能改变这个事件流中的对象们收到通知的顺

序。

NOTE

在一个事件流中,没法强制一个对象上的侦听器在同一事件流的另外一个对象上的侦听器之前或之

后调用。(优先级属性只能改变同一个对象上注册的不同的侦听器的调用先后顺序,不能影响事件

流流经的对象的先后顺序)

比如。假设有一个Sprite 对象包含了TextField 对象。这个Sprite 对象注册了MouseEvent.CLICK

侦听器“spriteClickListener()”, 并设置useCapture 为false , priority 为 2.

theSprite.addEventListener(MouseEvent.CLICK,spriteClickListener, false, 2)

同样地, TextField 对象还注册了一个MouseEvent.CLICK 侦听器“ textClickListener()”, 并设

置useCapture 为false ,priority为1.

theTextField.addEventListener(MouseEvent.CLICK,textClickListener, false, 1)

当用户点击TextField 对象时,FLASH在运行时发送一个MouseEvent.CLICK 事件,目标为

TextField 对象,作为回应, textClickListener() 在目标阶段被调用,之后,spriteClickListener()

在冒泡阶段被调用。这2个事件侦听器是取决于事件流的顺序调用的,即使spriteClickListener() 注

册的优先级高于textClickListener().

更多事件优先级的信息, seeChapter 12.


21.9. 显示层级的改变和事件流

就在ActionScript 派送一个给定的事件之前,它会预先确定整个事件流,使得事件的派送基于

事件目标所处的显示层级当前状态。也就是说,将收到事件通知的对象以及他们收到通知的先后顺

序是在事件开始派送之前就决定好了的。一旦事件开始派送,对象们就会按照预先定好的顺序收到

通知——即使事件侦听器在事件的派送过程中更改了目标对象所处的显示层级结构.

比如,假设我们有一个TextField 实例包含在一个Sprite 实例里面,又包含在舞台实例里面。进

一步假设我们注册了一个侦听器stageClickListener()在Stage 实例的捕获阶来侦听

MouseEvent.CLICK 事件:

stage.addEventListener(MouseEvent.CLICK,stageClickListener, true);

最后假设这个stageClickListener() 侦听器函数包含的代码会从它的Sprite父级对象中除

TextField 对象:

private function stageClickListener (e:MouseEvent):void {

// 如果TextField 对象被点击...

if (e.target == textField) {

// ...移除它

removeChild(textField);

textField = null;

}

}

当用户点击文本时, ActionScript会发送一个目标为TextField 的MouseEvent.CLICK 事件。在

发送之前,AS预先确定了整个事件流,如下:

CAPTURE PHASE: (1) Stage object

(2) Sprite object

TARGET PHASE: (3) TextField object

BUBBLING PHASE: (4) Sprite object

(5) Stage object

当事件派送开始, ActionScript首先通知Stage 对象发生了事件 (1).这个通知调用了Stage 对

象的侦听器stageClickListener(), 这个侦听器从显示列表移除TextField 对象。接下来,即使Sprite

对象已经不是TextField 对象的父级,ActionScript 依然会通知Sprite 对象 (2).。然后,虽然

TextField 对象已经不再显示列表上, ActionScript依然会通知TextField 对象(3).最后, 在冒泡

阶段, ActionScript 再次通知Sprite 对象 (4)和Stage 对象 (5)。

即使包含了事件目标的显示层级结构已经在事件派送的过程中被改变,事件仍然会按照预先定好的

事件流顺序进行传播。

NOTE

一旦一个给定事件派送的事件流被确定,则在整个事件的派送过程中它都不会改变。

Example 21-4 中,自定义类DisappearingTextField(Sprite的子类)的实例代表前面书说的

Sprite 对象。.

Example 21-4. The immutable event flow

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


收藏于 2012-01-08