使用外部 APIActionScript 3.0
外部 API 可实现 ActionScript 与在其中运行 Adobe Flash Player 9 的容器应用程序之间的直接通信。在某些情况下,您可能需要使用外部 API,例如:创建 SWF 文档与 HTML 页中的 JavaScript 之间的交互,或者构建台式机应用程序以使用 Flash Player 来播放 SWF 文件。本章介绍了如何使用外部 API 与容器应用程序进行交互,如何在 ActionScript 与 HTML 页中的 JavaScript 之间传递数据,以及如何在 ActionScript 和台式机应用程序之间建立通信并交换数据。注意 本章仅讨论 SWF 中的 ActionScript 与容器应用程序之间的通信,该应用程序包含对加载 SWF 的 Flash Player 实例的引用。应用程序中其它任何使用 Flash Player 的情况都不在本文档的讨论范围之内。Flash Player 用作浏览器插件或放映文件(独立应用程序)。可能还在一定程度上支持其它使用方案。
使用外部 API 的基础知识
使用外部 API 简介虽然在某些情况下可以独立运行 SWF 文件(例如,如果创建 SWF 放映文件),但在大多数情况下,SWF 应用程序作为另一个应用程序中的元素来运行。通常,包含 SWF 的容器是 HTML 文件;在少数情况下,SWF 文件用于台式机应用程序的全部或部分用户界面。当处理更高级的应用程序时,您可能会发现,需要在 SWF 文件和容器应用程序之间建立通信。例如,网页通常使用 HTML 格式来显示文本或其它信息,并包含 SWF 文件以显示动态可视内容,如图表或视频。在这种情况下,您可能需要建立此类通信,以便当用户单击网页上的按钮时,它将更改 SWF 文件中的某些内容。ActionScript 包含一种称为外部 API 的机制,它有助于在 SWF 文件中的 ActionScript 与容器应用程序中的其它代码之间建立这种类型的通信。
常见外部 API 任务
本章介绍了以下常见的外部 API 任务:
1.获取有关容器应用程序的信息
2.使用 ActionScript 调用容器应用程序中的代码,其中包括网页或台式机应用程序
3.从容器应用程序的代码中调用 ActionScript 代码
4.创建代理以简化从容器应用程序调用 ActionScript 代码的过程
重要概念和术语
以下参考列表包含将会在本章中使用的重要术语:
ActiveX 容器 (ActiveX container):容器应用程序(不是 Web 浏览器),它包含 Flash Player ActiveX 控件的实例以便在应用程序中显示 SWF 内容。
容器应用程序 (Container application):Flash Player 在其中运行 SWF 文件的应用程序,如 Web 浏览器和包含 Flash Player 内容的 HTML 页。放映文件 (Projector):已转换为独立可执行文件的 SWF 文件,其中包括 Flash Player 以及 SWF 文件的内容。可以使用 Adobe Flash CS3 Professional 或独立的 Flash Player 来创建放映文件。
放映文件通常用于以 CD-ROM 形式分发 SWF 文件,或在以下类似情况下进行 SWF 文件分发:下载文件大小不是问题,并且 SWF 作者希望确保用户能够运行 SWF 文件,而无论用户计算机上是否安装了 Flash Player。
代理 (Proxy):这是一个中间应用程序或代码,它代表一个应用程序(“调用应用程序”)调用另一个应用程序(“外部应用程序”)中的代码,并将值返回到调用应用程序。可以出于各种不同的原因来使用代理,其中包括:
通过将调用应用程序中的本机函数调用转换为外部应用程序所理解的格式,简化进行外部函数调用的过程;
解决禁止调用方直接与外部应用程序进行通信的安全或其它限制问题
序列化 (Serialize):将对象或数据值转换为某种格式,这种格式可用于通过消息在两个编程系统之间传递值,如通过 Internet 或在一台计算机上运行的两个不同应用程序之间进行传递。
完成本章中的示例
学习本章的过程中,您可能想要测试示例代码清单。本章中的许多代码清单是用于演示的较小的代码清单,而不是完整的工作示例或用于检查值的完整代码。由于使用外部 API 需要(根据定义)编写 ActionScript 代码以及容器应用程序中的代码,因此测试示例涉及创建一个容器(例如,包含 SWF 的网页)和使用代码清单与该容器交互。
要测试 ActionScript 与 JavaScript 之间的通信的示例,请执行以下操作:
1. 创建一个新的 Flash 文档并将它保存到您的计算机上。您可能想要将它保存在容器应用程序预计能够在其中找到 SWF 文件的文件夹中。
2. 从主菜单中,选择“文件”>“发布设置”。
3. 在“发布设置”对话框中,在“格式”选项卡上确认仅选中了“Flash”复选框。
4. 在“Flash”复选框旁边的“文件”字段中,单击文件夹图标以选择 SWF 文件将发布到的文件夹。通过设置 SWF 文件的位置,您可以(举例而言)将 Flash 文档放在一个文件夹中,而将发布的 SWF 文件放在另一个文件夹(例如包含容器应用程序的源代码的文件夹)中。
5. 选择时间轴的第 1 帧中的关键帧,并打开“动作”面板。
6. 将示例的 ActionScript 代码复制到“脚本”窗格中。
7. 从主菜单中,选择“文件”>“刷新”以重新发布该 SWF 文件。
8. 创建并运行您的容器应用程序,以测试 ActionScript 与容器应用程序之间的通信。
本章末尾的两个示例分别是一个使用外部 API 与 HTML 页通信的完整示例,和一个使用外部 API 与 C# 台式机应用程序通信的完整示例。这些示例包含完整代码,其中包括 ActionScript 和容器错误检查代码,您在使用外部 API 编写代码时将用到这些代码。有关使用外部 API 的另一个完整示例,请参阅《ActionScript 3.0 语言和组件参考》中 ExternalInterface 类的类示例。
外部 API 要求和优点
外部 API 是 ActionScript 中的一部分,它为 ActionScript 与作为 Flash Player 容器的外部应用程序(通常是 Web 浏览器或独立放映文件应用程序)中运行的代码之间进行通信提供了一种机制。在 ActionScript 3.0 中,外部 API 的功能是由 ExternalInterface 类提供的。在 Flash Player 8 之前的 Flash Player 版本中,使用 fscommand() 动作与容器应用程序进行通信。ExternalInterface 类替代了 fscommand(),是 JavaScript 与 ActionScript 之间的所有通信的推荐使用机制。
注意
如需使用旧的 fscommand() 函数(例如,为了与较早的应用程序保持兼容或与第三方 SWF 容器应用程序或独立的 Flash Player 进行交互),仍可将其作为 flash.system 包中的包级函数来使用。
ExternalInterface 类是一个子系统,通过它可以轻松地实现从 ActionScript 和 Flash Player 到 HTML 页中的 JavaScript 或任何包含 Flash Player 实例的台式机应用程序的通信。
ExternalInterface 类只在以下情况下可用:
• 在所有受支持的 Internet Explorer for Windows 版本(5.0 和更高版本)中
• 在容器应用程序(例如使用 Flash Player ActiveX 控件实例的台式机应用程序)中
• 在支持 NPRuntime 接口的任何浏览器中(当前包括以下浏览器:
o Firefox 1.0 及更高版本
o Mozilla 1.7.5 及更高版本
o Netscape 8.0 及更高版本
o Safari 1.3 及更高版本
在其它所有情况下(例如,在独立的播放器中运行),ExternalInterface.available 属性均返回 false。
从 ActionScript 中,可以在 HTML 页上调用 JavaScript 函数。与 fscommand() 相比,外部 API 可提供以下改进功能:
• 可以使用任何 JavaScript 函数,而不仅仅是可与 fscommand() 函数一起使用的函数。
• 可以传递任意数量的、具有任意名称的参数;而不是仅限于传递一个命令和一个字符串参数。这为外部 API 提供了比 fscommand() 大得多的灵活性。
• 可以传递各种数据类型(例如 Boolean、Number 和 String);不再仅限于 String 参数。
• 可以接收调用值,该值将立即返回到 ActionScript(作为进行的调用的返回值)。
警告
如果为 HTML 页中的 Flash Player 实例指定的名称(object 标签的 id 属性)包含连字符 (-) 或在 JavaScript 中定义为运算符的其它字符(如 +、*、/、\、. 等),则在 Internet Explorer 中查看容器网页时,将无法从 ActionScript 调用 ExternalInterface。
此外,如果定义 Flash Player 实例的 HTML 标签(object 和 embed 标签)嵌套在 HTML form 标签中,也将无法从 ActionScript 调用 ExternalInterface。