開放ajax應(yīng)用的時候為了避免瀏覽器緩存,我常建議在用XHR發(fā)起請求的時候加一個
有的時候我們懷疑瀏覽器緩存了錯誤的腳本,也會這樣用xhr去沖掉IE原有的cache。不過這個方法在非IE瀏覽器下不管用,似乎是因為由于header有不同,非IE瀏覽器認為這些是不同的請求,cache在不同的地方,或者是放棄對這個與眾不同的請求的cache了。
嘗試了一下一些能起類似作用的不同的header,發(fā)現(xiàn)firefox下,似乎cache-control和pragma能起到類似的請求。測試代碼如下:
FireFox下,用if-modified-since下載成功腳本后,引用腳本時仍然下載了一份完整的腳本,說明xhr的這個請求沒有被cache住。用cache-control和pragma的時候,應(yīng)用腳本時就不再下載腳本而從cache里面讀了。

但是這兩個header不能讓瀏覽器拋棄已有的cache,只能讓瀏覽器重新驗證一下版本是否最新的。對于腳本被截斷并且cache的情況,瀏覽器會驗證到版本是最新的而不會更新那個“版本正確內(nèi)容錯誤”的文件cache。
對于其他主流非IE瀏覽器,這兩個header也沒有用,還是各cache各的,暫時還不知道如何用xhr來沖掉cache。
xmlhttp.setRequestHeader("If-Modified-Since","0");
有的時候我們懷疑瀏覽器緩存了錯誤的腳本,也會這樣用xhr去沖掉IE原有的cache。不過這個方法在非IE瀏覽器下不管用,似乎是因為由于header有不同,非IE瀏覽器認為這些是不同的請求,cache在不同的地方,或者是放棄對這個與眾不同的請求的cache了。
嘗試了一下一些能起類似作用的不同的header,發(fā)現(xiàn)firefox下,似乎cache-control和pragma能起到類似的請求。測試代碼如下:
var x=new XMLHttpRequest();
x.open("GET","http://imgcache.qq.com/ac/qzone/gbk.js?ifmodifiedsince",false)
x.setRequestHeader("If-Modified-Since","0");
x.send(null);
var s=document.createElement('SCRIPT');
document.getElementsByTagName("HEAD")[0].appendChild(s);
s.src="http://imgcache.qq.com/ac/qzone/gbk.js?ifmodifiedsince";
var x=new XMLHttpRequest();
x.open("GET","http://imgcache.qq.com/ac/qzone/gbk.js?cachecontrol",false)
x.setRequestHeader("Cache-Control","no-cache");
x.send(null);
var s=document.createElement('SCRIPT');
document.getElementsByTagName("HEAD")[0].appendChild(s);
s.src="http://imgcache.qq.com/ac/qzone/gbk.js?cachecontrol";
var x=new XMLHttpRequest();
x.open("GET","http://imgcache.qq.com/ac/qzone/gbk.js?Pragma",false)
x.setRequestHeader("Pragma","no-cache");
x.send(null);
var s=document.createElement('SCRIPT');
document.getElementsByTagName("HEAD")[0].appendChild(s);
s.src="http://imgcache.qq.com/ac/qzone/gbk.js?Pragma";
x.open("GET","http://imgcache.qq.com/ac/qzone/gbk.js?ifmodifiedsince",false)
x.setRequestHeader("If-Modified-Since","0");
x.send(null);
var s=document.createElement('SCRIPT');
document.getElementsByTagName("HEAD")[0].appendChild(s);
s.src="http://imgcache.qq.com/ac/qzone/gbk.js?ifmodifiedsince";
var x=new XMLHttpRequest();
x.open("GET","http://imgcache.qq.com/ac/qzone/gbk.js?cachecontrol",false)
x.setRequestHeader("Cache-Control","no-cache");
x.send(null);
var s=document.createElement('SCRIPT');
document.getElementsByTagName("HEAD")[0].appendChild(s);
s.src="http://imgcache.qq.com/ac/qzone/gbk.js?cachecontrol";
var x=new XMLHttpRequest();
x.open("GET","http://imgcache.qq.com/ac/qzone/gbk.js?Pragma",false)
x.setRequestHeader("Pragma","no-cache");
x.send(null);
var s=document.createElement('SCRIPT');
document.getElementsByTagName("HEAD")[0].appendChild(s);
s.src="http://imgcache.qq.com/ac/qzone/gbk.js?Pragma";
FireFox下,用if-modified-since下載成功腳本后,引用腳本時仍然下載了一份完整的腳本,說明xhr的這個請求沒有被cache住。用cache-control和pragma的時候,應(yīng)用腳本時就不再下載腳本而從cache里面讀了。

但是這兩個header不能讓瀏覽器拋棄已有的cache,只能讓瀏覽器重新驗證一下版本是否最新的。對于腳本被截斷并且cache的情況,瀏覽器會驗證到版本是最新的而不會更新那個“版本正確內(nèi)容錯誤”的文件cache。
對于其他主流非IE瀏覽器,這兩個header也沒有用,還是各cache各的,暫時還不知道如何用xhr來沖掉cache。