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)
        }
    }
});
我会把这个方法放到router.beforeEach中,但是总是有bug,比如多次跳转后,后面的返回一直都是首页返回首页 import { useH5PageStore } from '@/store/h5Page' import { logout } from './login' // 后退的一级页面逻辑 const firstLevelPages = ['/userSettingH5', '/flowExecHistoryH5', '/aiAgentListH5'] /** 移动端路由跳转处理 */ export const h5RouteProcess = function (to: any, from: any, next: any) { const h5Store = useH5PageStore() if (h5Store.visibleSidebarMenu || h5Store.visibleDialog) { // 左侧栏关闭会话特殊处理 if (to.query?.isAllow === 'true') { return next() } if (h5Store.visibleSidebarMenu) { h5Store.setSidebarMenuVisible(false) } if (h5Store.visibleDialog) { h5Store.setVisibleDialog(false) } // 保持在原页面,跳转 return next(false) } const state = window.history.state if (state && state.forward === from.fullPath) { // 如果从一级页面返回到一级页面(且目标是首页),则返回首页 if (firstLevelPages.includes(from.fullPath) && firstLevelPages.includes(to.fullPath) && to.fullPath !== '/homeH5') { // backToHome() // return return next({ path: '/homeH5', replace: true }) } // 如果一级页面,返回到聊天页面,则返回首页 if (firstLevelPages.includes(from.fullPath) && to.fullPath === '/aiAgentH5' && to.fullPath !== '/homeH5') { // backToHome() // return return next({ path: '/homeH5', replace: true }) } // 如果从聊天页面返回到非智能体列表页面,则返回首页 if (from.fullPath === '/aiAgentH5' && to.fullPath !== '/aiAgentListH5' && to.fullPath !== '/homeH5') { // backToHome() // return return next({ path: '/homeH5', replace: true }) } // 参数页返回,如果打开了分组路径层级,则停止返回 if (from.fullPath === '/aiParamMarH5' && h5Store.paramPathList.length > 0) { h5Store.setParamPathBackTrigger() return next(false) } // 如果从首页返回,则返回登录页 if (from.fullPath === '/homeH5') { logout() return next(false) } } // else if (state &&state.back === from.fullPath) { // // console.log('浏览器前进') // } else { // // console.log('push/replace 或新进入') // } } /** 返回首页 */ // function backToHome() { // for (let i = window.history.length - 1; i >= 0; i--) { // window.history.go(-1) // if (window.history.state && window.history.state.back === '/homeH5') { // break // } // } // }
08-22
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值