flash.external
public final class ExternalInterface
继承ExternalInterface Inheritance Object

语言版本 : ActionScript 3.0
Player 版本 : Flash Player 9

ExternalInterface 类是外部 API,在 ActionScript 和 Flash Player 的容器之间实现直接通讯的应用程序编程接口,例如,含有 JavaScript 的 HTML 页。 推荐对所有 JavaScript 与 ActionScript 之间的通信使用 ExternalInterface。

在 HTML 页中使用 JavaScript,可以调用 Flash Player 中的 ActionScript 函数。 ActionScript 函数可以返回一个值,JavaScript 会立即接收它作为该调用的返回值。

此功能替代了较旧的 fscommand() 方法。

在以下浏览器和操作系统的组合中可以使用 ExternalInterface 类:

浏览器操作系统操作系统
Internet Explorer 5.0 及更高版本Windows 
Netscape 8.0 及更高版本WindowsMacintosh
Mozilla 1.7.5 及更高版本WindowsMacintosh
Firefox 1.0 及更高版本WindowsMacintosh
Safari 1.3 及更高版本 Macintosh

ExternalInterface 类要求用户的 Web 浏览器支持 ActiveX 或由某些浏览器公开的 NPRuntime API 以实现插件脚本处理。 请访问 http://www.mozilla.org/projects/plugins/npruntime.html

注意:在将 SWF 文件嵌入到 HTML 页中时,请确保 <object><embed> 标签的 idname 属性不包括诸如以下的字符: (句点)、-、+、*、/ 和 \。

利用 ActionScript,可以在 HTML 页上执行以下操作:

通过在 HTML 页上使用 JavaScript,可以:

注意:Flash Player 当前不支持嵌入到 HTML 表单中的 SWF 文件。

查看示例

另请参见

flash.system.fscommand()
外部 API 要求和优点
使用 ExternalInterface 类



公共 属性
 属性定义方
  available : Boolean
[static] [read-only] 指示此播放器是否位于提供外部接口的容器中。
ExternalInterface
 Inheritedconstructor : Object
对类对象或给定对象实例的构造函数的引用。
Object
  objectID : String
[static] [read-only] 在 Internet Explorer 中,返回 标签的 id 属性;在 Netscape 中,返回 标签的 name 属性。
ExternalInterface
 Inheritedprototype : Object
[static] 对类或函数对象的原型对象的引用。
Object
公共 方法
 方法定义方
  
addCallback(functionName:String, closure:Function):void
[static] 将 ActionScript 方法注册为可从容器调用。
ExternalInterface
  
call(functionName:String, ... arguments):*
[static] 调用由 Flash Player 容器公开的函数,不传递参数或传递多个参数。
ExternalInterface
 Inherited
指示对象是否已经定义了指定的属性。
Object
 Inherited
指示 Object 类的实例是否在指定为参数的对象的原型链中。
Object
 Inherited
指示指定的属性是否存在、是否可枚举。
Object
 Inherited
设置循环操作动态属性的可用性。
Object
 Inherited
返回指定对象的字符串表示形式。
Object
 Inherited
返回指定对象的原始值。
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 — 包含环境属于调用代码无权访问的安全沙箱。 修正此问题:
  1. 在包含 HTML 页中的 SWF 文件的 <object> 标签中,设置以下参数:

    <param name="allowScriptAccess" value="always" />

  2. 在 SWF 文件中,添加以下 ActionScript:

    flash.system.Security.allowDomain(sourceDomain)

另请参见

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 页中设置 objectembed 标签的 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> 标签来进行),可以解决此问题。

另请参见

示例 如何使用示例

以下示例演示了在 Flash Player 与 HTML 容器之间发送数据的过程。

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);
            }
        }
    }
}

为了测试前面的 ActionScript 代码,请使用以下 HTML 模板嵌入生成的 SWF 文件:
 <!-- 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