【问题标题】:Feature-detect bfcache?功能检测 bfcache?
【发布时间】:2014-01-21 13:22:33
【问题描述】:

当我使用后退按钮转到 DOM 已修改的页面时,我对 IE10 中的this problem 感到惊讶:

我会对行为 1 或 2 感到满意,但不是 3:

  1. 正确恢复整个状态(就像 FF 和 Chrome 一样)
  2. 重新加载页面(因为它不应该被缓存)并且可以重新创建当前状态,因为更改是通过 Ajax 推送到服务器的(IE8 会这样做)
  3. 但是 IE10 回到了初始的、未修改的页面(它保留表单输入,如果初始页面上有任何输入,但不是整个状态)

因为我很着急,如果有人在进行 DOM 修改后访问该页面(该信息存储在哈希中),我只是强制重新加载,这是一个非常愚蠢的解决方案(FF 和 Chrome 不不需要重新加载,但现在需要)。

一个建议是use localStorage to remember state,我猜这种功能也包含在history.js中。

保留一份备用副本以供比较/以防状态未恢复似乎有点过头了,尤其是因为在我们的案例中,这可能会困扰 0.01% 的用户。 就我的目的而言,如果状态尚未完全保存在 bfcache 中,则强制重新加载就足够了。

我可以“简单地”检测是否存在包含所有状态的 bfcache 吗?如果是这样,当有人返回其 DOM 已修改的页面时,我可以在它不存在的情况下强制重新加载?

【问题讨论】:

  • 看看这里似乎相关:stackoverflow.com/questions/2063742/…
  • @ryan 谢谢,我知道这个问题。它是相关的,但答案是关于从各种本地存储恢复状态,而不是检测 bfcache 的“多好”。

标签: javascript caching


【解决方案1】:

如果已知浏览器用户代理/浏览器不保存修改后的状态,您可以刷新页面。

您也可以在修改状态后将“#modified”附加到 URL,因此如果 URL 包含“#modified”但状态为默认值,则您知道应该刷新页面,因为状态不会被缓存正确。

if(document.location.hash == "#HelloWorld")
{
    // Check if state is default
    // If state is default, the page should be refreshed
}
document.location.hash = "#HelloWorld";

【讨论】:

  • 所以基本上你建议我在 DOM 中设置某种标志,我可以用它来区分默认状态和非默认状态?因为否则我最终会将所有状态更改存储两次,以查明是否有任何编辑。问题是,现在没有默认/非默认状态,任何状态都可以是从服务器加载的东西,也可以是用户输入后出现的东西。在这种情况下设置这样一个标志的好方法是什么?
  • 当用户改变状态时设置标志? AKA 在某处更改输入。
  • 对不起,这个问题有点老了。我想我当时尝试过一些类似的事情,但失败了。将状态标志存储在隐藏的输入中肯定无法将 IE10 的糟糕 bfcache 与 FF 和 Chrome 区分开来(因为 IE10 存储输入)。但这是一种微弱的反应,不幸的是我没有时间或不需要回到我的老问题。
猜你喜欢
  • 2014-08-03
  • 2014-02-10
  • 1970-01-01
  • 1970-01-01
  • 2012-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多