Safari で ExternalInterface を使うときは this に気をつけないと無限ループ

2007/11/06 3:23am

以下のサイトを参考に、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 が反応しなくなる

どうやら、呼び出す関数の thisembed 要素に束縛しないといけないようだ。

call: function(iname) {
    var embed = document[this.name];
    if (embed) {
      var fn = embed[iname].bind(embed);
      alert(fn());
    }
  }

というか、この方法は Mac の Firefox で動かない。ActionScript を呼び出す関数オブジェクトを取得できないようだ。