安卓微信window.history.go返回上一页后页面刷新,无法记录浏览位置的解决方案

移动端页面,顶部左上角返回上一页按钮很常见,如下图所示:
在这里插入图片描述
按钮所在页面为目标页面,点击按钮返回到上一页,实现代码如下:

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);
                }
            });
        }

如有更好的方案,或者不妥的地方欢迎指出。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值