移动端页面,顶部左上角返回上一页按钮很常见,如下图所示:
按钮所在页面为目标页面,点击按钮返回到上一页,实现代码如下:
window.history.go(-1)
//或者
window.history.back(-1)
大部分浏览器、客户端,都是可以完美跳转,且会记住用户在上一页浏览的位置。在滑屏加载下一页的大列表页中,当滑屏加载了N页之后,看到可心的标题,随即进入到详细页,浏览完详细页后,从此页返回到列表页时,仍然是用户浏览的位置,是不是很棒。
可是,在安卓的微信中、设置了no-cache的App中,就有点恐怖了,列表页是可以回去的,不过浏览过的位置就没有了,直接是列表页的第一页,如果想继续原来位置浏览,就需要不断摩擦屏幕,可能都有火星子了,还没有到原来位置。对用户、对项目都是不友好的。
出现这种现象的原因:
1、记住位置:浏览器记住了页面的静态资源、js执行结果、页面渲染结果。当返回时,物是人也是。
2、记不住位置:浏览器只记住了页面静态资源,渲染结果、脚本执行结果没有记住。导致脚本重新执行,进而页面从第一页展示。或者浏览器压根就不缓存静态资源,直接导致静态资源重新加载、执行。当返回时,页面就不会记住原来的浏览位置。
怎么办呢?
返回脚本就这样了,只能从列表页下手了。不就是浏览器记不住嘛,咋整,给他写记忆。
具体方案如下:
1、列表页每条数据添加属性:数据唯一标识(ID)、所属页面(pageIndex)
2、点击列表页某条数据时,将添加的两个属性存到sessionStorage中
3、点击返回按钮到列表页时,获取列表数据时先检查sessionStorage中有存的属性,如果有,列表页按照sessionStorage中的页码加载对应页的数据。
4、对应页码数据加载好后,找到和sessionStorage中数据唯一标识相等的数据,获取该数据的位置,将页面定位到该数据出现在可视区域的合适位置即可。
5、删除存的sessionStorage数据。
存储sessionStorage代码:
根据项目需要,可以灵活修改存储内容
sessionInfoFn:function(){
var getSession = function(){
return{
threadId:sessionStorage.getItem('threadId'),
type:sessionStorage.getItem('type'),
pageIndex:sessionStorage.getItem('pageIndex')
}
};
var setSession = function(){
$('#allList,#hotList').off('click','.js_goToDetail').on('click','.js_goToDetail',function(){
var $this = $(this);
var type = $(".tabs li").eq(0).hasClass("active")?'all':'hot';
var threadId = $this.attr('data-threadid');
var theDetailPageIndex = $this.attr('data-pageIndex');
sessionStorage.setItem('threadId',threadId);
sessionStorage.setItem('type',type);
sessionStorage.setItem('pageIndex',theDetailPageIndex);
});
};
var removeSession = function(){
sessionStorage.removeItem('threadId');
sessionStorage.removeItem('type');
sessionStorage.removeItem('pageIndex');
};
return{
getSession:getSession,
setSession:setSession,
removeSession:removeSession
}
}
页面固定位置代码:
pageScrollToFn:function(type,threadId){
var listWrapObj = type=="all"?$('#allList'):$('#hotList');
listWrapObj.find('.js_detailLi').each(function(){
var $this = $(this);
var threadIdCur = parseInt($this.attr('data-threadid'));
if(parseInt(threadId)===threadIdCur){
var docHeight = parseInt($(document).height()); //整个文档高度
var targetObjTop = parseInt($this.offset().top); //目标元素距离页面顶部距离
var clientHeight = parseInt($(window).height()); //屏幕一半距离
var halfClientHeight = parseInt(parseInt($(window).height())/2); //屏幕一半距离
var atTopScrollTopHeight = targetObjTop-halfClientHeight;
var scrollTopHeight = 0;
if(atTopScrollTopHeight>0){ //处于屏幕下半部分包括没有显示在屏幕底部的数据
//页面中是最底部数据
var bottomDom = (atTopScrollTopHeight+clientHeight)-docHeight;
if(bottomDom>=0){ //页面滚动后,页面最后一条数据底部已经距离屏幕底部有空白距离,需要将滚动距离减少空白距离,才可正常加载下一页数据
scrollTopHeight = atTopScrollTopHeight-bottomDom-20;
}else{
scrollTopHeight = atTopScrollTopHeight;
}
}else if(scrollTopHeight<=0){ //处于屏幕上半部分
scrollTopHeight = 0;
}
setTimeout(function(){
$(window).scrollTop(scrollTopHeight);
},200);
}
});
}
如有更好的方案,或者不妥的地方欢迎指出。