2012-07-14 27 views
5

如果您對此問題有更好的標題,請隨時編輯。location.reload with cache

最長的時間,我總是用location.reload()重新加載頁面 - 這是最合乎邏輯的事情,對吧?

但我最近注意到它不是F5的等價物,正如我最初想的那樣,但更多的是Ctrl + F5。所有圖像和其他鏈接的文件都從服務器重新請求,當我想要做的是重新加載頁面。

我發現我可以使用location.replace(location.href),這似乎達到了我想要的效果:重新加載頁面,但從緩存中檢索鏈接的文件。

這是理想嗎?有沒有比這更好的方法?我忽略了這種方法可能存在的缺陷嗎?

(注意:我已經有緩存清除管理上鍊接的文件,如腳本,通過附加filemtime作爲查詢字符串)

+0

window.location.reload(false);將從緩存中重新加載... – Drewness 2012-07-14 16:57:44

+0

@TGxANAHEiiMx [「如果它是錯誤的或未指定,瀏覽器可能會從緩存中重新加載頁面。」](https://developer.mozilla.org/en/DOM/window。位置) - 請注意「可能」和「頁面」的使用 - 它沒有提及任何關於「將」或鏈接的文件。 – 2012-07-14 17:00:05

+0

啊,點了。從「最佳實踐」的角度來看,這不是最好的,因爲它不僅僅是一種「功能性」的情況。 – Drewness 2012-07-14 17:07:13

回答

4

在回答我自己的問題,有一個巨大的陷阱:當位置包含散列,瀏覽器將跳轉到該散列,而不是重新加載頁面。

予實現的解決方案如下:

reload = (function() { 
    var m = location.search.match(/[?&]__hash=([^&]+)/); 
    if(m) location.hash = unescape(m[1]); 
    return function() { 
      var h = location.hash; 
      if(h == "") { 
        location.replace(location.href); 
      } 
      else { 
        var s = location.search; 
        s = s.replace(/[?&]__hash=[^&]+/,''); 
        s += (s == "" ? "?" : "&")+"__hash="+escape(h); 
        location.replace(location.pathname+s); 
      } 
    }; 
})(); 

假定在服務器側使用什麼$_GET['__hash'],這可以安全地使用。