Sep 22, 2006

SafariのAjaxの文字化けをクライアント側だけで対応するバッドノウハウ

SafariでXMLHttpRequestのresponseTextが文字化けするという話。
http://blog.33rpm.jp/garbled-on-safari.html

最近のバージョンだとcontent-typeがちゃんとしてれば化けなかったような記憶があるけど、まあともかくとして、Safariで文字化けするのはJavaScript側だけで対処することができたりする。
http://kawa.at.webry.info/200511/article_9.html

これ読んでほんとかよ、って感じだったんだけど案外役に立った。livedoor Readerで使われてたり。
実際に使われてるコードはこんなの。
if(browser.isKHTML){
    ajax.filter.add(function(t){
        var esc = escape(t);
         return(esc.indexOf("%u") < 0 && esc.indexOf("%") > -1) ? decodeURIComponent(esc) : t
    })
}

ブラウザがSafariの時だけresponseTextにフィルターを適用するようになっている。
直し方わかってんなら直せよ、ってことで、このブログのナビゲーションのやつも直してみた。
var ajax_filter = function(t){return t};
if(navigator.appVersion.indexOf( "KHTML" ) > -1){
    ajax_filter = function(t){
        var esc = escape(t);
        return(esc.indexOf("%u") < 0 && esc.indexOf("%") > -1) ? decodeURIComponent(esc) : t
    }
}

こんなん書いてresponseText処理する前にはさんだ。

ブラウザ依存の処理を書くときは関数内で細かく処理を振り分けたりしないで、そもそも関数自体全く別のものに切り替えてしまう、ってのが好き。そうすると他のブラウザで余計な分岐処理を通らずに済む。この場合だと振り分け部分のコストは全然たいしたこと無いけど、DOM参照したりすると大したことあったりする。

ってのがここら辺に書いてあったりする。
http://dean.edwards.name/weblog/2005/12/js-tip1/
Posted at 01:11 | WriteBacks (24) | Edit
Edit this entry...

wikieditish message: Ready to edit this entry.
















A quick preview will be rendered here when you click "Preview" button.