<<戻る

日記 intime o'

Ajaxでキャッシュを利用させない - JavaScript 2010/1/10(Sun.)
Ajaxの話。

例えば"file.txt"をAjaxで同期なり非同期なりで読み込み、responseTextを表示する
index.htmlがあるとする。file.txtの中身を更新してindex.htmlを更新したつもりで
いるとすると、資本主義に裏切られた。即ちキャッシュである。ブラウザは一回
file.txtを読み込み中身を別のファイルとして自動でtemporaryフォルダに保存する。

次回 file.txtを読み込むとき、即ち自分が更新された内容が全く違うfile.txtを読み
込んでくれと願う時にブラウザはキャッシュからそれを読み込む為に昔の内容のまま
が表示される。


キャッシュを利用させないことができる。
しかしそれはブラウザを利用する側が行う設定で、しかも普通そんな設定を変更しない。
ブラウザを閉じるときにキャッシュを全て消去する設定も同様だ。

スーパーリロードというのがある。これもまたブラウザの利用側が行うことだが、
しかし文面でそれを促すことが出来る。それはつまり、『Ctrlキーを押して、その指を
保持したまま、F5キーを押せ』と。これはFirefoxとInternetExplorerでの方法で、
OperaなのではさらにAltキーを押す必要があったようなおぼろげな記憶もある。

 しかしこれは今役立たない。
何故ならばこれはブラウズする直接のファイル、つまり先の例では index.htmlだけだ。
(自分が調べた内では少なくともそうである。もしかしたら、内で読み込むこと
を指定したcssファイル及びjsファイル、dtdファイルとかにも効くのかもしれないが、
特に書かれていなかった。少なくとも自分が確認できたのは、
<iframe src="file.txt"></iframe>によってfile.txtを読み込む内容はスーパーリロードによってキャッシュから読み込
ませることを防ぐことが出来なかった。)


[解決]
Google先生って結構物知りなので助かる。

①ヘッダIf-Modified-Since
var con=new XMLHttpRequest(); //当然IE対策は別にするべきである。
con.setRequestHeader("If-Modified-Since","Thu, 31 Dec 2009 15:00:00 GMT ") ;
と指定してからsend(null);なりをする。
 第一引数に"If-Modified-Since"を指定することで、
 第二引数に渡す文字列が示す、書式「曜, 日 月 年 時刻 GMT」(グリニッジにおけるそれ)
よりも後に更新されていれば、通常の通信を行い、もし更新されていなければ、ただ
status:304(not modified)を返す。
このときresponseText,responseXMLは無いので注意。
なぜ返さないのか。反語ではなくて憤怒。

②スタンプ
こりゃあいい。
スタンプとはクエリのことである。つまり"file.txt"を指定する代わりに
"file.txt?abc"を指定するのだ。ファイル名の後に半角?を加えて更に文字
列を繋げる。この文字列がクエリでありスタンプである。但し、そういう
ことしても返答がまともであるサーバーであることを確認せよ。

"file.txt":"file.txt?0":"file.txt?1"は、サーバーにとっては全て
file.txtだが、ブラウザにとってはもしかしたら違うかもしれないので毎度
キャッシュを利用しないで読み込み、キャッシュに保存する。
そこで"file.txt"+(new Date)を指定すれば違うキャッシュを無限増に作る。
心配しなくとも、キャッシュというのは、あんまり増えたら勝手にブラウザ
が消すし、何ヶ月以上使われて無いキャッシュというのはこれもまたブラウ
ザが消すことになっている。//

コメ(0) | トラ(0)


(c)Kero's World