搜尋

首頁  >  問答  >  主體

javascript - vue單頁應用程式阻止瀏覽器後退?

web app 單頁應用,是用vue vue-router寫的。

有些頁面是需要禁止後退的,我把目前頁面是否能後退寫在了路由元資訊meta裡面,例如為allowBack。

查到資料 禁止後退的方法是
history.pushState(null, null, location.href)

之前專案用的是​​vue1.0,解決方法是

1. 在全局的router.beforeEach 里面 判断当前路由的handler里面的allowBack变量是否为false
2. 如果为false 则 history.pushState(null, null, location.href)

現在改用vue2.0, 原來的方法不好使了,

現在的問題是,不知道該把 history.pushState(null, null, location.href) 這段程式碼放在哪裡
或是說 各位大神 有沒有什麼其他的解決方案?謝謝! !


其實主要的使用場景是這樣的,
tabbar點擊切換到不同的頁面,假如我現在在a頁面,點擊tabbar到b頁面,我不能透過返回鍵回到a頁面,但能透過點擊tabbar去a頁面

世界只因有你世界只因有你2728 天前2052

全部回覆(2)我來回復

  • 给我你的怀抱

    给我你的怀抱2017-07-05 11:04:51

    自問自答.....
    需求是:需要某個路由不能透過瀏覽器返回,同時不影響相互之間的切換
    整理一下解決方法 和 使用方法:

    1.在路由配置中給這個路由添加meta信息,例如:

    {
        path: '/home',
        component: xxx,
        meta: {allowBack: false}
    }

    2.在全域的router.beforeEach 函數裡面取得allowBack的狀態,同時更新vuex的allowBack的值,如:

    let allowBack = true    //    给个默认值true
    if (to.meta.allowBack !== undefined) {
        allowBack = to.meta.allowBack
        if (!allowBack) {
            history.pushState(null, null, location.href)
        }
    }
        
    store.dispatch('updateAppSetting', {
        allowBack: allowBack
    })

    這段程式碼得寫在next()的後面,因為寫在next()前面location.href並不是to的位址,這點跟vue1.0有點不同

    3.接下來就是最核心的了,在app.vue的mounted裡面註冊onpopstate事件:

    window.onpopstate = () => {
        if (!this.allowBack) {    //    这个allowBack 是存在vuex里面的变量
            history.go(1)
        }
    }

    去掉history.pushState(null, null, location.href) 也能防止後退,但是元件會重新渲染,所以這部分也很關鍵

    回覆
    0
  • 世界只因有你

    世界只因有你2017-07-05 11:04:51

    試試這樣看看

    //改写返回函数,返回的时候就会触发这个,
    //你也可以直接监听浏览器的返回事件,定义一个变量就行了,逻辑跟这个差不多
    Router.prototype.goBack = function () {
      this.isBack = true
      window.history.go(-1)
    }
    
    //假如当前页面是b页面,是由a页面点击过来的,现在b页面点击返回键,不能返回到a页面
    router.beforeEach( (to, from, next) => {
        //一当点击返回键,那么to就是a页面,from就是b页面
        if(!from.meta.allowBack){
            //进行页面判断,取出history里面之前的url,对这个url进行判断,看他等不等于to这个页面
            //因为安全原因,js没法获取history里的url,或者获取麻烦,所以你就要自己来记住url
            //就是每进入一个页面,你都去把之前的页面路径存在sessionStorage中
            //···判断过程省略
            //这里取出,然后对比就可以了
            //如果等于的话,直接禁止
            //取出结果
            var path = sessionStorage.getItem('path');
            //这个this我没有实验,应是指向router
           if(path == to.path && this.isBack){
               //什么都不做,只要不执行next方法,路由是不会跳的
               this.isBack = false;
           } else {
               //否则的话,就代表不是点击的返回键,该跳转就跳转
               //这里也存储
                sessionStorage.setItem('path',from.path);
                 this.isBack = false;
               next()
           }
        }else{
            //在这里存储
            sessionStorage.setItem('path',from.path);
            this.isBack = false;
            next();
        }
    });

    回覆
    0
  • 取消回覆