请选择 进入手机版 | 继续访问电脑版
收藏本站腾讯微博新浪微博
点点网模板设计大赛 phpchina

经典论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

蓝色理想 最新研发动态 用悬赏 三天解决问题 解决访问速度慢 论坛支持农历生日 - 给官方提建议

论坛活动及任务 归纳网站最新活动 地图任务 邮件更新任务:保护帐号安全

积分换实物,来参加蓝色理想积分兑换吧! 联系招聘客服 蓝色理想帮你找工作! 万元奖励等你拿——点点网模板设计大赛

查看: 6344|回复: 1

[AS3] [AS3.0]使用flash.external.ExternalInterface教程 [复制链接]

alvas 楼主
帖子
68
体力
294
威望
3
发表于 2007-7-11 11:18:06 |显示全部楼层
”ExternalInterface 类是外部 API,在 ActionScript 和 Flash Player 的容器之间实现直接通讯的应用程序编程接口,
例如,含有 JavaScript 的 HTML 页。 推荐对所有 JavaScript 与 ActionScript 之间的通信使用 ExternalInterface。

在 HTML 页中使用 JavaScript,可以调用 Flash Player 中的 ActionScript 函数。 ActionScript 函数可以返回一个值,JavaScript 会立即接收它作为该调用的返回值。
此功能替代了较旧的 fscommand() 方法。“   ——摘自 <ActionScript 3.0 语言和组件参考 - ExternalInterface >.

我根据官方文档稍稍改变和注释,为你解释如何使用ExternalInterface。
实例:http://221.174.21.80/temp/ext/ext.html
打包下载:



ExternalInterface

一个重要属性:available : Boolean   见下边代码的粗体显示“point 1”
                     [static] [read-only] 指示此播放器是否位于提供外部接口的容器中。
                     注意:将 External API 与 HTML 一起使用时,应始终在尝试调用任何 JavaScript 方法之前先检查 HTML 是否已完全加载。

两个重要方法:addCallback(functionName:String, closure:Function):void    见下边代码的粗体显示“point 2”
                    [static] 将 ActionScript 方法注册为可从容器调用。
                              SecurityError &mdash 包含环境属于调用代码无权访问的安全沙箱。 修正此问题:
                              在包含 HTML 页中的 SWF 文件的 <object> 标签中,设置以下参数:
                                                            <param name="allowScriptAccess" value="always" />

                              在 SWF 文件中,添加以下 ActionScript:
                                                            flash.system.Security.allowDomain(sourceDomain)


   
                    call(functionName:String, ... arguments):*                        见下边代码的粗体显示“point 3”
                    [static] 调用由 Flash Player 容器公开的函数,不传递参数或传递多个参数。  

//------------------------------ExternalInterfaceExample.as------------------
package ext{
    import flash.display.Sprite;
    import flash.events.*;
    import flash.external.ExternalInterface;
    import flash.filters.GlowFilter;
    import flash.text.TextField;
    import flash.text.TextFieldAutoSize;
    import flash.text.TextFieldType;
    import flash.utils.Timer;

    public class ExternalInterfaceExample extends Sprite {
        private var input:TextField;
        private var output:TextField;
        private var sendBtn:Sprite;

        public function ExternalInterfaceExample() {
               
                //-----------------初始化UI------------start--------------
            input = new TextField();
            input.type = TextFieldType.INPUT;
            input.background = true;
            input.border = true;
            input.borderColor = 0x7f9db9;
            input.width = 274;
            input.height = 20;
            input.x = 8;
            input.y = 16;
            addChild(input);

            sendBtn = new Sprite();
            sendBtn.mouseEnabled = true;
            sendBtn.x = input.width + 8 + 6;
            sendBtn.y = 16;
            sendBtn.graphics.lineStyle(1, 0x7f9db9, 1);
            sendBtn.graphics.beginFill(0xCCCCCC);
            sendBtn.graphics.drawRoundRect(0, 0, 140, 20, 0, 0);
            sendBtn.graphics.endFill();
            //添加发送事件
            sendBtn.addEventListener(MouseEvent.CLICK, clickHandler);
            addChild(sendBtn);
            
                   var label : TextField = new TextField();
                   label.text = "发送数据到JS";
                   label.autoSize = TextFieldAutoSize.LEFT;
                   label.x = sendBtn.x+ Math.round((sendBtn.width - label.width)/2);
                   label.y = sendBtn.y;
                   label.selectable = false;
                   label.mouseEnabled = false;
                   addChild(label);                  
                       
                        this.graphics.lineStyle(1, 0x7f9db9, 1);
                        this.graphics.moveTo(8, 40);
                        this.graphics.lineTo(428, 40);
                        this.graphics.lineTo(428, 203);
                        this.graphics.lineTo(8, 203);
                        this.graphics.lineTo(8, 40);
                       
            output = new TextField();
            output.y = 40;
            output.x = 10;
            output.width = 420;
            output.height = 160;
            output.multiline = true;
            output.wordWrap = true;
            output.textColor = 0x00ff00;
                        output.filters = [new GlowFilter(0x000000, 0.8, 2, 2, 8, 3)];
            output.text = "初始化...\n";
            addChild(output);
                        //-----------------初始化UI---------end-----------------
                       
                       
                        //指示此播放器是否位于提供外部接口的容器中。 如果外部接口可用,则此属性为 true;否则,为 false。
            if (ExternalInterface.available) {     //point 1
                try {
                    //对JavaScript开放一个方法;
                    ExternalInterface.addCallback("sendToActionScript", receivedFromJavaScript);             //point 2
                    if (checkJavaScriptReady()) {
                        output.appendText("JavaScript is ready.\n");
                    } else {
                            //如果JavaScript is not ready,新建一定时器,没0.1秒检测一次,直至JavaScript is ready;
                        output.appendText("JavaScript is NOT ready, 0.1秒后重试.\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不可用。");
            }
        }
        
        /**
        * 对JavaScript开放的名为sendToActionScript的方法。
        * 在JavaScript中这样调用:.sendToActionScript(instring),
        * instring就传给本方法的value了。
        */
        private function receivedFromJavaScript(value:String):void {              //point 2
            output.appendText("JavaScript 说: " + value + "\n");
        }
        
        /**
        * 调用JavaScript暴露的方法 isReady
        */
        private function checkJavaScriptReady():Boolean {
           var isReady:Boolean = ExternalInterface.call("isReady");                     //point 3
            return isReady;
        }
        
        private function timerHandler(event:TimerEvent):void {
            output.appendText("检查 JavaScript 状态...\n");
            if (checkJavaScriptReady()) {
                output.appendText("JavaScript is ready.\n");
                Timer(event.target).stop();
            }
        }
        
        /**
        * 鼠标点击发送时, 调用JavaScript暴露的方法 sendToJavaScript
        */
        private function clickHandler(event:MouseEvent):void {
            if (ExternalInterface.available) {
                ExternalInterface.call("sendToJavaScript", input.text);                     //point 3
            }
        }
    }
}

//------------------------------------ext.html---------------------------------------------
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>ExternalInterface实例</title>
<style type="text/css">
        body {
                background-color: #FFF;
                font-family: "Arial", "宋体";
        }
</style>
<script type="text/javascript" src="swfobject.js"></script>
<script language="JavaScript">
     var jsReady = false;
         //暴露给ActionScript的方法
     function isReady() {
         return jsReady;
     }                                                                                                             // point 3

     function pageInit() {
         jsReady = true;
         document.forms["form1"].output.value += "\n" + "JavaScript is ready.\n";
                 installOK();
     }
         function installOK(){        //此处使用了SWFObject,如有不懂可看 http://www.awflasher.com/flash/articles/swfobj.htm
                var so = new SWFObject("Ext.swf", "Ext", "430", "220", "9", "#FFF");
                so.addParam("quality" , "high");
                so.addParam("allowScriptAccess" , "sameDomain");
                so.write("icenter");
         }
       
     function thisMovie(movieName) {
         if (navigator.appName.indexOf("Microsoft") != -1) {
             return window[movieName];
         } else {
             return document[movieName];
         }
     }
         //调用ActionScript暴露的方法sendToActionScript
     function sendToActionScript(value) {
         thisMovie("Ext").sendToActionScript(value);
     }
         //暴露给ActionScript的方法       
     function sendToJavaScript(value) {
         document.forms["form1"].output.value += "SWF 说: " + value + "\n";
     }                                                                                                                   // point3

</script>
</head>

<body onload="pageInit();">
<div id = "iall">
<div id="icenter"></div>
<div id="iform">
        <form name="form1" onsubmit="return false;">
                <input type="text" name="input" size="40" value="" />
                <input type="button" value="发送数据到SWF" onclick="sendToActionScript(this.form.input.value);" /><br />
                <textarea cols="50" rows="10" name="output" readonly="true">初始化...</textarea>
        </form>
</div>
</div>
</body>
</html>

[ 本帖最后由 alvas 于 2007-7-11 11:24 编辑 ]
附件: 你需要登录才可以下载或查看附件。没有帐号?注册
已有 1 人评分威望 收起 理由
蓝色月光 + 2 原创内容

总评分: 威望 + 2   查看全部评分

少些争论,多写教程
西部数码顶级域名注册商39元抢注!
eidiot 
帖子
258
体力
671
威望
101
发表于 2007-7-11 12:56:50 |显示全部楼层
楼主的签名不错
租服务器,上51IDC | [长沙]招聘:PHP经理10K/WEB前端6K/PHP开发6K

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

Archiver|手机版|安久科技提供CDN|blueidea.com ( 京ICP备05002321号 )  

GMT+8, 2012-2-12 08:31 , Processed in 0.063612 second(s), 11 queries , Gzip On, Memcache On.

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部