向服務(wù)器發(fā)送請求
如需將請求發(fā)送到服務(wù)器,我們使用 XMLHttpRequest 對象的 open() 和 send() 方法:
xmlhttp.open("GET","ajax_info.txt",true);
xmlhttp.send();
在上面的例子中,可能得到的是緩存的結(jié)果。
為了避免這種情況,請向 URL 添加一個唯一的 ID:
xmlhttp.open("GET","/try/ajax/demo_get.php?t="+Math.random(),true);
xmlhttp.send();
對于以上代碼(代碼來源鏈接?)
給這個url加上一個,Math.random(),url這個參數(shù)不就成了:demo_get.asp?t=0.1234567890123456
*! 這為何能正常運行呢?
答(回答來自segmentfault?):
例如你的文件URL是:flie/xxx.txt
第一次Ajax請求這個文件,瀏覽器可能會將這個文件緩存在本地,下次再打開這個文件瀏覽器就可以直接打開本地文件,無需重新通過網(wǎng)絡(luò)再次獲取。
但是,瀏覽器有可能會好心辦了壞事,因為你修改了服務(wù)器的flie/xxx.txt文件,但是瀏覽器不知道,它還是會打開本地緩存的文件,這就會造成一些BUG。
為了防止出現(xiàn)這種問題,在URL上加一個參數(shù)“t=隨機數(shù)”,瀏覽數(shù)會認為兩次打開的是不同的東西,第二次Ajax就不會使用第一次Ajax的緩存。
至于“這為何能正常運行呢”?
在URL上加上參數(shù),同樣還是打開這個文件,當(dāng)然可以正常運行。
flie/xxx.txt?t=0.1234567890123456,這個URL同樣還是打開文件flie/xxx.txt。
而url問號后面的部分叫query string(查詢字符串)。如果url對應(yīng)的是php等實現(xiàn)的動態(tài)頁面,那么查詢字符串可能會被服務(wù)器處理。如果是個靜態(tài)文件,查詢字符串對服務(wù)器而言通常沒啥作用,被服務(wù)器忽略,而對瀏覽器來說卻可以防止緩存。
問號后面就是給請求加的一些數(shù)據(jù)啦。如果服務(wù)器沒有處理這部分,就當(dāng)不存在了。但是產(chǎn)生的URL中含有隨機數(shù),所以就是唯一的了。也就沒有緩存。
但是,
目前網(wǎng)上加隨機數(shù)來強行刷新緩存的做法是錯的!!
HTTP協(xié)議中早已有緩存控制方法,詳情自己搜HTTP協(xié)議之緩存控制?部分!(鏈接來自博客園)。