Fork me on GitHub

Programming Design Notes

Javascript 呼叫 Actionscript 3

| Comments

Javascript call Asctionscript 的 function:

Actionscript 3 部份:
ExternalInterface.addCallback("flashHello", flashHello);

public function flashHello():void{
trace("hello");
}

如果你是使用 Flash Builder 4,ExternalInterface 那行會報錯的,解決方法是將那行放到 function 中,待 Flash 完全載入完成再執行那個 function。

public function init():void {
ExternalInterface.addCallback("flashHello", flashHello);
}

在 s:Application 這個 tag 內加上 applicationComplete,這樣便會在完全載入完成時執行 init 這個 function。
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" applicationComplete="init()">

現在到 Javascript 部份,首先 Javascript 要先取得到 Flash 物件,如果沒有使用 SWFObject 的先要加上要下 function。
function getFlashMovieObject(movieName){
if (window.document[movieName]){
return window.document[movieName];
}
if (navigator.appName.indexOf("Microsoft Internet")==-1){
if (document.embeds && document.embeds[movieName])
return document.embeds[movieName];
}
else{
return document.getElementById(movieName);
}
}

取得 Flash 物件:
var obj = getFlashMovieObject("flashId");

有使用 SWFObject 只需用以下方法便可取得 Flash 物件。
var obj = swfobject.getObjectById("flashId");

現在 Javascript 執行 Actionscript 3 的 function:
if(obj)
obj.flashHello();

要輸入變數也沒有問題:
Actionscript 3:
public function init():void {
ExternalInterface.addCallback("flashSomething", flashSomething);
}

public function flashSomething(message:String):void{
trace(message);
}

Javascript:
if(obj)
obj.flashSomething();

返回數值:
Actionscript:
public function init():void {
ExternalInterface.addCallback("flashSomething", flashSomething);
}

public function flashSomething(message:String):String{
trace(message);
return message + " from flash ";
}

Javascript:
if(obj)
alert(obj.flashSomething());

相關書籍: Flex 4 Cookbook: Real-world recipes for developing Rich Internet ApplicationsFlash Builder 4 and Flex 4 BibleLearning ActionScript 3.0: A Beginner's Guide