jQuery .get缓存工作得太好了?

时间:2012-05-15 23:07:22

标签: caching jquery

我正在使用jQuery .get()函数加载模板文件,然后通过定位特定的DOM元素将加载的HTML显示在页面的一部分中。它运作良好,但我最近意识到原因让我感到困惑的是它正在缓存我的模板文件并屏蔽我所做的更改。

别误会我的意思......我喜欢和下一个人一样的缓存。我希望它在客户端缓存和服务器上的文件之间没有时间戳差异时进行缓存。然而,这不是正在发生的事情。为了使它更奇怪...使用相同的功能加载模板...一些模板文件正在加载更新而其他模板文件没有(更喜欢缓存版本而不是最近的更改)。

以下是我使用的加载功能。

function LoadTemplateFile ( DOMlocation , templateFile , addEventsFlag ) {
    $.get( templateFile , function (data) {
        $( DOMlocation ).html(data);
    });
}

非常感谢任何帮助。

新细节: 我一直在做一些调试,现在看到返回到成功函数的“数据”变量确实有更新的信息,但由于我尚不清楚插入DOM的原因是旧版本。如何实现这一点现在已成为我的问题。

3 个答案:

答案 0 :(得分:5)

您可以在jQuery.get()来电中将缓存设置为关闭。有关cache: false选项的详细信息,请参阅jQuery.ajax() doc。有关缓存如何工作的详细信息是特定于浏览器的,因此我认为您无法控制它的工作方式,只是对于任何给定的调用是开启还是关闭。

仅供参考,当您关闭缓存时,jQuery会通过在URL的末尾附加一个唯一的timestamp参数来绕过浏览器缓存,这使得它与之前的任何URL都不匹配,因此没有缓存命中。

您还可以在服务器上控制缓存生存期和其他几个缓存参数,这些参数将设置各种HTTP标头,指示浏览器允许哪种类型的缓存。在开发应用程序时,您可能希望完全缓存。对于部署,我建议你想要它,然后当你修改你的应用程序时,最安全的处理缓存的方法是稍微改变你的URL,以便你的URL的新版本不同。这样,您总能获得最大缓存,但用户也会立即获得新版本。

答案 1 :(得分:2)

$ get将始终默认缓存,尤其是在IE上。您需要手动附加查询字符串or use the ajaxSetup method以破坏缓存。

答案 2 :(得分:0)

作为替代方案,我在jQuery文档中发现您可以覆盖默认缓存。对我来说,我没有必要将所有$ .get转换为$ .ajax调用。请注意,这也会覆盖所有其他类型调用的默认行为,例如$ .getScript具有与$ .get相反的默认行为cache:false。

https://api.jquery.com/jquery.getscript/

  $.ajaxSetup({
    cache: false
  });