【问题标题】:Safari and it's greedy greedy cacheSafari 和它的贪婪贪婪缓存
【发布时间】:2014-06-26 15:17:54
【问题描述】:

现在这里已经出现了很多问题,所以我想我正在寻找解释而不是修复(尽管那将是王牌),但 Safari 的后退/前进缓存非常贪婪。

我遇到了一个问题,即提交表单,但在进入表单操作页面之前加载了一个插页式模式窗口。在 Safari 上,缓存非常强大,以至于后退按钮的模式仍然打开,这让我的灵魂非常难过。

我通过关闭模式然后提交表单来解决它。浏览器背面有一个半封闭的模式(它是 Bootstrap,所以它会消失),然后继续关闭。

现在我知道 onunload="" 但刷新页面似乎很疯狂。缓存是个好东西,也是你想要的东西,特别是在手机上。

我想我的问题是:

为什么它比 Chrome 更激烈,还有强制浏览器缓存一个状态而不仅仅是最后一个状态?

谢谢

【问题讨论】:

  • 你不能在关闭模式之前禁用淡入淡出,然后在页面重新显示时重新启用它吗?
  • 是的,这就是正在发生的事情。有一些 AngularJS 指令的复杂性。

标签: caching safari mobile-safari browser-cache


【解决方案1】:

哈,贪婪是轻描淡写!老实说,99% 的情况下,Safari 背后的 caching 设计是在移动设备上处理页面转换的理想方式。

当您从页面 A 转到页面 B,然后返回页面 A 时,您不希望在获取资源和资产时给设备(带宽、电池寿命)带来负担,而您可以只是“暂停”交互之间的状态,然后在您返回时“继续”它。

这正是 Safari Mobile 所做的。他们使用Page Cache 的概念,当您从一个页面导航到另一个页面时,它使整个页面保持在内存中。这减少了获取这些资源的需要,并允许在单击返回时进行快速交互。

这很好……但它确实会导致问题(例如您提出的那个) - 具体来说,您如何区分一个被暂停的页面和一个应该被销毁的页面?

值得庆幸的是,WebKit 提供了一个pageshowpagehide 事件,可以利用Page Cache。除了在页面显示或隐藏时触发(类似于onunload),它还具有指示页面是persisted - 还是放入页面缓存的绝妙能力。

虽然这不是一个完美的解决方案,但您可以检查 pageshow 事件的持久性,然后更直接地处理模式(因为您知道它已被缓存),就像立即隐藏它一样。

如果您还没有,请在此处查看这两个链接:

https://www.webkit.org/blog/427/webkit-page-cache-i-the-basics/ https://www.webkit.org/blog/516/webkit-page-cache-ii-the-unload-event/

他们很好地解释了页面缓存,并包含了我之前提到的 pageshowpagehide 事件的代码示例。

希望这会有所帮助!

【讨论】:

  • 真的很有帮助。谢谢。解决了我的问题,但在一个讨厌的庄园里。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-25
  • 2014-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多