AS3與JS通信

一直沒去深入研究下AS3與JS的交互開發也就是SWF在html中的通信,最近出於項目要求被迫投入了,也在這裏做個彙總

一:HTML中最快速的傳值方式

在HTML中插SWF時,可以跟個參數,比如:

files/home.swf?id="21"

在AS3裏可以這樣去接收

AS3代碼
  1. 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 方法,回調實際上可以定向到特定對象實例的方法。 
 

例如: 

AS3代碼
  1. ExternalInterface.addCallback("getASVars",getASFun);      
  2. private function getASFun(value:String):void {
  3. //得到JS傳來的值:value   
  4. }   

好了,可以在JS中去調用這個方法了,調用前還要先取得插進HTML的SWF的ID,我們在HTML中不管用什麼方式插都可以設置ID
例如先通過id爲"mov"來獲取對象,再調用上面綁定的方法:

JavaScript代碼
  1. function thisMovie(movieName) {   
  2.          if (navigator.appName.indexOf("Microsoft") != -1) {   
  3.              return window[movieName];   
  4.          } else {   
  5.              return document[movieName];   
  6.          }   
  7.      }   
  8. thisMovie("mov").getASVars(value);  

2.AS3調用JS的函數

AS3調JS直接使用call就行了

使用:ExternalInterface.call(functionName:String, ... arguments):*

這個方法有兩個參數: 
functionName:String — 要在容器中調用的函數的名稱。  
... arguments — 傳遞到容器中的函數的參數。 您可以指定零個或多個參數,參數之間用逗號分隔。 這些參數可以是任何 ActionScript 數據類型。 當調用 JavaScript 函數時,ActionScript 類型自動封裝到 JavaScript 類型中;當調用其它某個 ActiveX 容器時,將在請求消息中對參數進行編碼。

例如:

AS3代碼
  1. ExternalInterface.call("setToJS","paramTest");  

 在JS中編寫這個setToJS的函數

JavaScript代碼
  1. function senToJS(value){      
  2.   alert(value)//輸出:paramTest      
  3. }     

 

 看起來很爽,但也不是完全靠譜,這個接口還是會挑食的,只有在以下瀏覽器中才支持:

瀏覽器 操作系統 操作系統
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)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章