BLOG.QuelLENcode

Portrait

ソフトウェア・Linux・好きなモノ・日々のこと

 
 

[Web]gifアニメにonload属性を設定するときの注意点

4月 05 2011
8

こんにちは、もざみみです(*・x・)
今日はJavascriptとIEのアレな話を書こうと思います。
これでハマってしまったので、同じようなところでハマる人のために。

まず、こんなHTMLコード(onload_test.html)を書きます。
(読みづらくてごめんなさい)

  1. <!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”>
  2. <html xmlns=“http://www.w3.org/1999/xhtml”>
  3.   <head>
  4.     <meta http-equiv=“Content-Type” content=“text/html; charset=utf-8” />
  5.     <meta http-equiv=“Content-Script-Type” content=“text/javascript” />
  6.     <script type=“text/javascript” src=“script.js”></script>
  7.     <title>画像のonloadテスト</title>
  8.   </head>
  9.   <body>
  10.     <img src=“anime.gif” alt=“アニメーション” onload=“Hoge();” />
  11.   </body>
  12. </html>

このソースのミソは以下の点です。

では、次にロードするJavascriptファイル(script.js)を見てみましょう。

 

  1. /* gifアニメのonloadテスト */
  2.  
  3. function Hoge()
  4. {
  5.     alert(”(*・x・)ウサ!”);
  6. }

Hoge()自身は、単純明快、単にアラートを表示させるだけです。

さて、onload_test.htmlをFirefoxに食わせてみましょう。

firefox

アラートが1回表示され、OKボタンで消した後は二度とアラートが表示されることはありません。なぜなら、onload属性は、画像がロードされたときに実行されるメソッドを指定するモノだからです。

では、Google Chromeでも試してみましょう。

chrome

よしよし期待通り。ちなみに、Opera10でも同じような挙動でうまくいきました。

次はIE8、行ってみましょうか。

ie8

……………………アラート大爆発。
IE9βでもキッチリ大爆発してくれました。

実際に実行してもらうとわかると思いますが、どうやらgifアニメの再生が1周するたびに、Hoge()が呼ばれているようなのです。

つまり、
どうやらIE8とIE9βは、Quirksモード(IE5と同じ挙動を実現するモード)で動かすと、gifアニメの再生が終わるたびにonloadイベントが発生するみたいなのです。
イマドキ、Quirksモードでレンダリングさせることは滅多にないとは思いますが、これを知らなかったら見事にハマること請け合いです。

もちろん、QuirksモードじゃなくてちゃんとDOCTYPE宣言書いて、ちゃんとしたモード(Standardモード)で動かすなら、FirefoxやChromeのような挙動になってくれるから大丈夫です。

ただ、問題なのは、Windows7のガジェットのバグ(?)なんですね…
Windows7のガジェットは、実はIEでレンダリングしたHTML+CSS+Javascriptを、ガジェットの枠内に表示させているだけなのです。
つまり、Webアプリを作る感覚でガジェット作りができるということです。

ただ、これがクセモノで、ちゃんとXHTMLのDOCTYPE宣言を書いているにもかかわらず、gifアニメが1周するたびに律儀にonloadをお発行してくださるのです。
このときに書いたバグは、まさにコレが原因でした。

やっぱりIEは一筋縄ではいかない、ワガママな子です..
だがそれが.. よくない(*;x;)!