window.history.go(-1);后退不刷新问题 移动端

文章提供了两种解决方案:一是通过监听pageshow事件并在必要时执行页面刷新,以处理不刷新问题;二是利用sessionStorage保存滚动条位置,并在页面显示时恢复,解决返回后滚动条自动置顶的问题。这种方法特别针对使用layer流加载的场景。

本文主要解决移动端用返回键后滚动条自动置顶(我是这个问题,可能是用了layer的流加载原因,导致返回后自动置顶)或者不刷新问题

  1. 不刷新问题

解决方法:

//在后退到达的界面上添加 判断是否是返回
window.addEventListener('pageshow', function (e) {
    if(e.persisted || (window.performance && window.performance.navigation.type == 2)){
        //刷新页面
        window.location.reload()
    }
});
  1. 滚动条自动置顶问题

解决方法:(其实就是把上面刷新那行改成操作滚动条,需要事先保存滚动条位置)

//页面离开时触发,保存当前滚动条位置
//这个好像有bug,说是要停留页面五秒才能正常触发,建议如果能捕获离开的方法的话,在那里保存更妥当
window.onbeforeunload = function () {
    var scrollPos;
    if (typeof window.pageYOffset != 'undefined') {
        scrollPos = window.pageYOffset;
    } else if (typeof document.compatMode != 'undefined' && document.compatMode != 'BackCompat') {
        scrollPos = document.documentElement.scrollTop;
    } else if (typeof document.body != 'undefined') {
        scrollPos = document.body.scrollTop;
    }
//保存滚动条位置
    sessionStorage.setItem("indexScTop",scrollPos)
}
//判断页面是否有滚动条(因为layer手机端流加载【返回上一页】时有重新渲染,防止设置滚动条复原太早)
function hasScrollbar() {
    return document.body.scrollHeight > (window.innerHeight || document.documentElement.clientHeight)
}
//判断用户是不是通过后退按钮访问本页面的
window.addEventListener('pageshow', function (e) {
    if(e.persisted || (window.performance && window.performance.navigation.type == 2)){
        if(sessionStorage.getItem("indexScTop")){
            // window.scrollTo(0,Number(sessionStorage.getItem("indexScTop")))
            const setIndexScTop = setInterval(function () {
                if(hasScrollbar()){
                    document.body.scrollTop = document.documentElement.scrollTop = parseInt(sessionStorage.getItem("indexScTop"));
                    sessionStorage.removeItem("indexScTop")
                    clearInterval(setIndexScTop)
                }
            },100)
        }
    }
});
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值