【问题标题】:Chrome back button: only giving cached version of initial page, without any Ajaxed contentChrome 后退按钮:仅提供初始页面的缓存版本,没有任何 Ajaxed 内容
【发布时间】:2012-04-23 05:03:50
【问题描述】:

我有两个页面,A和B。流程如下:

  • 去A
  • javascript Ajaxes 一堆内容添加到 A,形成 A'
  • 去B
  • 按 [Back] 将返回 A,而不是 A',没有所有 Ajaxed 内容

有没有其他人注意到这一点,如果有,你如何解决它?

如果 Chrome 在转到 B 之前缓存 A' 状态,并在后面重现 A',那将是可以接受的。如果 Chrome 简单地重新加载整个 A(包括将其转换为 A' 的 Ajax 请求),那也可以。当前的行为是加载一个旧的、不完整的 A 版本,这不是我想要的。

编辑:我知道它正在加载缓存版本,因为当我点击 [Back] 时服务器没有收到任何新请求。

【问题讨论】:

  • 各个页面的缓存标头是什么样的?
  • @QuintinRobinson:抱歉,什么是缓存头?
  • 您的服务器应该通过缓存控制标头强制执行应用于页面的缓存策略。我真诚地建议你阅读这件事,这里有一个资源:mnot.net/cache_docs
  • @QuintinRobinson:我会去研究它们;谢谢!

标签: javascript ajax caching google-chrome


【解决方案1】:

这个话题很老,但我想我会分享我的解决方案。要让 Firefox、Chrome 和 Safari 的行为一致,您必须在返回时需要重新加载的页面上设置卸载处理程序,并使用缓存清除标头。

例子

在 HTTP 标头中

Cache-Control: must-revalidate, no-store, no-cache, private

在页面的 javascript 中

$(window).unload(function(){}); // Does nothing but break the bfcache

阅读此处了解更多信息:http://madhatted.com/2013/6/16/you-do-not-understand-browser-history

【讨论】:

    【解决方案2】:

    我知道这个话题很老,但这个问题的解决方案并不容易找到,我只是浪费了几个小时来解决它。这两行代码为我解决了 Chrome 问题:

    Response.Cache.SetCacheability(HttpCacheability.NoCache);
    
    Response.Cache.SetNoStore();
    

    【讨论】:

    • 不,看起来这是 .net。它将根据您使用的语言/框架而改变。基本上你只需要设置Cache-Control: no-store HTTP 头。例如,如果您使用的是轨道,fordevs.com/2011/10/…
    【解决方案3】:

    好吧,如果您使用的是 xhr 请求而不是隐藏帧,则后退和前进按钮不会绑定到 xhr 请求

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-25
      • 2011-02-13
      • 1970-01-01
      • 2012-04-05
      • 2015-10-19
      • 2015-05-08
      相关资源
      最近更新 更多