停止从缓存加载Javascript和HTML

停止从缓存加载Javascript和HTML,javascript,html,caching,browser-cache,page-refresh,Javascript,Html,Caching,Browser Cache,Page Refresh,我正在构建一个单页javascript应用程序,当应用程序启动时,我使用一个javascript文件动态加载我需要的所有其他文件。根据firebug的说法,当我点击refresh时,我的HTML页面和javascript页面将加载一个304 Not Modified错误,我的javascript将停止工作 我知道这是由于浏览器缓存造成的,但如何避免这种情况?我用一个脚本调用加载初始HTML页面 <script src="js/config.js" type="text/javascript

我正在构建一个单页javascript应用程序,当应用程序启动时,我使用一个javascript文件动态加载我需要的所有其他文件。根据firebug的说法,当我点击refresh时,我的HTML页面和javascript页面将加载一个304 Not Modified错误,我的javascript将停止工作

我知道这是由于浏览器缓存造成的,但如何避免这种情况?我用一个脚本调用加载初始HTML页面

<script src="js/config.js" type="text/javascript"></script>
我知道Gmail使用cookies来防止这种情况。有人知道如何采取这种方法吗?我是否应该在服务器上设置cookie,然后在每个页面加载/刷新时使用JS进行检查,如果cookie告诉我页面是从缓存加载的,则使用类似window.location.refresh()的方法?


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

将其添加到HTML头部。

出于性能原因,缓存非常重要。我建议您在查询字符串中传递一个版本号,并在每次更新时增加版本号。这将强制浏览器重新发送请求,如果请求已经具有相同的版本,它将从缓存加载。

您需要设置
script.src=scripts[loaded]onreadystatechange
/
onload
处理程序后的code>。否则,事件将在添加处理程序之前触发,因为缓存版本会立即加载。

我同意所有其他答案。304不是一个错误,并且有很多原因说明这种行为是正确的

这就是说,有一个简单的“黑客”你可以使用。只需将唯一的URL参数附加到JS调用

var timestamp = +new Date;
var url = "http://mysite.com/myfile.js?t=" + timestamp;
同样,这是一个黑客。就性能而言,这太可怕了。

要展开讨论:

要强制重新加载js文件,而不是缓存,请使用以下html:

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


下次对该文件进行更改时,只需+1
v
。顺便说一句,这也适用于css文件。

在与缓存问题斗争了几个月之后,我尝试了几乎任何事情(包括使用参数更改URL的脚本),我发现了一篇文章,其中解释了如何使用IIS来实现这一点

  • 启动IIS管理器(开始菜单中的INETMGR适用于我)
  • 在连接树中导航到所需的站点
  • 开放输出缓存
  • 编辑要素设置
  • 取消选中启用缓存并启用内核缓存
  • 如果无法保存更改,请确保web.config文件未标记为只读
  • 需要设置IISRESET才能进行更改
这是原始帖子,其中提到它与IIS 7.5(在Windows 7中)相关

我之前尝试过的一件事是在输出缓存中添加.html和.js,并选中“阻止所有缓存”。因此,如果在IISRESET之后它不起作用,尝试一下,尽管我不确定它是否确实是必需的

编辑:

如果不起作用,仍然在IIS中转到HTTP响应头并添加新操作:

  • 名称:缓存控制,值:无缓存

  • 名称:expires,值:0


  • 我建议使用Javascript生成一个随机数,使用Math.random乘以它,然后使用Math.floor返回它的整数。然后,我将这个数字作为变量添加到URL中。由于在每次页面加载过程中数量都会发生变化,因此不应缓存该文件

    <script>
      var url="yourscript.js";
      var extra="?t=";
      var randomNum = String((Math.floor(Math.random() * 200000000000000)));
      document.getElementById('myScript').src = url+extra+randomNum;
    </script>
    <script id="myScript"></script>
    
    
    var url=“yourscript.js”;
    var extra=“?t=”;
    var randomNum=String((Math.floor(Math.random()*2000000000000000));
    document.getElementById('myScript').src=url+extra+randomNum;
    
    不要刷新页面,而是重新加载。我不能期望应用程序的用户知道不刷新。这是一个需要解决的错误,没有在浏览器中解决。
    304未修改
    不是错误。不重新请求JavaScript文件不重要。它们仍然会被加载。您是否正在侦听正确的事件以重新初始化页面?这不会阻止浏览器缓存和传递304 not MODIFED错误。304 not MODIFED只是一个“您应该缓存此缓存”响应,不是错误。我在动态脚本加载实用程序中使用此方法,效果很好,但在这种情况下,考虑到它涉及到应用程序的核心,我正在寻找一种稍微更有效的方法。
    <script>
      var url="yourscript.js";
      var extra="?t=";
      var randomNum = String((Math.floor(Math.random() * 200000000000000)));
      document.getElementById('myScript').src = url+extra+randomNum;
    </script>
    <script id="myScript"></script>