当サイトでも、至る所でAdobe Flashを利用して動的な表示を行っています。
実は少し前より、トップページにある画像をぐるぐる表示させるFLASHが正常に動作しなくなってしまう問題に悩まされおりました
表示されないのは、最新版のGoogle Chrome
実はちょっと前は問題なくGoogle Chromeでも動作していたのだが最近になって動作不良になったもの
症状としては、フレームなどは表示され画像のロードが終わった瞬間に動作が停止してしまう。
この症状、現在のところ僕の環境では Google Chrome でのみ発生する事象でほかのブラウザでは発生しない。
さらに追求していくと、 Google Chrome の問題ではなく、Google Chromeに内蔵されているAdobe FLASH Player 11に問題があることがわかった
Adobe FLASH Player 11はちょっとまえから結構問題発生していたりする
有名なところではニコニコ動画やYou Tubeが正常に再生されなくなるなどの問題が発生し、多くのユーザーが頭を抱えさせた
現在有力な解決方法は、FLASH Player を 11 から 10 に下げること。
ってこれ・・・ 僕の中では解決方法ではないと思う
だって、Playerのバージョンを下げるの面倒だもの。
ニコニコ動画や、You Tubeのためならまだ多少の手間もかけるだろうけどねぇ・・・
原因
まぁ、そんなこんなで作り方で解決できないかとおもって自分のソースコードからやっと問題点を発見
空のムービークリップを配置して画像を loadClip でロード。
そのムービークリップの onEnterFrame イベントを捕まえてスクロール処理のプログラムが組まれています。
どうやらこの onEnterFrame イベントが延々発生しないみたい。
onEnterFrame イベントが発生しないとフラグが立たないのでここで動作が止まってしまう。
対策
実は対策はなんてことはない。
要は、画像の読み込まれるムービークリップの性質が変化してしまう。
画像を読み込んでいるムービークリップなどがあればそれを入れ子のムービークリップにしてしまうことで解決できる。
変更前のソースコードなこんな感じだとする
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | createEmptyMovieClip("th0", 0); load_obj.onLoadInit = function( clip:MovieClip ) { //一旦、画像を非表示にしておく clip._visible = false; //読み込みが完了した総数を更新 loaded_cnt++; }; // エラー発生時の処理を定義 load_obj.onLoadError = function() { }; // 画像をムービークリップに割り当て load_obj.loadClip( path, this.th0 ); // FLASH Player 11 ではこのイベントが取得できなくなる this.th0.onEnterFrame = function() { // イベントの内容 } |
上記のコードを下記のようにムービークリップを入れ子とする
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | createEmptyMovieClip("th0", 0); th0.createEmptyMovieClip("thp0", 0); load_obj.onLoadInit = function( clip:MovieClip ) { //一旦、画像を非表示にしておく clip._visible = false; //読み込みが完了した総数を更新 loaded_cnt++; }; // エラー発生時の処理を定義 load_obj.onLoadError = function() { }; // 画像をムービークリップに割り当て load_obj.loadClip( path, this.th0.thp0 ); // FLASH Player 11 でも動作する this.th0.onEnterFrame = function() { // イベントの内容 } |
単純にcreateEmptyMovieClip でムービークリップを作成し、さらにそのムービークリップの中に読み込み用のムービークリップを作成する。
画像は入れ子となったムービークリップの中にロードすることで、親のムービークリップでは正しく onEnterFrame イベントが発生するため正しく動作するようになる。
解決してみればどうってことはないんだけど、なかなか原因がわかりにくいものでこれを突き止めるまで丸一日かかってしまった
だって、Adobe FLASH CS5では、正常にパブリッシュして動作してしまうのだもの
そりゃFLASH Player 10だから当たり前なんだけどね 。
この現象ちょっとググってみたけどまだどこでも載っていないみたい。
ってか、みんなこんな作り方していないのかな?
それとも、こんな程度でハマるの僕だけ?
いずれにしても Adobe も高いソフトウェアなんだからしっかりとその辺サポートしてほしいものですよねぇ。
Player のバージョンによって互換性がなくなるのは一番困る。
今回は僕がたまたま最新のFLASH Playerを目にする環境だったからよかったようなものの、気がつかなかったら完全に後手に回っていたもんなぁ。
何にしても解決できてすっきりしました