| 包 | flash.external |
| 类 | public final class ExternalInterface |
| 继承 | ExternalInterface Object |
| 语言版本 : | ActionScript 3.0 |
| Player 版本 : | Flash Player 9 |
在 HTML 页中使用 JavaScript,可以调用 Flash Player 中的 ActionScript 函数。 ActionScript 函数可以返回一个值,JavaScript 会立即接收它作为该调用的返回值。
此功能替代了较旧的 fscommand() 方法。
在以下浏览器和操作系统的组合中可以使用 ExternalInterface 类:
| 浏览器 | 操作系统 | 操作系统 |
|---|---|---|
| Internet Explorer 5.0 及更高版本 | Windows | |
| Netscape 8.0 及更高版本 | Windows | Macintosh |
| Mozilla 1.7.5 及更高版本 | Windows | Macintosh |
| Firefox 1.0 及更高版本 | Windows | Macintosh |
| Safari 1.3 及更高版本 | Macintosh |
ExternalInterface 类要求用户的 Web 浏览器支持 ActiveX 或由某些浏览器公开的 NPRuntime API 以实现插件脚本处理。 请访问 http://www.mozilla.org/projects/plugins/npruntime.html。
注意:在将 SWF 文件嵌入到 HTML 页中时,请确保 <object> 和 <embed> 标签的 id 和 name 属性不包括诸如以下的字符: (句点)、-、+、*、/ 和 \。
利用 ActionScript,可以在 HTML 页上执行以下操作:
通过在 HTML 页上使用 JavaScript,可以:
注意:Flash Player 当前不支持嵌入到 HTML 表单中的 SWF 文件。
另请参见
| 属性 | 定义方 | ||
|---|---|---|---|
| available : Boolean
[static] [read-only]
指示此播放器是否位于提供外部接口的容器中。
| ExternalInterface | ||
![]() | constructor : Object
对类对象或给定对象实例的构造函数的引用。
| Object | |
| objectID : String
[static] [read-only]
在 Internet Explorer 中,返回
| ExternalInterface | ||
![]() | prototype : Object
[static]
对类或函数对象的原型对象的引用。
| Object | |
| 方法 | 定义方 | ||
|---|---|---|---|
|
[static]
将 ActionScript 方法注册为可从容器调用。
| ExternalInterface | ||
|
[static]
调用由 Flash Player 容器公开的函数,不传递参数或传递多个参数。
| ExternalInterface | ||
![]() |
指示对象是否已经定义了指定的属性。
| Object | |
![]() |
指示 Object 类的实例是否在指定为参数的对象的原型链中。
| Object | |
![]() |
指示指定的属性是否存在、是否可枚举。
| Object | |
![]() |
设置循环操作动态属性的可用性。
| Object | |
![]() |
返回指定对象的字符串表示形式。
| Object | |
![]() |
返回指定对象的原始值。
| Object | |
| available | 属性 |
available:Boolean [read-only]
| 语言版本 : | ActionScript 3.0 |
| Player 版本 : | Flash Player 9 |
指示此播放器是否位于提供外部接口的容器中。 如果外部接口可用,则此属性为 true;否则,为 false。
注意:将 External API 与 HTML 一起使用时,应始终在尝试调用任何 JavaScript 方法之前先检查 HTML 是否已完全加载。
public static function get available():Boolean
另请参见
available 属性来确定播放器是否位于提供外部接口的容器中。
package {
import flash.text.TextField;
import flash.display.MovieClip;
import flash.external.ExternalInterface;
public class extint_test extends MovieClip {
public function extint_test() {
var isAvailable:Boolean = ExternalInterface.available;
var availTxt:TextField = new TextField();
availTxt.text = isAvailable.toString();
addChild(availTxt);
}
}
}
| objectID | 属性 |
objectID:String [read-only]
| 语言版本 : | ActionScript 3.0 |
| Player 版本 : | Flash Player 9 |
在 Internet Explorer 中,返回 <object> 标签的 id 属性;在 Netscape 中,返回 <embed> 标签的 name 属性。
public static function get objectID():String
另请参见
| addCallback | () | 方法 |
public static function addCallback(functionName:String, closure:Function):void
| 语言版本 : | ActionScript 3.0 |
| Player 版本 : | Flash Player 9 |
将 ActionScript 方法注册为可从容器调用。 成功调用 addCallBack() 后,容器中的 JavaScript 或 ActiveX 代码可以调用在 Flash Player 中注册的函数。
安全提示:对于运行在浏览器中的 local 内容,只有当 SWF 文件以及包含网页位于 local-trusted 安全沙箱中时,对 ExternalInterface.addCallback() 方法的调用才有效。 有关详细信息,请参阅以下部分:
参数
functionName:String — 容器可用于调用函数的名称。
|
|
closure:Function — 要调用的 closure 函数。 这可能是一个独立的函数,或者可能是引用对象实例方法的 closure 方法。 通过传递 closure 方法,回调实际上可以定向到特定对象实例的方法。
|
Error — 如果容器不支持传入调用,将引发错误。 只有 Windows 的 Internet Explorer 和使用 NPRuntime API 的浏览器(如 Mozilla 1.7.5 及其更高版本,或 Firefox 1.0 及其更高版本)才支持。
|
|
SecurityError — 您无权访问的沙箱中的 ActionScript 已经添加了具有指定名称的回调;您不能覆盖该回调。 通过使原来调用 addCallback() 方法的 ActionScript 也调用 Security.allowDomain() 方法,可以解决该问题。
|
|
SecurityError — 包含环境属于调用代码无权访问的安全沙箱。 修正此问题:
|
另请参见
| call | () | 方法 |
public static function call(functionName:String, ... arguments):*
| 语言版本 : | ActionScript 3.0 |
| Player 版本 : | Flash Player 9 |
调用由 Flash Player 容器公开的函数,不传递参数或传递多个参数。 如果所需的函数不可用,则调用返回 null;否则,将返回由该函数提供的值。 不允许使用递归;递归调用会生成 null 响应。
如果容器是 HTML 页,则此方法在 <script> 元素中调用 JavaScript 函数。
如果该容器是其它某个 ActiveX 容器,则此方法会使用指定的名称触发 FlashCall ActiveX 事件,并且该容器会处理该事件。
如果该容器承载 Netscape 插件,您可以写入对新 NPRuntime 接口的自定义支持或嵌入 HTML 控件以及在 HTML 控件内嵌入 Flash Player。 如果嵌入 HTML 控件,就可以通过与本机容器应用程序通迅的 JavaScript 接口与 Flash Player 进行通讯。
安全提示:对于运行在浏览器中的 local 内容,只有当 SWF 文件以及包含网页(如果有)位于 local-trusted 安全沙箱中时,才允许调用 ExternalInterface.call() 方法。 还可以在包含 SWF 内容的 HTML 页中设置 object 和 embed 标签的 allowNetworking 参数,防止 SWF 文件使用此方法。 有关详细信息,请参阅以下部分:
参数
functionName:String — 要在容器中调用的函数的名称。
|
|
... arguments — 传递到容器中的函数的参数。 您可以指定零个或多个参数,参数之间用逗号分隔。 这些参数可以是任何 ActionScript 数据类型。 当调用 JavaScript 函数时,ActionScript 类型自动封装到 JavaScript 类型中;当调用其它某个 ActiveX 容器时,将在请求消息中对参数进行编码。
|
* — 从容器接收的响应。 如果调用失败(例如,当容器中没有这种函数时、接口不可用时、发生递归时,或出现安全问题时),则返回 null 并引发错误。
|
Error — 如果容器不支持传出调用,将引发错误。 只有 Windows 的 Internet Explorer 和使用 NPRuntime API 的浏览器(如 Mozilla 1.7.5 及其更高版本,或 Firefox 1.0 及其更高版本)才支持。
|
|
SecurityError — 包含环境属于调用代码无权访问的安全沙箱。 通过给包含环境中的 allowScriptAccess 设置一个合适的值(通常通过使用 HTML 中的 allowScriptAccess <object> / <embed> 标签来进行),可以解决此问题。
|
另请参见
package {
import flash.display.Sprite;
import flash.events.*;
import flash.external.ExternalInterface;
import flash.text.TextField;
import flash.utils.Timer;
import flash.text.TextFieldType;
import flash.text.TextFieldAutoSize;
public class ExternalInterfaceExample extends Sprite {
private var input:TextField;
private var output:TextField;
private var sendBtn:Sprite;
public function ExternalInterfaceExample() {
input = new TextField();
input.type = TextFieldType.INPUT;
input.background = true;
input.border = true;
input.width = 350;
input.height = 18;
addChild(input);
sendBtn = new Sprite();
sendBtn.mouseEnabled = true;
sendBtn.x = input.width + 10;
sendBtn.graphics.beginFill(0xCCCCCC);
sendBtn.graphics.drawRoundRect(0, 0, 80, 18, 10, 10);
sendBtn.graphics.endFill();
sendBtn.addEventListener(MouseEvent.CLICK, clickHandler);
addChild(sendBtn);
output = new TextField();
output.y = 25;
output.width = 450;
output.height = 325;
output.multiline = true;
output.wordWrap = true;
output.border = true;
output.text = "Initializing...\n";
addChild(output);
if (ExternalInterface.available) {
try {
output.appendText("Adding callback...\n");
ExternalInterface.addCallback("sendToActionScript", receivedFromJavaScript);
if (checkJavaScriptReady()) {
output.appendText("JavaScript is ready.\n");
} else {
output.appendText("JavaScript is not ready, creating timer.\n");
var readyTimer:Timer = new Timer(100, 0);
readyTimer.addEventListener(TimerEvent.TIMER, timerHandler);
readyTimer.start();
}
} catch (error:SecurityError) {
output.appendText("A SecurityError occurred: " + error.message + "\n");
} catch (error:Error) {
output.appendText("An Error occurred: " + error.message + "\n");
}
} else {
output.appendText("External interface is not available for this container.");
}
}
private function receivedFromJavaScript(value:String):void {
output.appendText("JavaScript says: " + value + "\n");
}
private function checkJavaScriptReady():Boolean {
var isReady:Boolean = ExternalInterface.call("isReady");
return isReady;
}
private function timerHandler(event:TimerEvent):void {
output.appendText("Checking JavaScript status...\n");
var isReady:Boolean = checkJavaScriptReady();
if (isReady) {
output.appendText("JavaScript is ready.\n");
Timer(event.target).stop();
}
}
private function clickHandler(event:MouseEvent):void {
if (ExternalInterface.available) {
ExternalInterface.call("sendToJavaScript", input.text);
}
}
}
}
<!-- saved from url=(0014)about:internet -->
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>ExternalInterfaceExample</title>
<script language="JavaScript">
var jsReady = false;
function isReady() {
return jsReady;
}
function pageInit() {
jsReady = true;
document.forms["form1"].output.value += "\n" + "JavaScript is ready.\n";
}
function thisMovie(movieName) {
if (navigator.appName.indexOf("Microsoft") != -1) {
return window[movieName];
} else {
return document[movieName];
}
}
function sendToActionScript(value) {
thisMovie("ExternalInterfaceExample").sendToActionScript(value);
}
function sendToJavaScript(value) {
document.forms["form1"].output.value += "ActionScript says: " + value + "\n";
}
</script>
</head>
<body onload="pageInit();">
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
id="ExternalInterfaceExample" width="500" height="375"
codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab">
<param name="movie" value="ExternalInterfaceExample.swf" />
<param name="quality" value="high" />
<param name="bgcolor" value="#869ca7" />
<param name="allowScriptAccess" value="sameDomain" />
<embed src="ExternalInterfaceExample.swf" quality="high" bgcolor="#869ca7"
width="500" height="375" name="ExternalInterfaceExample" align="middle"
play="true" loop="false" quality="high" allowScriptAccess="sameDomain"
type="application/x-shockwave-flash"
pluginspage="http://www.macromedia.com/go/getflashplayer">
</embed>
</object>
<form name="form1" onsubmit="return false;">
<input type="text" name="input" value="" />
<input type="button" value="Send" onclick="sendToActionScript(this.form.input.value);" /><br />
<textarea cols="60" rows="20" name="output" readonly="true">Initializing...</textarea>
</form>
</body>
</html>
当前页: http://livedocs.adobe.com/flash/9.0_cn/ActionScriptLangRefV3/flash/external/ExternalInterface.html