2008年04月02日

Operaで、Ajax.Requestがうまく動かない?

マチウケメール便で画像を読み込む処理にPrototype.jsのAjax.Requestメソッドを使っているのですが、なぜか現行のOpera(9.25)ではエラーになってしまいました。request.responseTextも空っぽ。URLが間違っている風。
でもOperaベータ版の9.5は大丈夫だし、Firefox、古いIE6なども問題なし。

調べてみたらちゃんと原因がありました。CGIからHTML::Templateで出力しているページなので、<base>タグを使っていたんですが、Operaの9.5より前のバージョンではJavaScript内(詳しい範囲はちょっと不明)で<base>タグによる指定が無効になってしまうようです。
http://dev.rubyonrails.org/ticket/9373

つまり、HTMLで<base href="http://example.com/cgi/">と指定してあり、JavaScriptでAjax.Request('./test.cgi'...などとやっていたので、「http://example.com/cgi/test.cgi」へリクエストを送るのが正しいんですが、これが9.5より前のOperaでは<base>タグが無視され「./test.cgi」へ送信してしまうようです。結果、そもそもURLが間違っているのでレスポンスも空っぽみたいな。
自分はOperaユーザーなんですが、9.5をメインで使っているため気がつきませんでした。もっとも、そもそも<base>タグを使っていなければ発生しない問題なので、普通はほとんど問題にならないのかも。

9.5が正式版としてリリースされるまでの対策として、下記のようなコードを書きました。Prototype.jsのブラウザ判定を使っているので、Prototype.js 1.5.1以上が必要です。

url = './test.cgi';

// Opera 9.5 より前のバージョンではbaseタグが無効になるのでその対策 
if (Prototype.Browser.Opera && opera.version && (opera.version() < 9.5))
  url = $$('base')[0].readAttribute('href') + url;

new Ajax.Request(url, ...以下略

ウザイですが、これでOpera9.25でも動きます。シェアの少ないOperaなんて無視したいところですが、なにしろ自分が使ってますしね(^^;

関係ないですが、最近はOpera9.5より、SafariやFirefoxの方が体感速度はぜんぜん早いし、OperaはCSSやJavaScriptの挙動も正しいみたいなイメージも崩れてきて、Operaユーザーとしてはさびしい限りです。9.5の正式版で巻き返して欲しいですね。

この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバック