移动端H5页面返回并且刷新页面(BFcache)

2023-11-03

项目中的需求:点击浏览器中的返回按钮,要让页面重新加载资源。因为这部分的资源每次去加载的内容都不一样,如果返回的时候,还是看到原先的内容,那做这个内容块的意义就很小了;而如果用户看完了这部分内容,再返回来的时候,这个地方换成了新的内容,这样就能体现这部分的价值了。

而对于浏览器来说,大部分浏览器的返回是直接使用缓存的,不会执行任何的javascript代码。原因:部分浏览器在后退时不会触发onload事件,這是HTML5世代浏览器新增的特性之一——Back-Forward Cache(简称bfcache)

什么是bfcache?

bfcache,即back-forward cache,可称为“往返缓存”,可以在用户使用浏览器的“后退”和“前进”按钮时加快页面的转换速度。这个缓存不仅保存页面数据,还保存了DOM和JS的状态,实际上是将整个页面都保存在内存里。如果页面位于bfcache中,那么再次打开该页面就不会触发onload事件

pageshow事件

这个事件在用户浏览网页时触发,pageshow 事件类似于 onload 事件,onload 事件在页面第一次加载时触发, pageshow 事件在每次加载页面时触发,即 onload 事件在页面从浏览器缓存中读取时不触发。

pagehide事件

该事件会在用户离开网页时触发。离开网页有多种方式。如点击一个链接,刷新页面,提交表单,关闭浏览器等。pagehide 事件有时可以替代 unload事件,但 unload 事件触发后无法缓存页面。

persisted属性

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

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

不同的浏览器在对当前窗口‘打开’历史记录中的前一个页面的表现上并不统一,这和浏览器的实现以及页面本身的设置有关系。

解决方案:

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

 window.addEventListener('pageshow', function (e) {
     if (e.persisted) {
         window.location.reload()
     }
})

在uc和微信中测试通过,但是在某些安卓手机自带的浏览器中无效。

javascript监听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>");
    });
});

设置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消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。
注:有些情况下设置清除缓存也没有起到作用,我自己做的这个h5页面就没有起到效果。具体情况还是要具体分析。

我遇到的情况:

<div class="content">
     <iframe id="iframe" src="https://cpu.baidu.com/xx/xx/xxx" frameborder="no" scrolling="no"></iframe>
</div>

这个iframe中的地址每次刷新页面都会有不同的内容推送给用户。进入iframe中的内容之后,按返回按钮返回来想进行页面自动刷新,为的就是让用户看到新的内容。

做法:

使用pageshow进行整个页面刷新

 window.addEventListener('pageshow', function (e) {
     if (e.persisted) {
         window.location.reload()
     }
 })

这样可以实现。

后面又觉得不妥,没有因为这个小部分而进行整个页面刷新,想到了另一种思路:因为这个iframe中的内容是动态的,可以对其进行定时器设置,如下:

 let iframe = document.getElementById('iframe')
 setInterval(() => {
     iframe.setAttribute("src", "https://cpu.baidu.com/xx/xx/xx");
 },15000)

这样也可以实现自己的功能。

最后可以结合一下:

let iframe = document.getElementById('iframe')
window.addEventListener('pageshow', function (e) {
    if (e.persisted) {
        iframe.setAttribute("src", "https://cpu.baidu.com/xx/xx/xx");
    }
})

这样做也有好处,可以避免使用定时器,对网页的性能也是比较好。但是这个方法在返回的时候,可以看到iframe里面内容的重新加载,会有一个时间间隙。

 

转载于:https://www.cnblogs.com/zengfp/p/9910473.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

移动端H5页面返回并且刷新页面(BFcache) 的相关文章

随机推荐

  • 羞愧的“码龄3年”开篇之作

    打开账号发现码龄已经三年了 已经忘记了是什么情况之下注册了账号 怎能让账号下空空如也 先来个开篇之作留个痕迹 源于前两天学习了一下脚本语言 今天做一个内容回顾记录一下 以下是学习过程中有些不懂得地方查了各个博客后的整体总结 只针对于个人的只
  • Hadoop集群配置——1

    参考 Python Spark 2 0 Hadoop机器学习与大数据实战 林大贵 著 清华大学出版社 一 Hadoop集群 Hadoop集群需要4台服务器才可以建立 可以进行并行处理 所以在虚拟机上创建了master data1 data3
  • Android Studio Electric Eel提示Gradle插件报错问题的解决方法

    新建一个工程 执行Sync gradle files报错 提示Gradle plugin找不到或者运行库版本不兼容 会有不同的错误提示 摘录部分错误提示如下 解决方法 需要使用JDK 11编译工程 设置步骤 File gt Project
  • C++ 入门算法,你必须懂的“顺序表”

    顺序表简介 顺序表是简单的一种线性结构 他们可以说是连续存储元素的 也可以称之为数组 顺序表可以快速定位到第几个元素的位置 中间不允许有空值 插入 删除时需要移动大量的元素 顺序表的三个要素 用elems记录存储位置的基地址 分配一段连续的
  • 数字信号处理综合实验——Matlab实现DTMF信号的产生与提取

    数字信号处理综合实验 一 实验内容及要求 实验内容 综合运用课程所学相关知识 根据实际信号的频谱特性 确定数字滤波器设计技术指标 设计相应的数字滤波器 实现DTMF信号的提取 设计要求 1 通过查阅资料 自学电话中DTMF信号的产生与检测方
  • python处理wrf气象数据_气象数据处理:NetCDF文件处理

    NetCDF文件是自描述的二进制数据格式 所谓自描述就是自带属性信息 这和一般的雷达基数据格式不同 一般的雷达数据也是二进制的 但不是自描述的 而是需要额外的数据格式文档来说明数据格式 而NetCDF文件中包含了描述变量和维度的元数据信息
  • Edge被2345浏览器劫持 解决方法

    Edge 被 hao123 劫持解决方法 edge被hao123锁定改不了 小子宝丁的博客 CSDN博客
  • 无法加载文件 C:\Users\xxx\Documents\WindowsPowerShell\profile.ps1

    无法加载文件 C Users xxx Documents WindowsPowerShell profile ps1 本次尝试解决方法 使用管理远打开 windows powershell 运行以下内容 Set ExecutionPolic
  • mysql time类型解析_mysql时间数据类型解析

    1 MySQL的五种日期和时间类型 MySQl中有多种表示日期和时间的数据类型 其中YEAR表示年份 DATE表示日期 TIME表示时间 DATETIME和TIMESTAMP表示日期和实践 它们的对比如下 TEAR 字节数为1 取值范围为
  • SpringMVC(十三) RequestMapping 使用servlet原生API作为参数

    SpringMVC支持以下Servlet方法 HttpServletRequest HttpServletResponse HttpSession Writer Reader Locale InputStream OutputStream
  • 内核(kernel)的链接脚本

    1 链接脚本的产生 kernel的链接脚本和uboot的不同 uboot的链接脚本是源文件的一部分 而kernel的链接脚本在源文件中是找不到的 要经过编译才会产生 链接脚本的名字是vmlinux lds 由汇编文件vmlinux lds
  • 【多模态】15、MobileSAM

    文章目录 一 背景 二 方法 2 1 耦合蒸馏 2 2 从半蒸馏到解耦蒸馏 三 效果 论文 FASTER SEGMENT ANYTHING TOWARDS LIGHTWEIGHT SAM FOR MOBILE APPLICATIONS 代码
  • 实现strcpy功能

    实现strcpy的功能 运行结果
  • QT编译FreeType和Little CMS

    一 FreeType FreeType是个开源字体引擎 可以移植到arm中 也可以在桌面软件中使用 下载FreeType 这里使用FreeType 2 10 4版本 使用QT Creator新建工程 工程名为FreeType 解压后 只取出
  • yarn创建vite项目——遇见的错误及解决方法

    今天尝试做一个vue3 vite的组件库项目 没想到第一步就开始出现问题 改了整整一天 那么我们开始 首先 目录中间包含空格 导致报错 会出现这种错误时因为 c program files 这里 中间有一个空格 很显然yarn帮并不能通过这
  • mac安装mysql workbench,Mac OS X 上的“MySQLWorkbench quit unexpectly.”问题

    今天 在我的Mac OS X 10 8 4 系统上使用MySQLWorkbench 6 0 7 在启动之时 就遇到问题不能启动 提示对话框为 MySQLWorkbench quit unexpectly 然后 有 ignore report
  • 软件测试之检查产品说明书

    场景 学习 软件测试 第4章节 检查产品说明书 关于黑盒测试和白盒测试 黑盒测试只需要知道软件要做什么 而无法看到盒子里的软件是怎么运行的 只要进行一些输入 然后输出结果 目前我们做的基本上是这种测试 我们知道输入和预计输出 只要把按操作输
  • GCC编译选项补充

    一 出错检查和警告提示选项 pedantic error 允许发出ANSIC标准所列的全部错误信息 w 关闭所有警告 Wall 允许发出GCC提供的所有有用的报警信息 Werror 把所有的告警信息转化为错误信息 并在告警发生时终止编译过程
  • vue---制作表格+分页功能

    小白第一次尝试使用vue制作分页功能 分为两个部分 一个是表格部分 一个是下面分页的按钮部分 表格部分用最熟悉的html标签table table tr th 字母 th tr tr td td td td tr table
  • 移动端H5页面返回并且刷新页面(BFcache)

    项目中的需求 点击浏览器中的返回按钮 要让页面重新加载资源 因为这部分的资源每次去加载的内容都不一样 如果返回的时候 还是看到原先的内容 那做这个内容块的意义就很小了 而如果用户看完了这部分内容 再返回来的时候 这个地方换成了新的内容 这样