`

Flash与Javascript交互时可用ExternalInterface类

阅读更多

Flash与Javascript交互时可用ExternalInterface类

 

ExternalInterface 类是外部 API,这是一个在 ActionScript 和 Flash Player 容器之间实现直接通信的应用程序编程接口,例如,包含 JavaScript 的 HTML 页。Adobe 建议使用 ExternalInterface 实现 JavaScript 与 ActionScript 之间的所有通信。

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

 

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

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

适用于 Linux 的 Flash Player 9.0.31.0 及更高版本在以下浏览器中支持 ExternalInterface 类:

浏览器
Mozilla 1.7.x 及更高版本
Firefox 1.5.0.7 及更高版本
SeaMonkey 1.0.5 及更高版本

ExternalInterface 类要求用户的 Web 浏览器支持 ActiveX® 或由某些浏览器公开的 NPRuntime API 以实现插件脚本处理。即使上面未列出浏览器和操作系统组合,如果它们支持 NPRuntime API,则它们也应该支持 ExternalInterface 类。请访问 http://www.mozilla.org/projects/plugins/npruntime.html

注意:在将 SWF 文件嵌入到 HTML 页中时,请确保 objectembed 标签的 idname 属性不包含以下字符:

 . - + * / \
 

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

  • 调用任何 JavaScript 函数。
  • 传递任意数量、具有任意名称的参数。
  • 传递各种数据类型(Boolean、Number、String 等等)。
  • 接收来自 JavaScript 函数的返回值。

 

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

  • 调用 ActionScript 函数。
  • 使用标准的函数调用表示法传递参数。
  • 将值返回给 JavaScript 函数。

 

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

注意:Adobe AIR 当前不支持 ExternalInterface 类。

 

 

以下示例演示了在 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>
 

 

分享到:
评论

相关推荐

    flex与js交互 关于ExternalInterface使用的小例子

    标题“flex与js交互 关于ExternalInterface使用的小例子”指出了本文将探讨如何使用Flex的ExternalInterface类与JavaScript进行通信。ExternalInterface是Flex提供的一个API,允许ActionScript(Flex的主要编程语言...

    Flex与JavaScript交互实例

    Flex与JavaScript交互是一种常见的技术,它允许在Adobe Flex(基于ActionScript 3的富互联网应用程序框架)和网页中的JavaScript之间进行通信。这种交互性对于构建混合型应用,特别是在需要利用浏览器内核特性的Web...

    flash与c#程序的双向交互

    1. **启用ExternalInterface**:在Flash中,首先需要确保ExternalInterface被启用,这意味着在ActionScript代码中需要导入flash.external.ExternalInterface库,并检查其是否可用。 2. **定义可调用的函数**:在...

    JavaScript与ActionScript3交互问题总结

    JavaScript与ActionScript3之间的交互主要基于两种技术:Flash Player的ExternalInterface API和浏览器的跨文档消息传递(Cross-document messaging,CDM)。ExternalInterface API允许AS3代码暴露方法给JavaScript...

    Flex3与javascript相互交互验证

    在Flex3中,实现Flex与JavaScript的交互主要依靠`ExternalInterface`类。`ExternalInterface`提供了在ActionScript和JavaScript之间建立通信桥梁的方法。首先,你需要确保浏览器支持`ExternalInterface`,如现代的...

    ExternalInterface

    `ExternalInterface`是ActionScript中一个极其重要的类,它作为一座桥梁,连接了Flash Player内部的世界与外部的Web环境,特别是与网页中的JavaScript交互的能力。这一功能在Flash作为网页多媒体内容制作标准的时代...

    一个实现ActionScript 与JavaScript 进行相互通信的程序例子

    当需要在Flash内容与网页之间进行数据交换时,就需要实现ActionScript与JavaScript之间的通信。本程序例子旨在展示这种跨平台通信的实现方法。 ActionScript,基于ECMAScript,是Adobe Flash Player和Adobe AIR中的...

    [转]FLASH与JS序列简单应用

    1. **ExternalInterface**:Flash Player提供了ExternalInterface类,允许Flash内容与JavaScript进行通信。JavaScript可以调用Flash对象内的公开方法,反之亦然。这是一种常见的Flash与JS交互方式。 2. **...

    JS不断给FLASH传值

    注意,由于浏览器安全策略的限制,这种方法可能在某些情况下无法工作,例如在沙箱模式下或者用户禁用了Flash Player的JavaScript交互。在实际项目中,应确保测试在各种浏览器和环境下的兼容性。

    Flash与C#通信

    ActionScript 3提供了ExternalInterface API,使得Flash可以与JavaScript或其他宿主环境(如C#)进行双向通信。 2. **ExternalInterface API** ExternalInterface API是Flash Player提供的接口,允许ActionScript...

    Javascript与flash交互通信基础教程

    比如,你可以在Flash中创建一个事件监听器,当特定事件发生时,调用`ExternalInterface.call`来执行JavaScript函数。这种方法在不支持`fscommand`的旧版浏览器中可能不可用,但现代浏览器通常都支持。 最后,我们...

    c#与flash通讯

    首先,我们要理解`ExternalInterface`是Flash Player提供的一种机制,允许AS3(ActionScript 3)代码调用JavaScript函数,从而与宿主环境(如浏览器)进行通信。在桌面应用中,如使用C#的Windows Forms或WPF,可以...

    js与as通信,js调用flash的方法

    ExternalInterface的引入解决了早期版本Flash与JavaScript交互的限制,如Netscape Plugin API (NPAPI) 或ActiveX。 1. **ExternalInterface的添加和初始化**: 在AS3代码中,首先需要确保ExternalInterface可用,...

    FLASH 读取html 标签

    通过ActionScript的ExternalInterface类,我们可以调用JavaScript函数,并获取JavaScript返回的数据。例如,如果HTML页面中有这样一个JavaScript函数: ```javascript function getHTMLTagContent(tagName) { ...

    一款人形动作显示的flash时间.zip

    - **Flash与JavaScript的集成**:学习使用`ExternalInterface` API或其他方法实现Flash内容与JavaScript之间的通信,允许在两种技术间传递数据和触发事件。 - **响应式设计**:如何根据用户设备和浏览器特性决定是否...

    flash+js 图片变换

    这种通信是通过Flash的ExternalInterface类实现的,它允许Flash内容与宿主环境(通常是浏览器)进行双向通信。当需要在Flash内容与网页其他元素之间交换数据或执行某些操作时,这种方法非常有用。 实现图片变换的一...

    js调用flash里方法的简单例子

    在JavaScript和Flash之间进行交互是Web开发中的一个常见需求,特别是在过去Flash广泛用于实现多媒体功能时。本篇文章将深入探讨如何通过JavaScript调用Flash(ActionScript)中的方法,以实现两者之间的通信。这个...

    Flash flex与JS通信

    在Web开发领域,Flash Flex和JavaScript之间的通信是一个重要的技术话题,尤其在构建富互联网应用程序(RIA)时。Flex是一款基于ActionScript的开发框架,用于创建交互式的、动态的Web应用程序,而JavaScript是网页...

    Flash传递参数

    3. **JavaScript-ActionScript通信**: 使用`ExternalInterface`类,Flash可以与JavaScript进行双向通信。在JavaScript中设置变量,然后在ActionScript中通过`ExternalInterface.call`方法调用JavaScript函数来获取...

    workspace20100228.rar

    在ActionScript和JavaScript交互之前,首先需要解决跨域问题。由于安全限制,不同源的脚本之间不能直接通信。为此,我们需要创建一个跨域策略文件(crossdomain.xml),它定义了允许哪些域的ActionScript可以访问该...

Global site tag (gtag.js) - Google Analytics