浏览器回退,数据不刷新

5 年前

一.常识

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