今更ながら使う機会がありそうなので使い方をまとめてみる。
Flash / JavaScript Integration Kit
の
・Download the latest release of the Flash / JavaScript Integration Kit.
から最新のライブラリをダウンロード。
FlashJavascriptGateway.zipを解凍
・Flash側の設定:
1.source/flash/actionscriptのcomフォルダをFlashのクラスパスに追加するか、
Kitを使用するflaファイルと同じディレクトリにcomフォルダごとコピー。
2.Kitを使用するflaファイルにcomフォルダ内のJavaScriptProxyクラスのインポートと、インスタンスを生成するActionScriptを記述。
var proxy:JavaScriptProxy = new JavaScriptProxy(_root.lcId, this);
・HTML側の設定:
1.installationフォルダのJavaScriptFlashGateway.js、JavaScriptFlashGateway.swfをwebディレクトリにコピー
2.HTMLにFlashProxyのインスタンスを生成するJavaScriptを記述。
<script language="javascript">
var lcId = new Date().getTime();
var flashProxy = new FlashProxy(lcId, "上記でコピーしたJavaScriptFlashGateway.swfまでのパス");
</script>
3.swfを表示するJavaScriptを記述。
var tag = new FlashTag("Kitを使用するswfまでのパス", Kitを使用するswfの縦幅, Kitを使用するswfの横幅); // last two arguments are height and width
tag.setFlashvars('lcId='+lcId);
tag.write(document);
</script>
例.
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=shift_jis" />
<title>Sample</title>
<script type="text/javascript" src="JavaScriptFlashGateway.js"></script>
<script language="javascript">
var lcId = new Date().getTime();
var flashProxy = new FlashProxy(lcId, "JavaScriptFlashGateway.swf");
</script>
</head>
<body bgcolor="#ffffff">
<!--url's used in the movie-->
<!--text used in the movie-->
<script type="text/javascript">
var tag = new FlashTag("Sample.swf", 550, 400);
tag.setFlashvars('lcId='+lcId);
tag.write(document);
</script>
</body>
</html>
・FlashからJavaScriptの関数呼び出し:
*呼び出した関数の返り値を取得する場合は、呼び出されるJavaScript関数内でFlash内の関数を呼んで値を返す必要がある。
例.
flashProxy.call("ActionScript関数名", Flashに返す値1,Flashに返す値2... );
}
・JavaScriptからFlashの関数呼び出し:
*呼び出した関数の返り値を取得する場合は、呼び出されるActionScript関数内でJavaScript内の関数を呼んで値を返す必要がある。
例.
proxy.call( "JavaScript関数名", JavaScriptに返す値1,JavaScriptに返す値2... );
}
*「"com.macromedia.javascript.JavaScriptProxy" がロードされませんでした。」のエラーが出る問題:
Windows 版の Flash は asファイルが BOM つきの UTF-8 で保存されてないとダメらしい。
JavaScriptProxy.as と JavaScriptSerializer.as を Flash で一度開いてから保存しなおすことによって解決。
*日本語が使えない問題:
こちらのblogで詳しい原因と解決策が紹介されています。
ARK-WEB Blog:JavaScriptからFlashの関数を呼ぶ - Flash Java Script Integration Kit
・修正方法:
JavaScriptFlashGateway.jsの250行目付近の以下部分を修正。
修正前.
{
case 'undefined':
qs += 't'+(i)+'=undf';
break;
case 'string':
qs += 't'+(i)+'=str&d'+(i)+'='+escape(args[i]);
break;
case 'number':
qs += 't'+(i)+'=num&d'+(i)+'='+escape(args[i]);
break;
case 'boolean':
qs += 't'+(i)+'=bool&d'+(i)+'='+escape(args[i]);
break;
修正後.
{
case 'undefined':
qs += 't'+(i)+'=undf';
break;
case 'string':
qs += 't'+(i)+'=str&d'+(i)+'='+encodeURI(args[i]);
break;
case 'number':
qs += 't'+(i)+'=num&d'+(i)+'='+escape(args[i]);
break;
case 'boolean':
qs += 't'+(i)+'=bool&d'+(i)+'='+escape(args[i]);
break;
