浏览器回退,数据不刷新
一.常识
1.Bfcache:(Backward/Forward Cache, BF Cache)是指浏览器在前进后退过程中,会应用更强的缓存策略,表现为DOM,window,甚至JavaScript对象被缓存,以及同步XHR被缓存。
(1)兼容行:在移动浏览器总,除Chrome for Android/Android Browser之外的浏览器基本都会触发(兼容行有待考证,但目前Android和ios的微信浏览器是均支持的)
2.unload事件:页面关闭后,会触发unload事件
(1)使用:window.onunload = function() {}
(2)注意:如果浏览器有禁止页面主动弹出的功能,那么在onunload事件的事件处理函数中调用的window.open()方法会被当成恶意弹窗而被阻止
(3)兼容性
IE6/IE7/IE8,刷新页面、关闭浏览器、页面跳转之后都会执行
IE9,刷新页面会执行,页面跳转、关闭浏览器不执行
Firefox (包括Firefox3.6)关闭标签之后、页面跳转之后、刷新页面之后能执行,但关闭浏览器不能执行
Safari,刷新页面、页面跳转之后都会执行,但关闭浏览器不能执行
Opera/Chrome,任何情况下都不执行
【注1】:直接调用链接元素的 click 方法模拟鼠标点击事件,只有 IE 和 Opera 支持。
【注2】:使用 window.navigate 方法导航网页仅被 IE Opera 支持,可参考 MSDN 原文: navigate Method 。
【注3】: NavigateAndFind 方法处于 window.external 对象中,external 对象也仅 IE 支持,可参考 MSDN 原文: NavigateAndFind Method 和本站文章 BT9012: IE 的 external 对象提供的方法是 IE 特有的 。
结合汇总表可以看出:
- 点击一个链接到新页面、调用 window.open方法窗口名称设置值为 _self、指定一个 location.href 属性的新值、使用 submit 按键提交表单、调用 form.submit 方法在各浏览器下 onunload 事件都会被触发。
- 其他情况各个浏览器都有所不同。
3. pageshow事件:当一条会话历史记录被执行的时候将会触发页面显示(pageshow)事件。
(这包括了后退、前进按钮操作,同时也会在load事件出发后初始化页面时触发)
二.解决方案
1.用户在浏览新闻列表时,保存用户当前页面所滚动的条数,以及保存当前新闻列表加载到了第几页
使用sessionStorage对数据进行缓存
scrollTop:用户离开页面时,页面所滚动的距离( document.documentElement.scrollTop || document.body.scrollTop )
numPage:用户离开页面时,新闻列表当前所加载的页码数(接口的页码数)
newsCon:用户离开页面时,新闻列表容器所渲染的全部DOM节点整体保存
用户离开页面事件:onunload
2.用户进入页面,根据页面是否支持Bfcache
若支持Bfcache,则不做任何操作
若不支持Bfcache,则将sessionStorage的内容读取出来,渲染到页面上
(1)将 newsCon内容加在新闻列表容器里
(2)页面滚动到 scrollTop位置
(3)更新页面上控制向服务器请求数据的页码数 numPage