expandimage.jsがSafari for Winに冷たい件2008年03月02日 05時01分54秒

このブログのサイドバーに「最近のブックマーク」というのを貼っている。自分のtumblrのlinkのみをjson apiで抽出して並べる、というものだ。

で、だいたいtumblrにlinkをpostするときは、何についてのページなのかを忘れないように引用をつけたりしていて、「最近のブックマーク」ではその部分の表示をトグル切り替えするようにしている。

さて、本題。

なんとなくのノリで、「最近のブックマーク」をちょっと調整していたのだが、Safari for Winではトグル切り替えがまったく動作しない。

「最近のブックマーク」の独立版であるこちらのページは問題なくトグル切り替えができているし、他のブラウザでも特に問題がない。

トグル切り替え部分のイベント登録には、prototype.jsのEvent.observe()を使っているのだが、そこに登録しているイベントハンドラで、UAがSafariだった場合にalert()するデバッグコードを仕込んだところ、これも実行されない。どうやらEvent.observeでのハンドラ登録がうまくいっていないようだ。

手持ちのSafari for WinはDebug メニューを有効にしてあるので、JavaScript Consoleを表示したところ、

TypeError: Value undefined (result of expression this.attachEvent) is not object.
http://s.asablo.jp/js/expandimage.js  Line: 49

というエラーがでていた。おまえが原因か!

この「expandimage.js」、アサブロの画像表示周りのスクリプトらしい(自分ではあまりアサブロに画像登録をしていない。外部に置いてそっち参照させるので)のだが、この49行目前後を見てみると、

48: HTMLElement.prototype.addEventListener = function(name,func,dir) {
49:  this.attachEvent(name, func);
50: }
 
ってなコードになってる。このHTMLElement.prototypeのメソッド定義は
if (! (document.body && document.body.insertAdjacentHTML) || asablo.noHTMLElement) {

という条件を満たした場合に実行される模様。んで、これらの条件を満たした場合は、
  • HTMLElementオブジェクトが存在しない場合は定義する
  • HTMLElement.prototype.insertAdjacentHTMLの定義
  • HTMLElement.prototype.addEventListenerの定義
を行うと。

...ちょっとひどくないか?

上記の処理の対象となるのは

  • document.body.insertAdjacentHTMLがないブラウザ(=Firefox、Safari)
  • asablo.noHTMLElementがtrueなブラウザ(=IE)
のどちらかの条件に当てはまる場合で、どちらにも当てはまらないのはOperaのみなんですけど。

幸いというか、IEでのinsertAdjacentHTMLの定義はDOMとは無関係なダミーのHTMLElementに対して行われるため問題が起きず、FirefoxでのaddEventListenerの定義は他のDOM要素に(なぜか)影響を与えていないのだが、SafariはがっつりとaddEventListenerの上書きの影響をこうむっちゃっている

こういう処理はもうちょっと丁寧に状況分けしないとまずいでしょ。

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

名前:
メールアドレス:
URL:
コメント:

トラックバック

このエントリのトラックバックURL: http://dara-j.asablo.jp/blog/2008/03/02/2682068/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。

_ 常山日記 - 2008年03月02日 15時43分31秒

公開鍵暗号方式の誤り解説の氾濫をそろそろどげんかせんと iJailBreakが1.1.4に対応 リマインダー機能つきのオンラインブックマーク『netRocket』リマインダー機能つきのオンラインブックマーク『netRocket』 スリープ+休止状態を上手に管理「SmartSleep.prefPane」 expand