最近遇到一个用户体验问题,即从详情页回到列表页的时候,需要记住用户上次的位置,并且不刷新。
最开始返回使用的是 history.Go(-1),发现并不好使,也许在有些浏览器下有效果。折腾半天,突然看到HTML5里新加的 window.history.replaceState的方法,以下是亲自实践。
假设前提
列表页位list.html
- 获取列表的方法 getList()
- 支持分页
- 构建列表的方法dealWithResult()
- 到详情页的方法 viewDetail()
- 一个全局变量data,用来累加存储列表数据
详情页是 detail.html ,我们不需要在detail页面做任何动作,只需要修改list页面
方法实现
1.在viewDetail方法里面处理,记住当前页码、当前滚动条的位置、当前列表显示的所有数据
1 | var statedata = {}; |
2.替换state,不推荐使用 history.pushState方法,因为pushState每次都会加入一条数据,导致在列表页返回的时候会一直返回上一个state,不能退出列表页
1 | history.replaceState(statedata , "", "list.html"); |
3.在list.html的onload里面处理
1 | // 判断如果有history.state.data,说明是从详情页返回的 |
4.在dealWithResult方法里处理:
1 | function dealWithResult(listdata){ |
5.在getList方法里需要给全局变量statedata赋值
1 | if (curPage == 1) { |