解决微信内置浏览器返回上一页强制刷新问题方法


Posted in Javascript onFebruary 05, 2017

微信内置浏览器在返回上一页面,且上一页面包含AJAX代码时,页面就会被强制刷新,极度影响用户体验。而我们想要的效果是:返回上一页面时,页面还停留在原来的状态,AJAX获取到的数据还在,滚动条也在原来的位置。

BINGO~

通过HTML5history API + 缓存可以做到这一点。

执行原理:

1.0、通过history API的 history.pushState或 history.replaceState 保存AJAX状态;

2.0、同时将AJAX获取到的数据缓存起来(可以考虑使用H5的localStorage或sessionstorage);

3.0、当返回到这个页面时,先获取窗口的history.state,如果不为空,表示保存的有状态,我们要做的就是恢复到这个状态;

4.0、读取缓存数据并加载。如果涉及到分页,且是滚动加载的形式,需要将当前页设置为history.state中的页数。

使用技术点介绍:

history API:

HTML5 history API只包括2个方法:history.pushState()history.replaceState(),以及1个事件:window.onpopstate

①history.pushState()

它的完全体是 history.pushState(stateObject, title, url),包括三个参数。

第1个参数是状态对象,它可以理解为一个拿来存储自定义数据的元素。它和同时作为参数的url会关联在一起。

第2个参数是标题,是一个字符串,目前各类浏览器都会忽略它(以后才有可能启用,用作页面标题),所以设置成什么都没关系。目前建议设置为空字符串。

第3个参数是URL地址,一般会是简单的?page=2这样的参数风格的相对路径,它会自动以当前URL为基准。需要注意的是,本参数URL需要和当前页面URL同源,否则会抛出错误。

调用pushState()方法将新生成一条历史记录,方便用浏览器的“后退”和“前进”来导航(“后退”可是相当常用的按钮)。另外,从URL的同源策略可以看出,HTML5 history API的出发点是很明确的,就是让无跳转的单站点也可以将它的各个状态保存为浏览器的多条历史记录。当通过历史记录重新加载站点时,站点可以直接加载到对应的状态。

②history.replaceState()

它和history.pushState()方法基本相同,区别只有一点,history.replaceState()不会新生成历史记录,而是将当前历史记录替换掉。

③window.onpopstate

push的对立就是pop,可以猜到这个事件是在浏览器取出历史记录并加载时触发的。但实际上,它的条件是比较苛刻的,几乎只有点击浏览器的“前进”、“后退”这些导航按钮,或者是由JavaScript调用的history.back()等导航方法,且切换前后的两条历史记录都属于同一个网页文档,才会触发本事件。

上面的“同一个网页文档”请理解为JavaScript环境的document是同一个,而不是指基础URL(去掉各类参数的)相同。也就是说,只要有重新加载发生(无论是跳转到一个新站点还是继续在本站点),JavaScript全局环境发生了变化,popstate事件都不会触发。

popstate事件是设计出来和前面的2个方法搭配使用的。一般只有在通过前面2个方法设置了同一站点的多条历史记录,并在其之间导航(前进或后退)时,才会触发这个事件。同时,前面2个方法所设置的状态对象(第1个参数),也会在这个时候通过事件的event.state返还回来。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
jQuery结合Json提交数据到Webservice,并接收从Webservice返回的Json数据
Feb 18 Javascript
jquery formValidator插件ajax验证 内容不做任何修改再离开提示错误的bug解决方法
Jan 04 Javascript
jquery 显示*天*时*分*秒实现时间计时器
May 07 Javascript
Angularjs 基础入门
Dec 26 Javascript
JS+CSS实现的竖向简洁折叠菜单效果代码
Oct 22 Javascript
基于jQuery实现简单的折叠菜单效果
Nov 23 Javascript
使用jQuery Mobile框架开发移动端Web App的入门教程
May 17 Javascript
jQuery简单注册和禁用全局事件的方法
Jul 25 Javascript
深入理解React中es6创建组件this的方法
Aug 29 Javascript
谈谈JavaScript中浏览器兼容问题的写法小议
Dec 17 Javascript
React Native中Mobx的使用方法详解
Dec 04 Javascript
基于js实现数组相邻元素上移下移
May 19 Javascript
js仿小米手机上下滑动效果
Feb 05 #Javascript
简单实现js无缝滚动效果
Feb 05 #Javascript
完美的js图片轮换效果
Feb 05 #Javascript
jQuery中ztree 点击文本框弹出下拉框的实例代码
Feb 05 #Javascript
使用JavaScript判断用户输入的是否为正整数(两种方法)
Feb 05 #Javascript
Vue.js学习示例分享
Feb 05 #Javascript
JavaScript定时器制作弹窗小广告
Feb 05 #Javascript
You might like
PHP 检查扩展库或函数是否可用的代码
2010/04/06 PHP
PHP递归删除目录几个代码实例
2014/04/21 PHP
javascript  Error 对象 错误处理
2008/05/18 Javascript
一个简单的JS鼠标悬停特效具体方法
2013/06/17 Javascript
Select标签下拉列表二级联动级联实例代码
2014/02/07 Javascript
jquery中each方法示例和常用选择器
2014/07/08 Javascript
使用jQuery仿苹果官网焦点图特效
2014/12/23 Javascript
Jquery 实现checkbox全选方法
2015/01/28 Javascript
javascript多行字符串的简单实现方式
2015/05/04 Javascript
JavaScript动态改变div属性的实现方法
2015/07/22 Javascript
js中获取 table节点各tr及td的内容简单实例
2016/10/14 Javascript
layer实现弹窗提交信息
2016/12/12 Javascript
JS实现延迟隐藏功能的方法(类似QQ头像鼠标放上展示信息)
2017/12/28 Javascript
JS和Canvas实现图片的预览压缩和上传功能
2018/03/30 Javascript
微信小程序内拖动图片实现移动、放大、旋转的方法
2018/09/04 Javascript
对vue中的事件穿透与禁止穿透实例详解
2019/10/28 Javascript
小程序实现图片移动缩放效果
2020/05/26 Javascript
如何在vue中使用jointjs过程解析
2020/05/29 Javascript
js定时器出现第一次延迟的原因及解决方法
2021/01/04 Javascript
详解Python Matplot中文显示完美解决方案
2019/03/07 Python
详解python使用turtle库来画一朵花
2019/03/21 Python
Python中查看变量的类型内存地址所占字节的大小
2019/06/26 Python
python3 webp转gif格式的实现示例
2019/12/10 Python
pytorch实现线性拟合方式
2020/01/15 Python
django列表筛选功能的实现代码
2020/03/27 Python
Python3使用 GitLab API 进行批量合并分支
2020/10/15 Python
使用placeholder属性设置input文本框的提示信息
2020/02/19 HTML / CSS
FC-Moto丹麦:欧洲最大的摩托车服装和头盔商店之一
2019/08/20 全球购物
请问如下代码执行后a和b的值分别是什么
2016/05/05 面试题
应届毕业生自我评价分享
2013/12/15 职场文书
垃圾桶标语
2014/06/24 职场文书
2014国庆65周年领导讲话稿(3篇)
2014/09/21 职场文书
2015年乡镇人大工作总结
2015/04/22 职场文书
2016公务员年度考核评语
2015/12/01 职场文书
解决Nginx 配置 proxy_pass 后 返回404问题
2021/03/31 Servers
MySQL导致索引失效的几种情况
2022/06/25 MySQL