AjaxとIf-Modified-Since
Ajaxをやって最初にはまるのは,やっぱりキャッシュ問題.
IEでは,同じURLに対してリクエストすると,必ずキャッシュが返ってきてしまう.
サーバ上の特定のコンテンツを,更新があるかチェックしようとすると,時刻とかをURLの末尾に付けて,URLをユニークにしてあげる必要がある.
でも,そうしてしまうと,常に毎回コンテンツ全体を読み込んでしまって効率が悪い.
AjaxでもIf-Modified-Sinceが効けば良いんだけど,効かないようなので自前でやるしかなし.
調べてみると,すでに同じ事をやっている方がいた.
[Ajax tips] XMLHttpRequest と If-Modified-Since
prototype.jsのラッパも公開していたけど,これはファイルが無くなっている模様.
というわけで,記事の方を参考にさせてもらいつつ,jquery.js にパッチを当てた.
ただ,コンテンツ自体をキャッシュするとメモリを消費するので,その辺は変更して,コンテンツのキャッシュはしないようにしてみた.
また,IE,Operaは素直に動くのだけど,Firefoxはブラウザ側でキャッシュをしてくれるようで,サーバが304を帰しても,JavaScriptの方にはキャッシュされたコンテンツを200ステータスで返す模様.
記事の方は常に本体を返す形だから問題なかったんだろうけど,こちらのは変更なしならそれを知りたい.
そこで,Last-Modified時刻を比較して,判定するようにして回避.(完璧ではないけれど)
更新なしを知りたいのは,更新があったときだけ,highlight fade とかで目立たせたり,変更内容に関する処理を実行したい場合がありそうだったから.
で,パッチをMLになげてみたら,数時間でSVNにマージされた.早っ.
MLを見ていると,作者のJohnさん一人でかなりがんばっている模様.
それにしても対応が早い...
改良のペースが速いので,今後が楽しみ.
新Ajaxルーチンのデモは以下の場所に.
jqueryの最新のSVN版を使ってます.
http://pepper.sherry.jp/jquery/newajaxfunc.html
prototype.jsとかは,この辺は標準装備されていないので,標準装備したjquery.jsはちょっと有利?かも?
Comments