トップ «前の日記(2007-03-05) 最新 次の日記(2007-03-13)» 編集

2007-03-09 [長年日記]

_ JavaScript で Safari 1.3 除け

※ Safari と書く際にバージョン番号を抜いちゃう人は IE 5, 5.5, 6 が混在していた時期や Netscape 4 と 6 が混在していた時期のいやらしさ、あるいは WinIE と MacIE の信じられない挙動の違いなどを知らない幸せな人か、または忘れちゃった幸せな人に違いないと自分は思っている。省略するな! 全然ベツモノなんだよ! お前は IE 6 と 7 の違いも無視すんのか!?

えー今回は Safari 1.3 のお話。

JavaScript を書く際に window.onload にあれこれ処理をつけていくのはよくある話だと思うのですが、この onload event、中を覗いてみたことありますか?

いやね、あたしゃ知らなかったんですよ。

Safari 1.3 と WinIE*1 では onload event の中に event の発生した target(IE では srcElement)が存在しない

んです。な、なんだってー。

じゃあお前どこでそのイベント拾ってきやがったんだ。言ってみろコノヤロー。子どものお使いじゃねーんだぞ、ちゃんと報告しなさいよ、報告を。このアメ玉誰にもらったの? 知らない人? 知らない人から食べ物もらっちゃダメって言ってるでしょ!

えー。

コトの起こりは Safari 1.3 の event がイベントハンドラをセットしたオブジェクトとなんかちょっと違うオブジェクトを抱えて持ってくるという、お前はなんのコントだ状態の変なバグに遭遇したことでした*2

悩んだ末、いっそ Safari 1.3 は無視しちまおうと思って*3 event をあれこれ調べてるうちに onload event はもっとはっきり変だよ! やった! この段階で無視できるよ! と思って trap を設置したら隣で WinIE が引っかかったよorz

お前もか!

ってね。しょうがないんで target を持ってなくても WinIE 独自のプロパティを持ってたら ok を出すことにして解決とあいなりました。

( evt.target || evt.srcElement || evt.boundElements )

だったかな。なんかこんな感じです。確認したい人は適当に補完してやってみてください。と言っても Safari 1.3 が手元にないと確認できないので多くの人には意味のない情報ですけど。

ところで、WinIE はなぜ window.onload イベントで window.scroll が効かないのでしょうか。不思議ですね。ごきげんよう。

*1 6, 7 で確認

*2 イベントハンドラの書き方によっても挙動は違うのかもしれないけど、今回はそこまで深く追求していない。

*3 当然 JavaScript を切ってもユーザーは困らないようになってますよ。