Safariと画像オブジェクトのonloadイベント
SafariのJavaScript不具合ではまってしまったことがあります。画像オブジェクトでonloadイベントやonerrorイベントが正しく動作しないのです。
のようなシンプルなプログラムがあったとして、このabcd.gifが存在しなければ、onerrorイベントが発生して、「画像読み込み失敗」とアラートが表示されるはずですが(もちろん、実際の運営では、アラートを出したところで何の意味もなく、実際には、画像の読み込みに失敗した場合には代替画像を表示させたりするのが目的です。)、Safariでは、「画像の読み込み成功」と表示されます。Safariでは、この時、onerrorイベントは発生せず、必ずonloadイベントが発生します。
--- 2007年6月16日20時50分ごろ追記start ---
この不具合は、2007年6月にリリースされたSafari 3.0 Betaで修正されました。Windows版、Mac版ともに確認しました。
--- 2007年6月16日20時50分ごろ追記end ---
ですから、この方法で画像の読み込みを判定するようにすると、Safariでは思わぬ結果になります。対策としては、2つあります。
一つは、IMGタグの中に直接JavaScriptを埋め込むことです。
とすれば動きます。
また、document.createElementを使った場合も、正しく動作します。
このSafariの不具合の原因は何なのでしょうか? こちらのような画像読み込みテスト・ページを作成してみました。
抜粋しますと、
のようになります。alertだといちいち煩いので、document.myForm.message.value=~;として、テキストエリア内に表示するようにしてあります。
このtry ~ catch のところでSafariはエラーがcatchされています。そのエラーメッセージは、「No defauly value」となっています。画像オブジェクトを参照しようとしただけでです。IE6なら[object]、FirefoxやOperaなら[object HTMLImageElement]となるところなのですが・・・。
さらに、alert(img);とすると、ちゃんとSafariでも「object Image」となりますから、余計に意味が分かりません。
このサンプルテストでは、ちなみに、
IE6
Firefox、Opera
Safari
となります。Safariで「画像オブジェクトの読み込み成功」となってしまう理由を検証したのが、本稿です。
| 固定リンク


コメント