一直沒去深入研究下AS3與JS的交互開發也就是SWF在html中的通信,最近出於項目要求被迫投入了,也在這裡做個匯總.
一:HTML中最快速的傳值方式
在HTML中插SWF時,可以跟個參數,比如:
files/home.swf?id=”21″
在AS3裡可以這樣去接收
var id:String=stage.loaderInfo.parameters["id"]; 這種傳值方式其實AS2的時候也是這樣做的,到AS3時使用parameters 屬性替換了AS1.0 和2.0 提供SWF文件參數作為主時間軸的技術,所以我們改用一下AS3的取值方式就行了.
這種方式只能是單邊一次性傳值,有時候會用得到,但需要與JS相互通信就不行了,還有,只能接收字符串.
二:使用外部通信接口ExternalInterface
這也是AS2時代進化來的,目前公認的最靠譜的通信方式.
使用方法:
1.JS調用AS3的函數
確定JS調用AS3之前,要在AS3中綁定調用函數,也就是說,只有AS3答應給的方法JS才能調用.
使用:ExternalInterface.addCallback(functionName:String, closure:Function):void有兩個參數:
functionName:String — 容器可用於調用函數的名稱。
closure:Function — 要調用的 closure 函數。 這可能是一個獨立的函數,或者可能是引用對象實例方法
ExternalInterface.addCallback("getASVars",getASFun); private function getASFun(value:String):void { //得到JS傳來的值:value }
好了,可以在JS中去調用這個方法了,調用前還要先取得插進HTML的SWF的ID,我們在HTML中不管用什麼方式插都可以設置ID
例如先通過id為”mov”來獲取對象,再調用上面綁定的方法:
代碼如下: function thisMovie(movieName) { if (navigator.appName.indexOf("Microsoft") != -1) { return window[movieName]; } else { return document[movieName]; } } thisMovie("mov").getASVars(value); 2.AS3調用JS的函數AS3調JS直接使用call就行了
使用:ExternalInterface.call(functionName:String, … arguments):*
這個方法有兩個參數:
functionName:String — 要在容器中調用的函數的名稱。
… arguments — 傳遞到容器中的函數的參數。 您可以指定零個或多個參數,參數之間用逗號分隔。 這些參數可以是任何 ActionScript 數據類型。 當調用 JavaScript 函數時,ActionScript 類型自動封裝到 JavaScript 類型中;當調用其它某個 ActiveX 容器時,將在請求消息中對參數進行編碼。
例如:
代碼如下: ExternalInterface.call("setToJS","paramTest"); //在JS中編寫這個setToJS的函數 function senToJS(value){ alert(value)//輸出:paramTest }看起來很爽,但也不是完全靠譜,這個接口還是會挑食的,只有在以下浏覽器中才支持: 浏覽器 操作系統 操作系統 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 還有個安全沙箱的問題,如果出現安全沙箱警報,可以使用以下兩種修正方法: 1.在包含 HTML 頁中的 SWF 文件的 object 標簽中,設置以下參數: 2.在 SWF 文件中,添加以下 ActionScript:代碼如下: Flash.system.Security.allowDomain(sourceDomain)