一直沒去深入研究下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 函數。 這可能是一個獨立的函數,或者可能是引用對象實例方法的 closure 方法。通過傳遞 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> 標籤中,設置以下參數:
<param name="allowScriptAccess" value="always" />
<2>.在 SWF 文件中,添加以下 ActionScript:
flash.system.Security.allowDomain(sourceDomain)