こんにちは。kikuです。
先日ajaxでの通信で、期待通りの値が取れなくて困ったことがありました。
無事解決したので、備忘録として書き残したいと思います。
jQueryのajaxを使ってアクセスした場合、2回目以降のリクエストが実際には発行されずにキャッシュされた値が使われてしまう場合があります。
そんな時は cache に false を設定します。
※これはHEADとGETリクエスト時のみ正常動作します
$.ajax({ url : "http://dev.blog.fairway.ne.jp", cache : false, data : { hoge : "fuga" } }).done(function(success){ console.log(success); });
cacheはリクエストURLに “_={timestamp}” をGETパラメーターで追加しています。
上記では http://dev.blog.fairway.ne.jp?hoge=fuga&_=1253863496678 のようになってリクエストを投げます。
で、今回プチハマリしたのはPOST時です。
上で「HEADとGET時にしか正常動作する」という点を見逃していて、POST時に頑張ってcacheの設定をしていたので期待通りの動きをしなかったようです。
POST時にキャッシュされた値が使われてしまっていた場合は、XMLHttpRequest.setRequestHeader を使ってリクエストヘッダで If-Modified-Since を設定することによりキャッシュされた値が使用されなくなります。
ただXMLHttpRequest.setRequestHeader は XMLHttpRequest.open の後にしなければエラーになってしまいますので beforeSend でコールバック関数を指定します。
$.ajax({ type : "POST", url : "http://dev.blog.fairway.ne.jp", beforeSend : function(xhr){ xhr.setRequestHeader("If-Modified-Since", "Thu, 01 Jun 1970 00:00:00 GMT"); }, data : { hoge : "fuga" } }).done(function(success){ console.log(success); });
このように設定することで、リクエストをキャッシュさせずに発行することができました。
うまく動かなかった時にキャッシュが原因と判断するまで結構時間がかかってしまわないように、キャッシュのことを頭の隅に置いておきたいところです。