[Flash] ExternalInterface の個数制限
ExternalInterface
フラッシャーな方は良くご存知だと思いますが、Flash には ExternalInterface というクラスがあります。ブラウザ側のスクリプト (JavaScript) と ActionScript を接続するためのクラスですね。
先に結論を書くと、IE 6,7 では、ExternalInterface で JavaScript 側に公開できるメソッドの数が 1000 個に制限されることが分かりました。…滅多に 1000 個も公開することないと思いますけどwww
以下実験内容です。
IE だけ動作がおかしい?
JavaScript で Flash の機能をできるだけ沢山いじれるような環境を作ろうと思って、こないだからひたすら大量に Flash のメソッドを ExternalInterface を使って JavaScript 側に公開してたんですが、
http://hikipuro.is-a-geek.org/slipper/
作ってる途中で、なぜか IE だけ動作がおかしくなってしまいました。
ちなみに ExternalInterface を使って、外部にメソッドを公開する時のコードはこのようなものです (ActionScript)。
ExternalInterface.addCallback("foo", bar);
↑ ActionScript の bar() メソッドを、JavaScript から "foo" という名前で呼べるように設定しています。
エラーを探る
Firefox(2|3) ・ Opera ・ Safari で動かすと問題なく動いています。
Firefox のエラーコンソールで見てみても、JavaScript のエラーは出ていませんでした。
なぜ IE だけ動かないんだろう。と思って、IE 側でエラーが出ている行にある ExternalInterface のメソッドを単純に alert で出して確認してみました。
var flash = document.getElementById("FlashのObjectタグのID");
alert(flash.hoge);
すると undefined になっていました…。
さっきまで動いてたものが undefined とは出ないだろう。これはもしや ExternalInterface に個数制限があるのか?と思って、外部に公開されているメソッドの数をカウントしてみると、1400 個ほどになっていました。
ActionScript 側で最初に外部公開した1個目のメソッドを同じように alert で出力してみると、きちんと関数定義されているような内容が出てきました。
エラーが起こった箇所にある外部公開メソッドと、うまく動いてそうな最初のメソッドとの間のどこかに突然 undefined になるポイントがあると思ったので、バイナリサーチ的にw、半分そのまた半分…という感じで調べていくと、ちょうど 1001 個目の箇所で undefined になることが分かりました。
(ここでの「順番」は、ActionScript 側から ExternalInterface.addCallback を呼び出した順番を指しています。1001 回目以降の呼び出しで公開しようとしたメソッドが単純に無視されるようになっているみたいです。)
まとめ
・IE 6、 IE 7 では ExternalInterface による外部公開メソッドの数が 1000 個に制限されます。
(8 ではまだ確認できていません。)
・他のブラウザではこの制限は無いようです。
(Firefox2、Firefox3、Opera(最新版)、Safari(最新版) で確認しました。)
今回調べたのは JavaScript から ActionScript のコードを呼び出す場合のものだけです。ActionScript から JavaScript を呼び出す場合については検証できていません。
参考リンク
・IE + Flash、ExternalInterface、ブリッジとなるスクリプトのソース、不具合 - RapidShare
http://d.hatena.ne.jp/brazil/20061030/1162167927
ExternalInterface を IE 上で使った時に埋め込まれる JavaScript コードみたいです。
ここで紹介してくださってる感じでは、個数制限があるのかどうか分からないですね。
他の部分で制限がかかってるのかな。
2009/07/08 追記
どうやら IE8 でも ExternalInterface の 1000 個制限があるようです。
タグ : Flash ExternalInterface



