【修复BUG】vue项目如何控制页面只能在浏览器打开一个窗口,多个窗口时关闭当前新开的窗口

前提条件:

对以下文章代码进行修复【本文章为转载与修复已知问题】

版权声明:本文为CSDN博主「my_tm」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:

vue项目如何控制页面只能在浏览器打开一个窗口,多个窗口时关闭当前新开的窗口_layu 当有第二个相同的项目在浏览器窗口打开时,去进行关闭-CSDN博客

代码中的数字123,代表我写代码时候的思考思路,可以跟着数字去理解代码(菜鸟自研,代码虽烂,但功能齐全)

一.在app.vue的mounted中添加

1.当有窗口后进行缓存,当有第二个相同的项目在浏览器窗口打开时,根据这个作为判断的条件之一,去进行关闭

2.只需要一个isOpen判断的话,如果只打开了一个窗口,第一次是正常的,但是如果强制刷新,isOpen也会存在,所以刷新的时候也会被判断已经打开相同窗口,reload就是用来判断是否当前是刷新状态

3.监听页面刷新触发事件,在方法中存上我们的reload

4.刷新储存的属性需要删除掉,不然新开第二个窗口的时候,里面也会同时有reload和isopen,这样你新开的窗口就会是刷新的判断,就不会被关闭

5.这里进行持续储存的原因是,当你新打开第二个窗口,然后判断到当前已经有重复窗口打开,然后你强制关闭了重复打开的窗口,那个这个时候,你储存的isOpen就会执行下面页面销毁时执行的方法,会删除掉isOpen,当你继续打开新的窗口的时候,这个时候就会正常打开,然后继续打开第四次窗口的时候又可以正常关闭(偶数次都可以正常关闭,基数次数都无法关闭),所以就需要让原本打开的第一个窗口,一直储存着isOpen

6.当页面更换地址的时候,也会触发页面刷新的函数,所以关闭的时候把reload清理掉

7.这一步是上线以后发现的问题,当用户打开页面的时候,直接点击关机,这个时候,页面的销毁函数不会执行,缓存也不会被清除,所以isOpen就会在开机的之后,一直存在,陷入打不开页面的循环,所以我们可以先清除一遍,如果有存在的页面,那么会一直储存isopen,如果清除之后,没有isopen,那就说明当前没有多余的页面,就刷新一下当前页面,不做关闭操作

export default {
    data() {
        return {
            timer2: null,
            timer3: null,
            timer4: null,
            timer5: null,
        }
    },

    destroyed() {
        // 进行监听销毁
        clearTimeout(this.timer2)
        clearTimeout(this.timer3)
        clearTimeout(this.timer4)
        clearInterval(this.timer5)
        this.timer2 = null
        this.timer3 = null
        this.timer4 = null
        this.timer5 = null
        window.removeEventListener('beforeunload', e => this.beforeunloadHandler(e))
        localStorage.removeItem('isOpen')
        localStorage.removeItem('reload')
        console.log('进行监听销毁 isOpen,', localStorage.getItem('isOpen'))
        console.log('进行监听销毁 reload,', localStorage.getItem('reload'))
    },

    created() {
        window.addEventListener('beforeunload', (e) => this.beforeunloadHandler(e)) // 3
        const isOpen = localStorage.getItem('isOpen') // 1
        const reload = localStorage.getItem('reload') // 2
        this.timer2 = setTimeout(() => {
            localStorage.removeItem('reload') // 4
        }, 2000)
        console.log(isOpen, reload, isOpen == 'open', reload != 'reload', 'reload')
        if (isOpen == 'open' && reload != 'reload') {
            localStorage.removeItem('isOpen')
            localStorage.removeItem('reload')
            this.timer3 = setTimeout(() => {
                const open1 = localStorage.getItem('isOpen') // 7
                const load1 = localStorage.getItem('reload')
                if (open1 == 'open' && load1 !== 'reload') {
                    this.$alert('网站重复打开即将关闭', {
                        confirmButtonText: '确定',
                        callback: (action) => {}
                    })
                    this.timer4 = setTimeout(() => {
                        window.opener = null
                        location.href = '/'
                        window.close()
                        localStorage.removeItem('reload')
                        localStorage.removeItem('isOpen') // 6
                    }, 2000)
                } else {
                    history.go(0)
                }
            }, 1000)
        } else {
            this.timer5 = setInterval(() => {
                localStorage.setItem('isOpen', 'open') // 5
                console.log(5)
            }, 1000)
        }
    },

    methods: {
        beforeunloadHandler(e) { // 根据事件进行操作进行操作
            console.log(e)
            console.log('浏览器刷新')
            localStorage.setItem('reload', 'reload')
        }
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值