2011-04-19 402 views
103

我想使用JavaScript重新加載頁面,但我也想清除緩存,所以在頁面刷新頁面上有最新版本的服務器。
除IE之外的其他瀏覽器沒有獲取最新內容。window.location.reload清除緩存

IE9的任何解決方案?

+5

當用戶坐在代理後面時,可能會發生醜陋的事情。爲了確保頁面重新加載,只需將隨機的val添加到您的網址。 – Teson 2011-04-19 21:15:15

回答

160

reload()應該接受它告訴它做一個硬性重新加載,即一個說法,忽略緩存:

location.reload(true); 

我不能保證它的可靠性,您可能需要進一步調查。

+0

它是否適用於android webkit瀏覽器? – prongs 2012-03-29 07:44:54

+0

@prongs我不明白爲什麼它不應該。當然,我沒有基於Android的webkit來測試它... – Christian 2012-03-29 14:40:16

+16

適用於IE和FF,但不適用於Chrome,Safari。任何人都知道如何在Chrome,Safari中實現這一點? – testpattern 2012-10-30 13:31:00

40

您可以通過幾種方法來做到這一點。一,單純這個元標記添加到您的head

<meta http-equiv="Cache-control" content="no-cache"> 

如果你想使一個已經緩存獲取的也抹去了expires元標記應努力通過像這樣將它設置爲-1刪除它肯定的東西:

<meta http-equiv="Expires" content="-1"> 

http://www.metatags.org/meta_http_equiv_cache_control

此外,IE應該給你的主網頁的最新內容。如果您遇到外部文檔問題,例如CSS和JS,請在URL的末尾添加一個虛擬參數,並使用當前時間(以毫秒爲單位),以使其不變。這樣,IE和其他瀏覽器將始終爲您提供最新版本。這裏有一個例子:

<script src="mysite.com/js/myscript.js?12345"> 

--UPDATE--

閱讀我知道你想以編程方式清除緩存,而不是每次的意見後。你可以做的是有一個函數在JS想:

eraseCache(){ 
    window.location = window.location.href+'?eraseCache=true'; 
} 

然後,在PHP讓我們說,你做這樣的事情:

<head> 
<?php 
    $cache = ''; 
    if(isset($_GET['eraseCache'])){ 
    echo '<meta http-equiv="Cache-control" content="no-cache">'; 
    echo '<meta http-equiv="Expires" content="-1">'; 
    $cache = '?'.time(); 
    } 
?> 
<!-- ... other head HTML --> 
<script src="mysite.com/js/script.js<?= $cache ?>" 
</head> 

這不是測試,但應該工作。基本上,你的JS函數,如果被調用,將重新加載頁面,但在URL的末尾添加一個GET參數。然後你的網站會有一些後端代碼來尋找這個參數。如果它存在,它會添加元標記和包含時間戳的緩存var,並將其附加到您正在緩存問題的腳本和CSS。

--update 2--

meta標記確實不會清除緩存的負載。因此,從技術上講,您需要在JS中運行eraseCache函數,一旦頁面加載,您需要重新加載它以便進行更改。你應該能夠用你的服務器端語言來解決這個問題。你可以運行相同的eraseCache JS的命令,但不是添加meta標籤在你的頁面的頂部運行此相反:

<?php 
    header("Cache-Control: no-cache, must-revalidate"); 
    header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); 
?> 
<!-- Here you'd start your page... --> 

這樣的工作,因爲它之前刪除緩存頁面加載和任何運行之前。

+3

如果我錯了,糾正我,但meta緩存控制標記將阻止正在加載的頁面的緩存。它不會清除已保存在客戶端瀏覽器中的緩存。 – Keylan 2011-04-19 20:34:04

+2

此外,將時間以毫秒爲單位添加到src屬性的末尾永遠不會允許該JavaScript文件被緩存......這是不可取的。我從coure06希望能夠通過請求清除瀏覽器緩存的問題中獲得它 - 而不是永久保證該文件永遠不會被緩存。也許一個綜合的解決方案是使用包含的GET參數來鏈接到同一頁面,這會強制javascript包含當前時間。 – Keylan 2011-04-19 20:38:57

+1

只是想繼續添加評論,因爲我認爲新的東西顯然。將毫秒添加到基於某些事件的文件路徑上並不容易,因爲在完成一次之後 - 文件路徑永遠不會僅返回到myscript.js,因爲瀏覽器只會切換回緩存文件。 – Keylan 2011-04-19 20:44:31

4

我寫了這個JavaScript腳本,並將其包含在標題(在任何加載之前)。它似乎工作。如果頁面在一個多小時前加載,或者情況未定義,它將重新加載服務器上的所有內容。 一小時= 3600000毫秒的時間可以在下面的行來改變: 如果(改變> 3600000)

與問候, Birke酒店

<script type="text/javascript"> 
//<![CDATA[ 
function zeit() 
{ 
    if(document.cookie) 
    { 
     a = document.cookie; 
     cookiewert = ""; 
     while(a.length > 0) 
     { 
      cookiename = a.substring(0,a.indexOf('=')); 
      if(cookiename == "zeitstempel") 
      { 
       cookiewert = a.substring(a.indexOf('=')+1,a.indexOf(';')); 
       break; 
      } 
      a = a.substring(a.indexOf(cookiewert)+cookiewert.length+1,a.length); 
     } 
     if(cookiewert.length > 0) 
     { 
      alter = new Date().getTime() - cookiewert; 

      if(alter > 3600000) 
      { 
       document.cookie = "zeitstempel=" + new Date().getTime() + ";"; 
       location.reload(true); 
      } 
      else 
      { 
       return; 
      } 
     } 
     else 
     { 
      document.cookie = "zeitstempel=" + new Date().getTime() + ";"; 
      location.reload(true); 
     } 
    } 
    else 
    { 
     document.cookie = "zeitstempel=" + new Date().getTime() + ";"; 
     location.reload(true); 
    } 
} 
zeit(); 
//]]> 
</script> 
2

在我的情況重載()不工作因爲asp.net控制行爲。所以,爲了解決這個問題,我已經使用了這種方法,儘管似乎是一個解決方法。

self.clear = function() { 
    //location.reload(true); Doesn't work to IE neither Firefox; 
    //also, hash tags must be removed or no postback will occur. 
    window.location.href = window.location.href.replace(/#.*$/, ''); 
}; 
6

我有這個問題,我解決它使用JavaScript

location.reload(true); 

你也可以使用

window.history.forward(1); 

阻止用戶登錄後瀏覽器後退按鈕退出應用程序。

+0

這個'location.reload(true);'會放在javascripts文件中? – FedericoCapaldo 2017-05-21 16:04:28

+0

是的,你可以把它放在任何js文件中 – yousef 2017-05-22 13:00:46

+0

@FedericoCapaldo只要將它放在你想要重載用戶頁面時調用的任何函數中 – 2017-06-27 17:44:30

4

Cache.delete()也可以用來清除最新的chrome,firefox和opera瀏覽器的緩存。