2013-04-15 54 views
1

因此,我運行了一個使用大量javascript和ajax的網站。我瞭解如何讓用戶刷新瀏覽器when the browser loads。但是,如果我需要他們在加載網站後刷新瀏覽器,會發生什麼情況?強制(或很好地問)刷新瀏覽器

我想改變這種狀況被提供給客戶端,以加快東西阿賈克斯,但是這將導致對誰尚未更新他們的瀏覽器的用戶錯誤。

唯一的解決辦法我能想出的是,當需要JavaScript文件的新版本,該網站使用,要求用戶強行刷新其瀏覽器的彈出。 (這並不會真正解決當前的版本,但將防止未來的問題。)

我討厭用的東西,我可以自動完成一個彈出。有沒有更好的方法來強制更新客戶端?

+1

不知道你得到什麼。 Ajax的全部用途是將內容加載到DOM中,而不用刷新頁面。如果你確實想刷新頁面,爲什麼不只是做一個http get或post請求,沒有ajax? – Ryan

+0

您提供的鏈接提供了幾種方法在需要時打破緩存。使用其中之一而不是刷新頁面。您似乎擔心資源的新「版本」,可以通過刷新頁面來檢索這些資源。更改URL是欺騙瀏覽器來處理它,或正確配置服務器的正確方法 – Ian

+0

@ryan也許我的措辭很糟糕。用戶正在向服務器發送大量Ajax請求。但是,如果服務器行爲發生變化,那麼向服務器發出請求的每個人都會突然發生頁面損壞,並且沒有說明頁面被破壞的原因。如果他們刷新他們的瀏覽器,該網站將被修復,但用戶不知道。我想知道如果服務器和客戶端不同步,是否有刷新頁面的好方法。 – Holtorf

回答

1
window.location.href = "http://example.com" 

替換爲一個當前頁面指向http://example.com

+0

設置'.href'不會替換頁面。它導航到新頁面。調用'window.location.replace'將替換頁面。 – Ian

+0

區別在哪裏? – Oswald

+0

根據['location'MDN頁面](https://developer.mozilla.org/en-US/docs/DOM/window.location#Methods),'replace'和'assign'之間的區別(與直接設置'href')是'replace'不會在用戶的Back/Forward列表中創建一個新的歷史記錄。 – apsillers

1

你聽起來像您有您的JavaScript無法得到它加載通過Ajax的數據保護方法的更新版本,是正確的?例如,如果兩個Ajax調用嘗試加載'data.txt',則第二個調用僅使用緩存版本。

您也可能無法加載您的腳本本身的新版本。

解決這兩個問題的方法是隨機生成的查詢字符串添加到您的腳本源和你的Ajax來源。

例如,做一個腳本加載主腳本,像這樣:

/* loader1.js */ 
document.write('<script src="mainjavascript.js?.rand=', Math.random(), '"></script>'); 

而在你的HTML,只是做

<script src="loader1.js"></script> 

同樣的方法適用於JavaScript的Ajax請求,以及。假設「客戶端」是一個新的XMLHttpRequest()對象,並已正確設置了一個readystatechange等功能,那麼您只需添加相同的查詢字符串,像這樣:

request = client.open('GET', 'data.txt?.rand=' + Math.random(), true); 
request.send(); 

您可能使用一個庫來完成你的Ajax請求,所以它更容易。只要指定數據URL爲'data.txt?.rand=' + Math.random(),而不是僅僅「的data.txt」

+2

我認爲OP的問題在於他的服務器端API正在改變。例如,想象一個用於爲數據對象返回JSON的'getData.php',但在更新之後,它會返回一個對象數組。在更新之後運行的任何舊客戶端腳本仍然期望一個對象,而當它交給數組時,它將會中斷。用戶需要刷新頁面,以便可以獲取知道如何處理對象數組的新客戶端腳本。 – apsillers

+0

確實如此,這是我提出的第一個解決方案(示例代碼的前兩部分)。 –