微信浏览器中禁用后退按钮并弹窗

微信浏览器中禁用后退按钮并弹窗

最近在做项目的时候,有一个需求是当用户点击微信浏览器自带的后退按钮时,阻止浏览器自带的后退操作,并弹窗让用户自己选择是否后退。下面来看具体的解决方案。

解决方法

从原理上来说,我们是无法阻止浏览器的后退操作的,包括使用event.preventDefault()。所以我们只能换一种思路,浏览器后退操作其实就是从历史记录栈中pop一个元素。所以,只要我们在进入应用的时候多push一个记录,这样当浏览器后退的时候pop的就是我们之前push的元素,从而达到保持当前的history state的目的,再通过监听popstate事件,进行我们需要的一系列操作。

代码
pushHistory () {
    let state = {
        title: '',
        url: window.location.href
    };
    window.history.pushState(state, state.title, state.url);
}

首先是pushHistory,这个方式主要使用了浏览器中history的pushState方法,往state栈中push了一个新的state。

windowListener () {
    let that = this
    this.$vux.confirm.show({
        title: '提示',
        content: '确定要放弃此次编辑?',
        onCancel () {
            that.pushHistory()
        },
        onConfirm () {
            window.history.back()
            that.replace('/demo/mine')
        }
    })
 },

接下来是listener方法,当监听到state变化的时候,进行弹窗,用户点击取消时,再次使用pushHistory方法push一个state,这样就可以实现禁用后退按钮功能,确定的时候要使用一个window.history.back(),原因是发现使用replace跳转出去后会存在一个空的state,导致后退按钮点两次才会生效,所以使用hisotry.back()方法后退一次,将空的state清除,这样state栈就是正常的了。

mounted () {
    this.pushHistory()
    window.addEventListener('popstate', this.windowListener, false)
},
beforeDestroy () {
    window.removeEventListener('popstate', this.windowListener)
}

最后就是在mounted中对popstate的监听和beforeDestroy中的解绑。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值