jQuery の $.getJSON() と IE ではまった
今つくっているサイトでは,html のエンコーディングを Shift_JIS にしてるんで,合わせるために JavaScript のエンコーディングも Shift_JIS にしてます(jQuery だけは念のため UTF-8 指定してますけど)。
で,そこで JSON データをやりとりしているんですが,全部 Shift_JIS に統一していたんで,
- Content-Type: text/javascript; charset=Shift_JIS
な JSON を吐くようにしていたんですが,どうも IE 6 で挙動が安定しない。
初回の Ajax ネゴのときにはうまくいっても,そこからブラウザで「進む」「戻る」してもう一度 Ajax ネゴると文字化けしたり,初回の Ajax ネゴから文字化けどころかまったくやりとりできなかったり。
うーむ,と思ってネットをいろいろあさっていたら,
な記事を発見したんですが,元サイトがリニューアル中で何が書いてあったか不明。気になる〜。
じゃあってことで元ネタを探してみたらちょっと古い記事ですが,
というのを発見。JSON の Content-Type を text/html で返すと危ないよ,とのことですけど,頭がわるいので,この記事の前半と後半(exploit)のつながりがいまいちわからない。
ともあれ,text/javascript というのは obsolete ですか。でも RFC がどうこういっても実際の実装はブラウザによりけりですよね。と思いもちょっとたぐってみると,これもちょっと昔の記事ですが
このサイトを合わせて見ると,Opera 8.5 だと text/x-javascript がベターぽくて,(当時の)Safari のことを考えると charset 指定はしたほうがいいっぽい。
ということで,x-javascript にしようかとも思ったんですが,結局,文字化けがらみだし〜ということで
にしてみました。実質文字コードを変えただけです。
一応 IE で安定したっぽいし,Opera 9.23 だとこれでも OK でした。Safari 2.x でも OK。
結論。コンテンツを Shift_JIS に統一していても少なくとも JSON データの charset は UTF-8 のほうが無難?
ちなみに jQuery を読解してみたら,json のパースは eval を使っているぽい。JSONP でなければまぁ eval でも構わないというかサーバアプリサイドの責務にしちゃってもいいかなと私も思います。
おまけ:やはり jQuery と IE ではまったところ
<select id="hoge"> <option>hahaha</option> <option>fufufu</option> </select>
みたいな html で,
$('#hoge').val('fufufu');
とすると,Firefox / Opera / Safari だとうまく選択されるのに,IE だとブランクになってしまいます。
面倒でも
<select id="hoge"> <option value="hahaha">hahaha</option> <option value="fufufu">fufufu</option> </select>
みたく value を指定しておかないとだめでした。