ActionScript調用javaScript
需要引入flash.external.ExternalInterface,這裡要用到ExternalInterface類的call方法:
ExternalInterface.call(functionName:String,…arguments):*,fuctionName:
要調用的Javascript函數名,arguments:參數,可選。
調用由 Flash Player 容器公開的函數,傳遞零個或多個參數。如果所需的函數不可用,則調用返回 null;否則,它返回由該函數提供的值。不允許使用遞迴;遞迴調用會產生 null 響應。
如果容器是 HTML 頁,則此方法在<script> 元素中調用 JavaScript 函數。
如果該容器是其它某個 ActiveX 容器,則此方法會使用指定的名稱廣播事件,並且該容器會處理該事件。
如果該容器承載 Netscape 外掛程式,您可以寫入對新 NPRuntime 介面的自訂支援或嵌入 HTML 控制項以及在 HTML 控制項內嵌入 Flash Player。如果嵌入 HTML 控制項,就可以通過與本機容器應用程式通迅的 JavaScript 介面與 Flash Player 進行通訊。
JavaScript調用ActionScript
需要引入flash.external.ExternalInterface,這要用到ExternalInterface類的addCallback方法:
ExternalInterface.addCallback( functionName:String, closure:Function):void,functionName:
要註冊的函數名,closure:對應的執行函數。
ActionScript 方法註冊為可從容器調用,成功調用 addCallBack() 後,容器中的 JavaScript 或 ActiveX 代碼可以調用在 Flash Player 中註冊的函數。
在包含 SWF 檔案的 HTML 頁中,在該檔案的 object 標籤中設定參數:
| 代碼如下 |
複製代碼 |
<param name="allowScriptAccess" value="always" /> 在 SWF 檔案中,添加以下 ActionScript: flash.system.Security.allowDomain(sourceDomain ) |
這2個說明為瞭解決安全沙箱的問題,但是實際使用中,我們常常還會遇到更加頭疼的問題。
具體執行個體
Interactive.fla
建立 fla 檔案,舞台大小為300*80,顏色為#CCCCCC,類指定為Interactive;
位置(10,15)處添加260*22大小的Label label;
位置(10,50)處添加170*22大小的TextInput textInput;
位置(190,50)處添加100*22大小的Button button。
| 代碼如下 |
複製代碼 |
<html> <head> <script type="text/javascript" src="Interactive.js"></script> </head> <body> <table><tr><td> <object id="asFunction" data="Interactive.swf" type="application/x-shockwave-flash" width="300" height="80"> </object> </td></tr><tr><td> <input id="jsInput" type="text" /> <input type="button" value="調用AS" onclick="callAs()" /> </td></tr></table> </body> </html> function jsMethod(arg) { alert("as 調用 js 成功,參數為:" + arg); return ("as 調用 js 成功!"); } function callAs() { var myFlexfun = document.getElementById("asFunction"); var result = myFlexfun.callAs(jsInput.value); alert("傳回值:" + result); } package { import flash.display.Sprite; import flash.events.MouseEvent; import flash.external.ExternalInterface; public class Interactive extends Sprite { public function Interactive() { init(); } private function init():void { // 將方法 asMethod 註冊為可從容器調用 ExternalInterface.addCallback("callAs",asMethod); button.addEventListener(MouseEvent.CLICK,buttonClick); } private function buttonClick(event:MouseEvent):void { trace(textInput.text); label.text = "as 調用 js ..."; var result:String = callJS(textInput.text); label.text = "傳回值:" + result; } // ActionScript 調用 JavaScript; private function callJS(arg:String):String { // 調用指定的 JavaScript 端的函數,並順序指定傳遞給 JavaScript 端函數的參數 return ExternalInterface.call("jsMethod",arg); } // JavaScript 調用 ActionScript 時,ActionScript 端的函數; private function asMethod(arg:String):String { label.text = arg; return "js 調用了 as 成功!"; } } } |