2012-03-29 41 views
4

我正在構建單頁JavaScript應用程序,並且在應用程序啓動時我使用單個JavaScript文件加載我需要的其他每個文件。當我點擊刷新,根據螢火蟲,我的HTML頁面以及JavaScript頁面將加載304未修改錯誤,我的JavaScript停止工作。停止使用從緩存中加載的Javascript和HTML

我明白這是由於瀏覽器緩存,但我該如何避免這種情況?我有一個腳本調用

<script src="js/config.js" type="text/javascript"></script> 

載入初始HTML頁面,然後繼續從該腳本

window.onload = function() { 
    var scripts = ['http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.7.1.min.js', 'js/core.js', 'js/sandbox.js']; //Application scripts 
    var loaded = 0; 
    //Callback is executed after all scripts have been loaded. 
    var callback = function() { 
     if (loaded + 1 == scripts.length) { 
      //Create Modules 
      CORE.loader("js/modules/Login.js", function() { 
       CORE.createModule('loginForm', Login); 
      }); 

      //Create HTML bindings. 
      CORE.createBinding('appContainer', '#Login', 'login.html'); 
      CORE.bindHTML(window.location.hash); //Loads hash based page on startup 
     } else { 
      loaded++; 
      loadScript(scripts[loaded], callback); 
     } 
    }; 

    loadScript(scripts[0], callback); 

    function loadScript(scriptSrc, callback) { 
     var script = document.createElement('script'); 
     script.type = 'text/javascript'; 
     script.async = true; 
     script.src = scripts[loaded]; 

     if (script.readyState) { 
      script.onreadystatechange = function() { 
       if (script.readyState == 'loaded' || script.readyState == 'complete') { 
        script.onreadystatechange = null; 
        callback(); 
       } 
      }; 
     } else { 
      script.onload = function() { 
       callback(); 
      }; 
     } 

     document.getElementsByTagName('head')[0].appendChild(script); 
    } 
}; 

我知道Gmail使用Cookie來防止這種內動態加載的休息。有沒有人有任何想法如何採取這種做法?我應該在服務器上設置Cookie,然後在每個頁面加載/刷新時使用JS檢查它,如果cookie告訴我頁面從緩存中加載,請使用window.location.refresh()之類的內容。

+0

不要刷新頁面,重載代替。 – 2012-03-29 02:52:12

+0

我不能指望應用程序的用戶知道不刷新。這是一個需要解決的問題,而不是在瀏覽器中解決。 – ryandlf 2012-03-29 03:02:09

+0

'304 Not Modified'不是錯誤。 – user123444555621 2012-03-29 04:53:13

回答

9

緩存對性能的原因很重要。我建議你在查詢字符串中傳遞一個版本號,並且每次更新都會增加版本號。這將強制瀏覽器重新發送請求,如果它已經具有相同的版本,它將從緩存中加載。

1
<META HTTP-EQUIV="PRAGMA" CONTENT="NO-CACHE"> 

將此項添加到您的HTML HEAD中。

+0

這不會阻止瀏覽器緩存並傳遞304個未修改的錯誤。 – ryandlf 2012-03-29 03:00:20

+0

304未修改只是一個「你應該有這個緩存」的迴應,這不是一個錯誤。 – 2012-03-29 05:01:20

0

您需要設置script.src = scripts[loaded];後加入onreadystatechange/onload處理程序。否則,事件將在處理程序添加之前觸發,因爲緩存的版本會立即加載。

2

我同意所有其他答案。 304不是錯誤,並且這種行爲的正確性有很多原因。

這就是說,有一個簡單的「黑客」,你可以使用。只需將一個唯一的URL參數附加到JS調用。

var timestamp = +new Date; 
var url = "http://mysite.com/myfile.js?t=" + timestamp; 

再次,這是一個黑客。表現明智,這是可怕的。

+0

我用我的動態腳本加載工具這種方式和它的偉大工程,但在這種情況下,考慮到它涉及到應用程序的核心,我正在尋找一個稍微更有效的方法。 – ryandlf 2012-03-29 12:35:31

8

爲了擴展@Ramesh's answer

強制,而不是緩存中的js文件的重新加載,使用這個網站:

<script src="js/config.js?v=42" type="text/javascript"></script> 

您更改該文件的下一次只需+1 v。順便說一下,這也適用於css文件。

0

與緩存問題掙扎了幾個月,對任何事情只是想(包括使用一個參數,它改變了URL的腳本)後,我發現一個帖子,解釋如何做到這一點使用IIS

  • 啓動IIS管理器(INETMGR從開始菜單中對我的作品)
  • 導航到在連接樹所需的站點
  • 打開輸出緩存
  • 編輯功能設置
  • 取消選中啓用緩存和啓用內核緩存
  • 如果無法保存更改,請確保您的web.config文件未標記爲只讀
  • IISRESET需要的更改生效

這是原來的職位,其中提到,這是相關的IIS 7.5(Windows 7中) https://forums.iis.net/t/959070.aspx?How+do+you+disable+caching+in+IIS+

一個我以前嘗試過的事情即在輸出緩存中添加.html和.js,並選中「阻止所有緩存」。所以如果在IISRESET之後它不起作用,那麼儘管我不確定它實際上是否需要。

編輯:

如果它不工作,依然在IIS去HTTP響應頭,並添加新的動作:

  1. 名稱:緩存控制,值:無緩存

  2. 名稱:到期,值:0

相關問題