Firefox4.01の話で既にアップデートされている方が多いかもしれませんが、私は仕事柄、昔のバージョン4を検証用に使っていてはまったので、メモ。
表題のとおり、Windows7版Firefox4でFlashのExternalInterface.callでalertを出すとフリーズしたのが地味に検証をしていて邪魔だったのですが、これまた検証中に解決方法を偶然発見しました。
なお、先ほどアップデートしてFirefox6にしたら解決したので最新バージョンでは解決している可能で高いです。
症状
Windows7 Firefox4.01でFlashでExternalInterface.callをしJavascriptのalert関数を出すとFirefoxが操作不能になる。
具体的には、
btn.addEventListener( MouseEvent.CLICK , function(ev:MouseEvent){ ExternalInterface.call( "alertFunc" , null ); });
というFlashのコードで、HTMLに書いてある
<script type="text/javascript"> function alertFunc(){ alert( 'alertFunc' ); } </script>
というJavascriptを実行するとフォーカスが奪われるのか操作不能になります。こんな単純なコードなのに。。。
操作できないのでタスクマネージャーでタスクを終了しかなくなってしまいます。
なお、IE8,Chromeでは問題なく動きました。
これは困る
普段閲覧しているときに操作不能になっても困りますが、普段のコンテンツでわざわざJavascriptのアラートに頼るケースは少ないので、まだいいです。
しかし、検証している際に、困る。ちょっとした挙動を確認するときにalertを使うたびに操作不能でFirefox再起動されていると検証速度の低下に著しく影響が出ます。
余裕があれば、ちゃんとalertでなくconsole.logでの対応をするんですけどね。
解決方法
というわけで、解決方法。
偶然にJavascriptの呼び出すコードによって、うまくいったりうまくいかなかったりしたため、内容の違いを突き詰めてみたところ、以下の解決方法を見つけました。
それは、、、Javascript側でsetTimeoutで遅らせて実行すれば操作不能にならなくなりました。
こういうことです。
<script type="text/javascript"> function alertFuncDelay(){ setTimeout("alert('alertFuncDelay')", 1); } </script>
Flash側は特に対応する必要は無く、alertFuncDelayにcall先を差し替えてやれば解決です。
え、、、これ、Firefox6で解決してるからいいけど、それまではsetTimeoutにイベントきっかけを全部書き換えだったわけですか・・・。
サンプルも置いておきます
一応、サンプルも置いておきます。
症状としては以下のようになります。あくまで、Windows7 Firefox4.01で検証したものです。
Firefox6では解決しています。
と、解決方法も見出せたのですが、冒頭の通り、その後Firefox6にアップデートしたら無事修正されています。閲覧の妨げになるバグなのですぐに対応したようです。よかった。
こういったバグはそんなに起こりえないと思いますが、FlashPlayerとFirefoxのバージョンの組み合わせで以後のバージョンアップでも急に起こったりしそうなので覚えておこうと思います。
それではよいFlash Lifeを。