问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

bfcache相关 pageshow事件

发布网友 发布时间:2024-10-04 07:28

我来回答

1个回答

热心网友 时间:2024-10-10 10:40

让我们探讨一种情况:在列表页面中,预期每次网页加载后,onload()事件都会以ajax方式重新获取最新的列表数据。因此,点击后退至该页面时,用户应该能立即看到最新的列表资料。然而,在某些浏览器中,回到上一页时不会自动加载更新后的资料,需要刷新才能重新加载。这是因为部分浏览器在后退时不会触发onload事件,这是HTML5时代浏览器新增的功能之一——Back-Forward Cache(简称bfcache)。

什么是bfcache?

熟知的《JavaScript高级程序设计》一书中提到了bfcache:bfcache,也称为“往返缓存”,可以在用户使用浏览器的“后退”和“前进”按钮时加快页面的转换速度。这个缓存不仅保存页面数据,还保存了DOM和JS的状态,实际上将整个页面都保存在内存中。如果页面位于bfcache中,再次打开该页面就不会触发onload事件。

pageshow事件

这个事件在页面显示时触发,无论页面是否来自bfcache。在重新加载的页面中,pageshow会在load事件触发后触发;而对于bfcache中的页面,pageshow会在页面状态完全恢复的那一刻触发。

pagehide事件

该事件会在浏览器卸载页面的时候触发,而且是在unload事件之前触发。

persisted属性

pageshow事件和pagehide事件的event对象包含一个名为persisted的布尔值属性。

对于pageshow事件,如果页面是从bfcache中加载的,则这个属性的值为true;否则,这个属性的值为false。

对于pagehide事件,如果页面在卸载之后被保存在bfcache中,则这个属性的值为true;否则,这个属性的值为false。

不同的浏览器在处理当前窗口打开历史记录中的前一个页面时并不统一,这与浏览器的实现和页面本身的设置有关。

测试

测试代码和线上示例已提供,这里不再赘述。

测试结果表明,Safari、Firefox、UC、qq浏览器、browser都有bfcache功能。回到上页时,Safari、UC和qq浏览器不会触发load事件;IE、Firefox、Chrome和Opera支持pageshow事件,但会触发load事件;browser不触发任何事件。

解决方案

Firefox的开发者文档提供了一些思路:页面监听unload或beforeunload事件;页面设置了“cache-control: no-store”;网站使用HTTPS同时页面至少满足以下一个条件:“Cache-Control: no-cache”、“Pragma: no-cache”;设置请求头“Expires: 0”或“Expires”的值为“Date”之前的值(除非“Cache-Control: max-age=”也被设置了);页面在用户前进后退时还没有完全加载完或者它有正在进行的网络请求,例如XMLHttpRequest;页面正在进行IndexedDB操作;页面在一个frame内,并且用户在这个frame内跳转到了一个新的网页,这里将被缓存的是新载入的网页。

监听pageshow事件阻止页面进入bfcache

一言不合放代码

window.addEventListener('pageshow', function(e) {

if (e.persisted) {

window.location.reload()

})

Safari、UC、qq浏览器测试通过。但是,UC、qq浏览器会先闪过bfcache中的页面,因为pageshow事件在load事件触发之后才触发。browser依然会保留红色,我认为是因为browser回到上页时不触发任何事件。

监听pagehide事件阻止页面进入bfcache

一言不合放代码

window.addEventListener('pagehide', function(e) {

var $body = $(document.body);

$body.children().remove();

// 要等到回调函数完成,用户按返回才执行script标签的代码

setTimeout(function() {

$body.append("")

总结

对于PC浏览器,设置禁用页面缓存的header即可实现后退刷新。对于支持bfcache/page cache的移动端浏览器,可以通过JS监听pageshow/pagehide,在检测到后退时强制刷新。在前两个方案都无效的情况下,可以在HTML中写入服务端页面生成版本号,与本地存储中的版本号对比判断是否发生了后退并使用缓存中的页面。

原文链接:(链接省略,实际使用时应提供原文链接)
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
八月中国最凉快的地方 八月份哪里最凉快,去哪旅游好?美丽的地方 乱字同韵字是什么意思 华硕笔记本电脑触摸板怎么开笔记本电脑触摸板怎么开启和关闭_百度知 ... 陕西职务侵占案立案准则 结婚后我的恋情维系了十年,怎么做到的? 玉米仁子饭产自哪里 中国期货交易所的交易品种有哪些? 历史要怎么读,有啥诀窍 高中历史诀窍 JavaScript中常见的BOM操作全解析(下)! ...方法,并且打开这个页面的时候就执行这个JS方法 怎么让山药不变色 如何让山药不变色 西君的抖音伤感说说 ...加一个无线路由器可以同时连接4台以上终端吗? 电信光纤改造接无线路由器最多能上几个手机 尼蒙尔克素对老年人有效果吗? 安装光纤的无线路由器能同时链接几个手机和电脑, 联通OPPOA33支持联通4g吗,选择不了4g 3g 2g 江鲢的做法 江鲢是什么鱼? 我是一名心理系的大二学生,想确定自己的努力方向。 我是大一新生,想搞科研项目,但我知识面窄,想寻求老师指导 在济南新东方学西点技术需要多久? 女生学西点怎么样?济南有西点学校吗 简述白鹿原中白嘉轩的人物形象 遥控不起作用,可以用于开关电视,但其他按键一按就会在电视屏幕显示“不... 小米手机电信版前面有摄像头吗 我的电信版小米1S 做了三清后,也升了级,能用全球通的卡,神州行的也行... 刚买的电信版小米手机用上海移动全球通GSM 的卡 显示无服务啊,网络设置... ...通道上还有柱子,专柜被切去一块,有下行消防通道 personal和individual有什么区别? 手机自动重启是怎么回事教你一招修复手机开不了机故障 我在跑滴滴时不小心删除了我车子,现在还是要想添加我原来的车子... 国防科技大学指挥类毕业下放到边防连队回不来的多吗? 国防科技大学只指挥类有多大的概率在部队干一辈子 鲁迅先生的去死对中国有什么巨大的影响 合同解除是否具有溯及力 快乐渔夫游戏简介 快乐捕鱼如何打高分? John Petrucci音乐学习 关于企业管理的杂志有哪些 ...脸大,体重58kg,偏胖,皮肤很白,想换个发型。现... 潘石榴盆栽能活吗? 盆栽番石榴怎么种植 盆栽番石榴的种植方法 盆栽番石榴为什么叶子发黄⦓杯状? 越听越有道理的十句话,你对哪一句最有 三十岁算新的什么 什么是合同溯及力,怎么解释?