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 成功!";
}
}
} |