ActionScript 3.0 事件处理与早期版本事件处理的不同之处

Flash Player 9 和更高版本,Adobe AIR 1.0 和更高版本

ActionScript 3.0 中的事件处理与早期 ActionScript 版本中的事件处理之间的一个最显著的区别是:在 ActionScript 3.0 中,只有一个事件处理系统,而在早期的 ActionScript 版本中,则有几个不同的事件处理系统。本部分先概述早期 ActionScript 版本中的事件处理的工作原理,然后讨论 ActionScript 3.0 中的事件处理的变化情况。

早期 ActionScript 版本中的事件处理

ActionScript 3.0 之前的 ActionScript 版本中提供许多不同的方法来处理事件:

  • on() 事件处理函数,可以直接放在 Button 和 MovieClip 实例上

  • onClipEvent() 处理函数,可以直接放在 MovieClip 实例上

  • 回调函数属性,例如 XML.onload Camera.onActivity

  • 使用 addListener() 方法注册的事件侦听器

  • 部分实现了 DOM 事件模型的 UIEventDispatcher 类。

其中的每一种机制都有其自己的若干优点和局限性。 on() onClipEvent() 处理函数易于使用,但使随后对项目的维护变得较为困难,因为很难查找直接放在按钮和影片剪辑上的代码。回调函数也很容易实现,但对于任何指定事件,仅限于使用一个回调函数。事件侦听器较难实现:它们不但要求创建侦听器对象和函数,而且要求向生成事件的对象注册侦听器。这虽然增加了开销,但您可以创建若干侦听器对象,并针对同一个事件注册这些对象。

对 ActionScript 2.0 组件的开发形成了另一个事件模型。该新模型包含在 UIEventDispatcher 类中,并且基于 DOM 事件规范的子集。熟悉组件事件处理的开发人员将会发现过渡到新的 ActionScript 3.0 事件模型相对来说较为容易。

遗憾的是,各个事件模型使用的语法以不同的方式相互重叠,并且在其他方面各自不同。例如,在 ActionScript 2.0 中,某些属性(例如 TextField.onChanged )可用作回调函数或事件侦听器。但是,根据您是否在使用支持侦听器或六个类之一的 UIEventDispatcher 类,用于注册侦听器对象的语法有所不同。对于 Key、Mouse、MovieClipLoader、Selection、Stage 和 TextField 类;请使用 addListener() 方法,但对于组件事件处理,请使用名为 addEventListener() 的方法。

不同事件处理模型所导致的另一个复杂性是:根据所使用的机制的不同,事件处理函数的范围大不相同。也就是说,关键字 this 的含义在各个事件处理系统中并不一致。

ActionScript 3.0 中的事件处理

ActionScript 3.0 引入了单一事件处理模型,以替代以前各语言版本中存在的众多不同的事件处理机制。该新事件模型基于文档对象模型 (DOM) 第 3 级事件规范。虽然 SWF 文件格式并不专门遵循文档对象模型标准,但显示列表和 DOM 结构之间存在的相似性足以使 DOM 事件模型的实现成为可能。显示列表中的对象类似于 DOM 层次结构中的节点,在本讨论中,术语“显示列表对象”和“节点”可互换使用。

Flash Player 和 AIR 实现的 DOM 事件模型包括一个名为“默认行为”的概念。“默认行为”是 Flash Player 或 AIR 作为特定事件的正常后果而执行的操作。

默认行为

开发人员通常负责编写响应事件的代码。但在某些情况下,行为通常与某一事件关联,使得 Flash Player 或 AIR 会自动执行该行为,除非开发人员添加了取消该行为的代码。由于 Flash Player 或 AIR 会自动表现该行为,因此这类行为称为默认行为。

例如,当用户在 TextField 对象中输入文本时,普遍期待文本显示在该 TextField 对象中,因此该行为被内置到 Flash Player 和 AIR 中。如果您不希望该默认行为发生,可以使用新的事件处理系统来取消它。当用户在 TextField 对象中输入文本时,Flash Player 或 AIR 会创建 TextEvent 类的实例以表示该用户输入。若要阻止 Flash Player 或 AIR 显示 TextField 对象中的文本,必须访问该特定 TextEvent 实例并调用该实例的 preventDefault() 方法。

并非所有默认行为都可以被阻止。例如,当用户双击 TextField 对象中的单词时,Flash Player 和 AIR 会生成一个 MouseEvent 对象。无法阻止的默认行为是:加亮鼠标点击的单词。

许多类型的事件对象没有关联的默认行为。例如,当建立网络连接时,Flash Player 调度一个连接事件对象,但没有与该对象关联的默认行为。Event 类及其子类的 API 文档列出了每一类型的事件,并说明所有关联的默认行为,以及是否可以阻止该行为。

默认行为仅与由 Flash Player 或 AIR 所调度的事件对象关联,但通过 ActionScript 以编程方式调度的事件对象则不存在默认行为。了解这一点很重要。例如,可以使用 EventDispatcher 类的方法来调度类型为 textInput 的事件对象,但该事件对象没有关联的默认行为。也就是说,Flash Player 和 AIR 不会因为您以编程方式调度了 textInput 事件而在 TextField 对象中显示字符。

ActionScript 3.0 中事件侦听器的新增功能

对于使用 ActionScript 2.0 addListener() 方法的开发人员来说,了解 ActionScript 2.0 事件侦听器模型和 ActionScript 3.0 事件模型之间的差别可能会有所帮助。下表说明两个事件模型之间的几个主要差别:

  • 若要在 ActionScript 2.0 中添加事件侦听器,请在某些情况下使用 addListener() ,在其他情况下使用 addEventListener() ;而在 ActionScript 3.0 中,则始终使用 addEventListener()

  • ActionScript 2.0 中没有事件流,这意味着,只能对广播事件的对象调用 addListener() 方法;而在 ActionScript 3.0 中,可以对属于事件流一部分的任何对象调用 addEventListener() 方法。

  • 在 ActionScript 2.0 中,事件侦听器可以是函数、方法或对象,而在 ActionScript 3.0 中,只有函数或方法可以是事件侦听器。