HAKUHIN's home page
更新履歴
 
 



Flash から JavaScript にアクセスする
 
 


■Flash から JavaScript にアクセスする
 
Flash から JavaScript を実行するには、以下の方法があります。
 



 



■fscommand() 関数を使用する
 
fscommand() 関数を使用すると Flash から JavaScript に記述した特定の関数を実行できます。
 
■FSCommand がサポートされた HTML を生成する
 
まず、Flash のパブリッシュ設定の、「HTMLのテンプレート」を「Flash(FSCommand サポート)」に設定して、HTMLを出力します。
 
デフォルトで生成されるタグを整理すると、以下のようになります。このタグを改変してみます。
 
「Flash(FSCommand サポート)」で生成されるタグを整理

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<title>名称未設定-1</title>
</head>
<body bgcolor="#ffffff">

<script language="JavaScript">
<!--
// Flash から呼び出される関数
function 名称未設定-1_DoFSCommand(command, args) {
	//
	// ここに JavaScript を追加
	//
}

// Internet Explorer 用のコード
if (navigator.appName && navigator.appName.indexOf("Microsoft") != -1 && navigator.userAgent.indexOf("Windows") != -1 && navigator.userAgent.indexOf("Windows 3.1") == -1) {
	document.write('<script language=\"VBScript\"\>\n');
	document.write('On Error Resume Next\n');
	document.write('Sub 名称未設定-1_FSCommand(ByVal command, ByVal args)\n');
	document.write('	Call 名称未設定-1_DoFSCommand(command, args)\n');
	document.write('End Sub\n');
	document.write('</script\>\n');
}
//-->
</script>

<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=10,0,0,0" id="名称未設定-1" width="550" height="400" align="middle">
	<param name="allowScriptAccess" value="sameDomain" />
	<param name="movie" value="名称未設定-1.swf" />
	<param name="quality" value="high" />
	<param name="bgcolor" value="#ffffff" />
	<embed src="名称未設定-1.swf" quality="high" bgcolor="#ffffff" width="550" height="400" swLiveConnect=true id="名称未設定-1" name="名称未設定-1" align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash" pluginspage="http://www.adobe.com/go/getflashplayer_jp" />
</object>

</body>
</html>
 
■HTML 側を FSCommand に対応する
 
まず、以下のタグの属性に注目します。
 
「objectタグの id」
 
「embed タグの id」
 
「embed タグの name」
 
ここにユニーク(唯一)な名前を付けます。ここでは "SwfTest" と名前を付けます。
 
「object タグの id」 と 「embed タグの name」 に識別名を付ける(一部略)

<html>
<head></head>
<body>

<script language="JavaScript"></script>

<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"
	codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=10,0,0,0"
	id="SwfTest" width="550" height="400" align="middle">
		<param name="allowScriptAccess" value="sameDomain" />
		<param name="movie" value="名称未設定-1.swf" />
		<param name="quality" value="high" />
		<param name="bgcolor" value="#ffffff" />
		<embed src="名称未設定-1.swf" quality="high" bgcolor="#ffffff" width="550" height="400"
			swLiveConnect=true id="SwfTest" name="SwfTest" align="middle" allowScriptAccess="sameDomain"
			type="application/x-shockwave-flash" pluginspage="http://www.adobe.com/go/getflashplayer_jp" />
</object>

</body>
</html>
 
次に JavaScript の 「名称未設定-1_DoFSCommand」という関数に注目します。Flash から fscommand() 関数を呼び出すと、この関数が呼び出される事になります。
 
このままでは動作しないので、この関数名を変更します。先ほど付けた名前に "_DoFSCommand" という文字を付加します
 
先ほどは "SwfTest" という名前を付けたので、ここでは、"SwfTest_DoFSCommand" という関数名になります。
 
Flash から呼び出される関数名を変更する(一部略)

<html>
<head></head>
<body>

<script language="JavaScript">
<!--
// Flash から呼び出される関数
function SwfTest_DoFSCommand(command, args) {
	//
	// コードをここに配置します。
	//
}

// Internet Explorer 用のコード
if (navigator.appName && navigator.appName.indexOf("Microsoft") != -1 && navigator.userAgent.indexOf("Windows") != -1 && navigator.userAgent.indexOf("Windows 3.1") == -1) {
	document.write('<script language=\"VBScript\"\>\n');
	document.write('On Error Resume Next\n');
	document.write('Sub 名称未設定-1_FSCommand(ByVal command, ByVal args)\n');
	document.write('	Call 名称未設定-1_DoFSCommand(command, args)\n');
	document.write('End Sub\n');
	document.write('</script\>\n');
}
//-->
</script>

<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"
	codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=10,0,0,0"
	id="SwfTest" width="550" height="400" align="middle">
		<param name="allowScriptAccess" value="sameDomain" />
		<param name="movie" value="名称未設定-1.swf" />
		<param name="quality" value="high" />
		<param name="bgcolor" value="#ffffff" />
		<embed src="名称未設定-1.swf" quality="high" bgcolor="#ffffff" width="550" height="400"
			swLiveConnect=true id="SwfTest" name="SwfTest" align="middle" allowScriptAccess="sameDomain"
			type="application/x-shockwave-flash" pluginspage="http://www.adobe.com/go/getflashplayer_jp" />
</object>

</body>
</html>
 
JavaScript の「Internet Explorer 用のコード」というコメントが付いた処理部分に注目します。 この一連の処理は、Internet Explorer で動作させる場合に必要となります。
 
ここで記述されている、
 
"名称未設定-1_FSCommand" という部分を、 先ほど付けた名前に "_FSCommand" という文字を付加した名称に変更します。 ここでは、 "SwfTest_FSCommand" となります。
 
"名称未設定-1_DoFSCommand" という部分を、 先ほど付けた名前に "_DoFSCommand" という文字を付加した名称に変更します。 ここでは、 "SwfTest_DoFSCommand" となります。
 
Internet Explorer 用のコードを修正する(一部略)

<html>
<head></head>
<body>

<script language="JavaScript">
<!--
// Flash から呼び出される関数
function SwfTest_DoFSCommand(command, args) {
	//
	// コードをここに配置します。
	//
}

// Internet Explorer 用のコード
if (navigator.appName && navigator.appName.indexOf("Microsoft") != -1 && navigator.userAgent.indexOf("Windows") != -1 && navigator.userAgent.indexOf("Windows 3.1") == -1) {
	document.write('<script language=\"VBScript\"\>\n');
	document.write('On Error Resume Next\n');
	document.write('Sub SwfTest_FSCommand(ByVal command, ByVal args)\n');
	document.write('	Call SwfTest_DoFSCommand(command, args)\n');
	document.write('End Sub\n');
	document.write('</script\>\n');
}
//-->
</script>

<object ><embed /></object>

</body>
</html>
 
embed タグの swLiveConnect 属性に注目します。このパラメータは、Netscape 6.2 未満で動作させる場合に必要となります。
 
fscommand() 関数を使って、Flash から JavaScript を実行する場合、Java を使用する必要があるようです。
 
swLiveConnect 属性を true に変更すると、Java が起動するようです。
 
embed タグの swLiveConnect 属性を true に設定する(一部略)

<html>
<head></head>
<body>

<script language="JavaScript"></script>

<object>
	<embed src="名称未設定-1.swf" quality="high" bgcolor="#ffffff" width="550" height="400"
		swLiveConnect=true id="SwfTest" name="SwfTest" align="middle" allowScriptAccess="sameDomain"
		type="application/x-shockwave-flash" pluginspage="http://www.adobe.com/go/getflashplayer_jp" />
</object>

</body>
</html>
 
■Flash 側で fscommand() 関数を実行する
 
ActionScript から、fscommand() 関数を実行します。
 
第01引数には、コマンドとして送信したい好きな文字列をセットします。
 
第02引数には、パラメータとして送信したい好きな文字列をセットします。
 
第01引数で設定する文字列には、以下のコマンド名がすでに存在します。
 
"quit"
 
"fullscreen"
 
"allowscale"
 
"showmenu"
 
"exec"
 
"trapallkeys"
 
これらの文字列をセットすると、ブラウザ用以外の FlashPlayer では別の動作をするので使用しない方がよさそうです。
 
呼び出し例です。
 
fscommand () 関数を実行する

fscommand("cmd_000" , "123");
fscommand("cmd_001" , "abc");
fscommand("cmd_002" , "あいうえお");
 
■JavaScript 側でコマンドを受け取る
 
JavaScript 側に 「#####_DoFSCommand」という名称の関数があれば、Flash からのコマンドを受け取る事ができます。
 
第01引数から、コマンド用の文字列が取得できます。
 
第02引数から、パラメータ用の文字列が取得できます。
 
Flash からは唯一、「#####_DoFSCommand」という名称の関数が実行できます。
 
複数の処理を行いたいときは、この関数内で第01引数のパラメータを使って処理の分岐を行います。
 
設定例です。
 
#####__DoFSCommand() 関数にコマンド分岐を追加する

<html>
<head></head>
<body>

<script language="JavaScript">
<!--
// Flash から呼び出される関数
function SwfTest_DoFSCommand(command, args) {
	
	switch(command){
	case "cmd_000":
		alert("cmd_000:" + args);
		break;
	case "cmd_001":
		alert("cmd_001:" + args);
		break;
	case "cmd_002":
		alert("cmd_002:" + args);
		break;
	default:
		alert("未実装のコマンド:" + command + " パラメータ:" + args);
		break;
	}
}

// Internet Explorer 用のコード
if (navigator.appName && navigator.appName.indexOf("Microsoft") != -1 && navigator.userAgent.indexOf("Windows") != -1 && navigator.userAgent.indexOf("Windows 3.1") == -1) {
	document.write('<script language=\"VBScript\"\>\n');
	document.write('On Error Resume Next\n');
	document.write('Sub SwfTest_FSCommand(ByVal command, ByVal args)\n');
	document.write('	Call SwfTest_DoFSCommand(command, args)\n');
	document.write('End Sub\n');
	document.write('</script\>\n');
}
//-->
</script>

<object ><embed /></object>

</body>
</html>
 
ローカル環境で動作確認する場合、「JavaScript 実行に関するサンドボックス」に注意します。
 
■fscommand() 関数を使用する際の注意点
 
ActionScript と JavaScript は同期的に実行されます。
 
ActionScript 側で fscommand ()関数を呼び出すと、JavaScript 側の関数が終了するまで Flash は停止します。
 
 


■navigateToURL() 関数を使用する
 
navigateToURL() 関数を使用すると Flash から JavaScript を実行できます。
 
URL として文字列で "javascript:" と記述し、続けて javascript のプログラムを記述します。 文字数は 508 字以内に収める必要があります。
 
アラート関数を呼び出す例です。
 
アラート関数を呼び出す

var url:URLRequest = new URLRequest("javascript:" + "alert( 'Hello World!' );");
navigateToURL(url,"_self");
 
ローカル環境で動作確認する場合、「JavaScript 実行に関するサンドボックス」に注意します。
 
■エスケープシーケンスを使用して記述する
 
文字列の中でシングルコーテーション '' やダブルコーテーション "" を使用する場合、書式が複雑になりがちです。そんなときは、
 
シングルコーテーションは 「\'
ダブルコーテーションは 「\"

と記述する事もできます。アラート関数を呼び出す例です。
 
エスケープシーケンスを使用してアラート関数を呼び出す

navigateToURL(new URLRequest("javascript:" + "alert( \'Hello World!\' );"),"_self");
navigateToURL(new URLRequest("javascript:" + "alert( \"Hello World!\" );"),"_self");
 
■Flash 側に JavaScript をすべて記述する場合
 
変数を宣言する処理を書けば JavaScript 側に変数を作成する事ができます。
 
変数を宣言して alert 関数を呼び出す

var js = 
"var value = 123;" +
"alert(value);";

navigateToURL(new URLRequest("javascript:" + js),"_self");
 
関数を宣言する処理を書けば JavaScript 側に関数を作成する事ができます。
 
関数を宣言して実行する


var js = 
"function MessageBoxCreate(value){" +
	"alert(value);" +
"};" +
"" +
"MessageBoxCreate(\"abc\")";

navigateToURL(new URLRequest("javascript:" + js),"_self");
 
navigateToURL() 関数は文字数制限があるので、長いプログラムを書く事はできません。
 
そこで、プログラムを小分けにして書けば実現できそうですが、残念ながら以下の問題があります。
 
navigateToURL() 関数を使うと、Flash と JavaScript が非同期で実行されます。 Flash 側で navigateToURL() 関数が終了したからといって JavaScript 側の処理が完了したとは限りません
 
以下のように、navigateToURL() 関数を連続で呼び出すと失敗する可能性があります。
 
navigateToURL() 関数を連続で呼び出すと失敗する可能性がある

navigateToURL(new URLRequest("javascript:" + "var value = 123;"),"_self");
navigateToURL(new URLRequest("javascript:" + "alert(value);"),"_self");
 
十分に時間隔を空けてから navigateToURL() を呼び出せば成功する可能性は高くなりますが、JavaScript 側の処理が確実に完了している保証は無いのでやはり危険です。
 
・文字数制限がある
・非同期で動作するため小分けにして実行するのは危険
・文字列中に JavaScript を記述する必要があるので面倒
 
以上のことから、Flash 内ですべての JavaScript プログラムを用意するのは難しいです。
 
次の解説にある、 HTML 側に JavaScript を記述して Flash から JavaScript の関数を呼び出すのが簡単です。
 
■HTML に記述した JavaScript の関数を呼び出す
 
HTML にJavaScript の関数を用意します。
 
ここでは、myFunc() という関数を用意します。
 
HTML側の記述例です。
 
HTML にJavaScriptを記述する

<HTML>
<HEAD>

<script type="text/javascript">
<!--
function myFunc(){
	alert("myFunc() 関数が呼び出されました。");
}
//-->
</script>

</HEAD>
<BODY>
</BODY>
</HTML>
 
HTML で宣言した JavaScript の関数を Flash 側から呼び出してみます。

Flash 側の記述例です。
 
Flash から JavaScript 側の関数 myFunc() を呼び出す

navigateToURL(new URLRequest("javascript:" + "myFunc();"),"_self");
 
■ JavaScript 関数の引数からパラメータを渡す
 
引数を利用すれば、Flash から JavaScript にパラメータを渡すことができます。

HTML側の記述例です。
 
HTML にJavaScriptを記述する

<HTML>
<HEAD>

<script type="text/javascript">
<!--
function myFunc2(param1,param2,param3,param4,param5){
	alert("myFunc2() 関数が呼び出されました。:" + param1 + " : " + param2 + " : " + param3 + " : " + param4 + " : " + param5 );
}
//-->
</script>

</HEAD>
<BODY>
</BODY>
</HTML>
 
Flash 側から呼び出してみます。
 
引数には、Boolean 型、Number 型、String 型、Array 型、Object 型を指定できますが、ActionScript の変数の状態でそのまま渡すことはできません。
 
配列型であれば、配列用の初期化を記述し、オブジェクト型であれば、オブジェクト用の初期化を記述します。
 
Flash 側の記述例です。
 
Flash から JavaScript 側の関数 myFunc2() を呼び出す

var param = "hello!!";
navigateToURL(new URLRequest("javascript:" + "myFunc2( true , 123 , \"" + param + "\" , [1,2,3] , { a:123 , b:456 });"),"_self");
 
■navigateToURL() 関数を使用する際の注意点
 
ActionScript と JavaScript は非同期で実行されます。

ActionScript 側で navigateToURL() 関数が終了して次の命令が処理されたからといって JavaScript 側の処理が終わっているとは限りません
 
 


■External API を使用する
 
External API を使用すると、HTML 側で記述している JavaScript 関数を実行できます。
 
navigateToURL() 関数を使用するより、External API を使用した方が、ブラウザを問わず統一された動作を行うことができます。
 
■ブラウザが External API に対応しているか調べる
 
ExternalInterface.available プロパティを使用すると、ブラウザが External API に対応しているか調べることができます。
 
true であれば使用可能です。
 
使用例です。
 
External API に対応しているか調べる

import flash.external.ExternalInterface;

var tf:TextField = new TextField();
addChild(tf);
tf.border = true;
tf.x = 10;
tf.y = 10;
tf.width = 400;
tf.height = 30;

tf.text = "External API : " + ExternalInterface.available;
 
■HTML 側の JavaScript 関数を実行する
 
HTML 側で JavaScript の関数を用意します。
 
ここでは、myFunc() と名前を付けます。
 
HTML 側に JavaScript の関数を使用する

<HTML>
<HEAD>

<script type="text/javascript">
<!--
function myFunc(){
	alert("myFunc() 関数が呼び出されました。");
}
//-->
</script>

</HEAD>
<BODY></BODY>
</HTML>
 
Flash から JavaScript の関数を実行するには、ExternalInterface.call() メソッドを使用します。
 
第01引数に、関数名を String 型で指定します。
 
使用例です。
 
JavaScript の関数 "myFunc" を呼び出す

import flash.external.ExternalInterface;

ExternalInterface.call("myFunc");
 
■ JavaScript にパラメータを渡す
 
引数を使うと、JavaScript にパラメータを渡す事ができます。
 
HTML 側の記述例です。
 
HTML 側に引数付きの JavaScript 関数を用意する

<HTML>
<HEAD>

<script type="text/javascript">
<!--
function myFunc2(param1,param2,param3){
	alert("myFunc2() 関数が呼び出されました。 : " + param1 + " : " + param2 + " : " + param3);
}
//-->
</script>

</HEAD>
<BODY></BODY>
</HTML>
 
ExternalInterface.call() メソッドの第 02 引数以降に、パラメータを引数としてセットすると、指定した個数分を JavaScript 側に送る事ができます。
 
引数には、Boolean 型、Number 型、String 型、Array 型、Object 型を指定できます。ActionScript の変数をそのまま渡すことができます。
 
使用例です。
 
JavaScript の関数 "myFunc2" を引数付きで呼び出す

import flash.external.ExternalInterface;

ExternalInterface.call("myFunc2",false,123,"あいう");
 
■ JavaScript からパラメータを取得する
 
戻り値を使うと、JavaScript からパラメータを取得する事ができます。
 
HTML 側の記述例です。
 
HTML 側に戻り値付きの JavaScript 関数を用意する

<HTML>
<HEAD>

<script type="text/javascript">
<!--
function myFunc3(param1,param2){
	alert("myFunc3() 関数が呼び出されました。 : " + param1 + " : " + param2);
	
	return (param1 + param2);
}
//-->
</script>

</HEAD>
<BODY></BODY>
</HTML>
 
ExternalInterface.call() メソッドの戻り値を使用すると、 JavaScript からパラメータを取得する事ができます。
 
戻り値には、Boolean 型、Number 型、String 型、Array 型、Object 型を指定できます。
 
使用例です。
 
JavaScript の関数 "myFunc3" から戻り値を取得する

import flash.external.ExternalInterface;

var tf:TextField = new TextField();
addChild(tf);
tf.border = true;
tf.x = 10;
tf.y = 10;
tf.width = 400;
tf.height = 30;

tf.text = String(ExternalInterface.call("myFunc3",123,456));
 
■External API を使用する際の注意点
 
ActionScript と JavaScript は同期的に実行されます。
 
ActionScript 側で JavaScript の関数を呼び出すと、JavaScript 側の関数が終了するまで Flash は停止します。
 




JavaScript から Flash にアクセスする
 
 


■JavaScript から Flash にアクセスする
 
JavaScript から Flash にアクセスするには、以下の方法があります。
 

 
 


■External API を使用する
 
External API を使用すると、「JavaScript 側」から 「Flash 側で記述している ActionScript 関数」を実行できます。
 
External API を使用すると、ブラウザを問わず統一された動作を行うことができます。
 
■ブラウザが External API に対応しているか調べる
 
ExternalInterface.available プロパティを使用すると、ブラウザが External API に対応しているか調べることができます。
 
true であれば使用可能です。
 
使用例です。
 
External API に対応しているか調べる

import flash.external.ExternalInterface;

var tf:TextField = new TextField();
addChild(tf);
tf.border = true;
tf.x = 10;
tf.y = 10;
tf.width = 400;
tf.height = 30;

tf.text = "External API : " + ExternalInterface.available;
 
■Flash 側の関数を用意する
 
Flash 側で関数を用意します。
 
ここでは、myFunc() と名前を付けます。
 
Flash 側に関数を用意する

function myFunc():void{
	var tf:TextField = new TextField();
	addChild(tf);
	tf.border = true;
	tf.x = 10;
	tf.y = 10;
	tf.width = 400;
	tf.height = 30;

	tf.text = "myFunc() 関数が呼び出されました。 : " + this;
}
 
■Flash 側の関数を外部から実行される準備をする
 
Flash 側で用意した ActionScript の関数を外部から実行可能な状態にするには、ExternalInterface.addCallback() メソッドを使用します。
 
第 01 引数で JavaScript 側で呼び出す為の関数名称を設定します。ここでは、"asFunc" と名前を付けます。
 
ExternalInterface.addCallback ( "外部に公開する関数名称" , 関数 );
第01引数 JavaScript 側で関数を呼び出す際に使用する名称を設定します。好きな識別名を付けることができます。
第02引数 ActionScript 側の関数を指定します。
戻り値 登録に成功すれば true、失敗すれば false
 
設定例です。
 
Flash 側の関数をJavaScript から呼び出せるよう登録する

import flash.external.ExternalInterface;

ExternalInterface.addCallback("asFunc",myFunc);
 
■Flash のエレメントを取得する
 
object タグの id」 と 「embedタグ の name」 にパラメータを追加します。
 
ユニーク(唯一)な名前を付けます。ここでは "swf_test" と名前を付けます。
 
設定例です。
 
object タグの id と embed タグの name を追加する

<html>
<body>

<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" 
	codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" 
	width="550" height="400" id="swf_test" align="middle">
<param name="allowScriptAccess" value="always" />
<param name="movie" value="test.swf" />
<param name="quality" value="high" />
<param name="bgcolor" value="#ffffff" />
<embed src="test.swf"
	quality="high" bgcolor="#ffffff" width="550" height="400"
	name="swf_test" align="middle" allowScriptAccess="always"
	type="application/x-shockwave-flash"
	pluginspage="http://www.macromedia.com/go/getflashplayer" />
</object>

</body>
</html>
 
JavaScript から以下のラッピング関数 DocumentGetElementFromName() を使用してFlash のエレメントを取得します。
 
引数に、先ほど付けた名前を指定します。
 
取得例です。
 
エレメントを取得する

<HTML>
<HEAD>

<script type="text/javascript">
<!--
// ボタンが押されたときに実行される関数
function ButtonClickFunc(){
	// Flash のエレメントを取得
	var swf = DocumentGetElementFromName("swf_test");
	alert(swf);
}

function DocumentGetElementFromName(name) {
	var obj;
	if (navigator.appName.indexOf("Microsoft") != -1)	obj = window[name];
	else	obj = document[name];

	if(!obj)	return null;
	if(obj.constructor == HTMLCollection)	return obj[0];
	return obj;
}
//-->
</script>

</HEAD>
<BODY>
	<input type="button" value="JavaScript 実行" style = "width:100%; height:50px;" onclick = "ButtonClickFunc()"><BR>
</BODY>
</HTML>
 
■Flash のエレメントから外部に公開したメソッドを呼び出す
 
Flash のエレメントには、外部に公開した関数が格納されています。
 
先ほど、"asFunc" という関数を登録したのでこの関数を呼び出してみます。
 
外部に公開したFlash側の関数を JavaScript から呼び出す

<HTML>
<HEAD>

<script type="text/javascript">
<!--
// ボタンが押されたときに実行される関数
function ButtonClickFunc(){
	// Flash のエレメントを取得
	var swf = DocumentGetElementFromName("swf_test");
	if(swf){
		// 外部に公開した関数を実行
		swf.asFunc();
	}
}

function DocumentGetElementFromName(name) {
	var obj;
	if (navigator.appName.indexOf("Microsoft") != -1)	obj = window[name];
	else	obj = document[name];

	if(!obj)	return null;
	if(obj.constructor == HTMLCollection)	return obj[0];
	return obj;
}
//-->
</script>

</HEAD>
<BODY>
	<input type="button" value="JavaScript 実行" style = "width:100%; height:50px;" onclick = "ButtonClickFunc()"><BR>
</BODY>
</HTML>
 
■ Flash にパラメータを渡す
 
引数を使うと、Flash にパラメータを渡す事ができます。
 
Flash 側で引数付きの関数を用意して外部に公開します。
 
ここでは、"asFunc2" と名前を付けます。
 
JavaScript から引数付きの関数を呼び出せるよう公開する

import flash.external.ExternalInterface;

function myFunc2(param1:Boolean,param2:Number,param3:String,param4:Array,param5:Object):void{
	var tf:TextField = new TextField();
	addChild(tf);
	tf.border = true;
	tf.x = 10;
	tf.y = 10;
	tf.width = 400;
	tf.height = 300;
	tf.multiline = true;

	tf.text = "myFunc2() 関数が呼び出されました。 : " + this + "\n" + "param1:" + param1 + "\n" + "param2:" + param2 + "\n" + "param3:" + param3 + "\n" + "param4:" + param4 + "\n" + "param5:" + param5 + "\n";
}

ExternalInterface.addCallback("asFunc2",myFunc2);
 
引数には、Boolean 型、Number 型、String 型、Array 型、Object 型を指定できます。JavaScript の変数をそのまま渡すことができます。
 
HTML 側の記述例です。
 
外部に公開したFlash 側の関数を引数付きで呼び出す

<HTML>
<HEAD>

<script type="text/javascript">
<!--
// ボタンが押されたときに実行される関数
function ButtonClickFunc(){
	// Flash のエレメントを取得
	var swf = DocumentGetElementFromName("swf_test");
	if(swf){
		// 外部に公開した関数を実行
		swf.asFunc2(true,123,"あいうえお",[0,1,2,3,4],{a:0,b:1,c:2});
	}
}

function DocumentGetElementFromName(name) {
	var obj;
	if (navigator.appName.indexOf("Microsoft") != -1)	obj = window[name];
	else	obj = document[name];

	if(!obj)	return null;
	if(obj.constructor == HTMLCollection)	return obj[0];
	return obj;
}
//-->
</script>

</HEAD>
<BODY>
	<input type="button" value="JavaScript 実行" style = "width:100%; height:50px;" onclick = "ButtonClickFunc()"><BR>
</BODY>
</HTML>
 
■ Flash からパラメータを受け取る
 
戻り値を使うと、Flash からパラメータを受け取る事ができます。
 
Flash 側で戻り値付きの関数を用意して外部に公開します。 戻り値には、Boolean 型、Number 型、String 型、Array 型、Object 型を指定できます。ActionScript の変数をそのまま返すことができます。
 
ここでは、"asFunc3" と名前を付けます。
 
JavaScript から戻り値付きの関数を呼び出せるよう公開する

import flash.external.ExternalInterface;

function myFunc3():String{
	var tf:TextField = new TextField();
	addChild(tf);
	tf.border = true;
	tf.x = 10;
	tf.y = 10;
	tf.width = 400;
	tf.height = 30;
	tf.multiline = true;

	tf.text = "myFunc3() 関数が呼び出されました。 : " + this;

	return "あいうえお";
}

ExternalInterface.addCallback("asFunc3",myFunc3);
 
HTML 側の記述例です。
 
外部に公開したFlash 側の関数を呼び出して戻り値を取得する

<HTML>
<HEAD>

<script type="text/javascript">
<!--
// ボタンが押されたときに実行される関数
function ButtonClickFunc(){
	// Flash のエレメントを取得
	var swf = DocumentGetElementFromName("swf_test");
	if(swf){
		// 外部に公開した関数を実行
		var value = swf.asFunc3();
		alert(value);
	}
}

function DocumentGetElementFromName(name) {
	var obj;
	if (navigator.appName.indexOf("Microsoft") != -1)	obj = window[name];
	else	obj = document[name];

	if(!obj)	return null;
	if(obj.constructor == HTMLCollection)	return obj[0];
	return obj;
}
//-->
</script>

</HEAD>
<BODY>
	<input type="button" value="JavaScript 実行" style = "width:100%; height:50px;" onclick = "ButtonClickFunc()"><BR>
</BODY>
</HTML>
 
■JavaScript から Flash の関数を使用する際の注意点
 
Flash側の関数がすぐに実行可能だとは限りません。
 
Flash 側の読み込みが完了していなかったり、初期化が完了していない場合などが考えられます。 Flash側の準備が整ったか確認してからメソッドを呼び出します。
 
JavaScript と ActionScript は同期的に実行されます。 JavaScript 側で ActionScript の関数を呼び出すと、ActionScript 側の関数が終了するまで JavaScript は停止します。
 
 




JavaScript 実行に関するサンドボックスについて
 
 


■スクリプト実行許可の設定
 
HTMLタグに allowscriptaccess パラメータを追加します。 この設定により JavaScript の実行を許可することができます。
 
ローカルで動作させる場合は、"always" に設定する必要があります。
 
デフォルトだと、"samedomain" となります。
 
文字列 効果
always スクリプトの実行を常に許可(別ドメインでも許可)
samedomain 同じドメイン内に Flash と HTML が置かれている場合のみ実行を許可
never 実行できない
 
設定例です。
 
HTML タグに JavaScript 実行許可を設定する

<html>
<body>

<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" width="550" height="400" id="test" align="middle">
<param name="allowScriptAccess" value="always" />
<param name="movie" value="test.swf" />
<param name="quality" value="high" />
<param name="bgcolor" value="#ffffff" />
<embed src="test.swf"
	quality="high" bgcolor="#ffffff" width="550" height="400"
	name="test" align="middle" allowScriptAccess="always"
	type="application/x-shockwave-flash"
	pluginspage="http://www.macromedia.com/go/getflashplayer" />
</object>

</body>
</html>
 
■ローカルで JavaScript を実行する場合
 
ユーザーが「グローバルセキュリティ設定パネル」で、swf ファイルを信頼できるファイルとして登録している場合、 ローカルで JavaScript は動作します。
 
信頼できるファイルとして登録
 
ユーザーが「グローバルセキュリティ設定パネル」で「常に許可」以外を選択している場合、ローカルで JavaScript は動作しません
 
常に許可を選択していない
 
ユーザーが「グローバルセキュリティ設定パネル」で「常に許可」を設定していて…
 
常に許可を選択して…
 
「パブリッシュ設定」の「ローカルでの再生に関するセキュリティ」を「ローカルファイルにのみアクセスする」に設定していて…
 
「ローカルファイルにのみアクセスする」を選択して…
 
スクリプト実行許可の設定を "always" に設定している場合は、JavaScript は動作します。
 
HTML タグに JavaScript 実行許可を設定する

<html>
<body>

<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" width="550" height="400" id="test" align="middle">
<param name="allowScriptAccess" value="always" />
<param name="movie" value="test.swf" />
<param name="quality" value="high" />
<param name="bgcolor" value="#ffffff" />
<embed src="test.swf"
	quality="high" bgcolor="#ffffff" width="550" height="400"
	name="test" align="middle" allowScriptAccess="always"
	type="application/x-shockwave-flash"
	pluginspage="http://www.macromedia.com/go/getflashplayer" />
</object>

</body>
</html>
 
■サンドボックスタイプを確認する
 
サンドボックスタイプを取得したい場合は、System.security.sandboxType プロパティを使用します。 ブラウザなど各環境上で確認します。
 
文字列 効果
remote インターネット上で動作しています。
localWithFile ローカル上で動作しています。
「ローカルファイルにのみアクセスする」が選択されています。
localWithNetwork ローカル上で動作しています。
「ネットワークにのみアクセスする」が選択されています。
localTrusted 信頼できるファイルとして「Flash Player 設定マネージャ」か、"FlashPlayerTrust" 構成ファイルにより登録されています。
 
取得例です。
 
サンドボックスタイプを取得する

import flash.text.TextField; 

var tf:TextField = new TextField();
addChild(tf);

tf.border = true;
tf.x = 10;
tf.y = 10;
tf.width = 400;
tf.height = 30;
tf.text = Security.sandboxType;
 
 



HAKUHIN's home page バナー http://hakuhin.jp/
(c) Hakuhin & 日新礼符 2002-2011 解像度1024×768以上 IE8.0以上推奨
/ 閲覧中: