Safari で ExternalInterface を使うときは this に気をつけないと無限ループ
以下のサイトを参考に、JavaScript から ActionScript のコードを呼び出そうとしている。
以前、haXe で遊んでたときは組み込みの JavaScript インターフェースを使っていたので、ExternalInterface を使うのは初めて。
document["as"].callFlash();
サンプルどおり、こんなふうに呼び出すのは問題ない。だが、もうすこし汎用的にしようと思って、以下のようなクラスを試しにつくってみた。
var SWFInterface = Class.create();
SWFInterface.prototype = {
initialize: function(name) {
this.name = name;
},
call: function(iname) {
var embed = document[this.name];
if (embed) {
var fn = embed[iname];
alert(fn());
}
}
};
だが、このクラス経由で呼び出すと Safari が反応しなくなってしまった。
new SWFInterface("as").call("callFlash"); // Safari が反応しなくなる
どうやら、呼び出す関数の this
は embed
要素に束縛しないといけないようだ。
call: function(iname) {
var embed = document[this.name];
if (embed) {
var fn = embed[iname].bind(embed);
alert(fn());
}
}
というか、この方法は Mac の Firefox で動かない。ActionScript を呼び出す関数オブジェクトを取得できないようだ。