浏览器往返缓存--back-forward cache(bfcache)
浏览器往返缓存--back-forward cache(bfcache)
什么是 bfcache ?
bfcache,即 back-forward cache,可称为往返缓存,可以在用户使用浏览器的 后退 和 前进 按钮时加快页面的转换速度。这个缓存不仅保存页面数据,还保存了 DOM 和 JS 的状态,实际上是将整个页面都保存在内存里。如果页面位于bfcache中,那么再次打开该页面就不会触发 onload事件。这是 HTML5 世代浏览器新增的特性之一。
这就产生了一个问题,如果希望用户每次打开这个页面的时候都能够获取到最新的资源,因为 bfcache 的存在,不做特殊的处理这个效果就无法达到。
解决方案
- 监听
pageshow事件,若页面是来自bfcache,则对页面进行刷新:
window.addEventListener('pageshow', function (e) {
if (e.persisted) {
window.location.reload()
}
})
- 监听
pagehide事件阻止页面进入bfcache:
window.addEventListener('pagehide', function (e) {
var dom = document.body;
dom.children.remove();
setTimeout(function () {
dom.appendChild("<script type='text/javascript'>window.location.reload();<\/script>");
});
});
pageshow 事件
pageshow 事件在页面呈现的时候触发, 类似于 onload 事件,但是 onload 事件是在文档加载完毕的时候触发,如果页面是从浏览器缓存中读取时不会触发; pageshow 事件则是在每次加载页面时都触发。
pagehide 事件
该事件会在用户离开页面时触发。离开页面有多种方式。如点击一个跳转链接,刷新页面,提交表单,关闭浏览器等。pagehide 事件与 unload 事件 unload类似,但是如果离开页面时页面进入了缓存则不会触发 unload 事件, 同理,unload 事件触发后无法缓存页面。
persisted 属性
pageshow 事件和 pagehide 事件的 event 对象还包含一个名为 persisted 的布尔值属性。对于 pageshow 事件,如果页面是从 bfcache 中加载的,则这个属性的值为true;否则,这个属性的值为false。对于 pagehide 事件,退出页面之后,如果页面被保存在 bfcache 中,则这个属性的值为true;否则,这个属性的值为false。
不同的浏览器在对当前窗口‘打开’历史记录中的前一个页面的表现上并不统一,这和浏览器的实现以及页面本身的设置有关系。
- 设置
meta标签,清除页面缓存:
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="0" />
Cache-Control 指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置 Cache-Control 并不会修改另一个消息处理过程中的缓存处理过程。请求时的缓存指令包括 no-cache、no-store、max-age、max-stale、min-fresh、only-if-cached,响应消息中的指令包括 public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age。各个消息中的指令含义如下
Public: 指示响应可被任何缓存区缓存;Private: 指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效no-cache: 指示请求或响应消息不能缓存no-store: 用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。max-age: 指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应min-fresh: 指示客户机可以接收响应时间小于当前时间加上指定时间的响应max-stale: 指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。

浙公网安备 33010602011771号