2008
1029

FlashとJavaScriptを連携するExternalInterfaceでハマる

今制作中のサイトで少し変わったナビゲーションを実現させるために、ActionScriptからJavaScriptをのFunctionを呼び出したり、逆にJavaScriptからActionScriptのFunctionを呼びだすというような処理を多用するものを作っています。
それを実現するためにはActionScriptのExternalInterfaceを使うのですが、それでかなりハマってネットで検索しても同様の情報がなかったのでメモしておきます。

症状

以下のようなコードで、Flash Playerのバージョン9.0.48以前+IE 6/7の組み合わせの場合のみ、SWFを配置しただけでJavaScriptエラーが発生してExternalInterfaceの機能が全く動かなくなります。

ActionScript(2.0)例

//TextFieldを作る
var greetingText:TextField = this.createTextField("greeting",this.getNextHighestDepth(),0,0,100,100);

//JavaScriptから呼びだしてTextFieldの内容を変える
function changeText(t:String) {
	greetingText:TextField.text = t;
}
//ActionScriptのFunctionをJavaScriptから呼びだせるように登録
ExternalInterface.addCallback("extChangeText", null, changeText);

HTML例

<div id="Alternative-Content">コンテンツ</div>
<a href="#" onclick="callASFunction()">ActionScript実行</a>

JavaScript例

//SWFObjectでSWFを配置
swfobject.embedSWF("/flash/navi.swf", "Alternative-Content", "800", "200", "8.0.0", false, {}, {wmode:"opaque",allowScriptAccess:"always"}, {id:"Navi-SWF"});

//ActionScriptを実行するためのFunction
function callASFunction() {
	var swf= document.all? window["Navi-SWF"] : document["Navi-SWF"];
	swf.extChangeText("Helllo!");
}

原因

SWFObjectで配置している「{id:"Navi-SWF"}」の部分が問題でした。
Flash Player 9.0.48までのバージョン+IE 6/7(8や5.5以下は試してない)の組み合わせの場合は配置するObjectのIDにハイフン(-)が使えないようです。
Flash Player 9.0.115 以降だと同じコードで問題なく動きます。
これは同じくExternalInterfaceを使っているSWFAddressを使った場合にも発生します。
試してませんが、SWFObjectを使わず配置する場合でも同様のことが起こるかもしれません。

対策

SWFを配置するときのIDにはハイフンを使わないようにしましょう。

コメント

Comments

トラックバック

TrackBacks

TrackBack URL : http://www.starryworks.co.jp/mt/mt-tb.cgi/43