vue移動端更改手機物理按鍵返回問題


又是一天見面的日子,春季盎然~ 已經無法在繼續抒情下去了,寫作水平驟降!!

今天記錄下應用cordva+vue生成的apk 在手機物理返回時遇到的問題;

前提說~~應用vue,我們可以自定義上一路徑和下一路徑,其實就是在開發webapp時,我們通常會在webapp的頭部導航欄自定義返回的上層路徑,但是,手機的物理路徑並不是像上層路由那樣直接返回了,手機物理返回,按照html5 的history的路徑進行返回,因此想要手機物理返回也按照我們和頭部一樣的返回,還需要自己定義;

方法一:

      使用路由鈎子 應用beforeRouterLeave路由離開時進行監聽以及更改要返回的路徑:代碼如下:

 

 

beforeRouteLeave (to, from, next) { 
   this.$router.push({path: 'index'})//返回鍵要返回的路 
}

 

  缺點:如果頁面上有其他的路由跳轉,這樣也會調用到beforeRouteLeave里面,這樣其他的路由就會失效~有點不符合我們所需

基於方法1,進行加工

beforeRouteLeave (to, from, next) {
if (this.flag) {//這是一個點擊事件 
        next(); //正常執行手機返回鍵也是正常返回上一個路由
     } else {
        if (from.path !== 'index') { //要離開的路由不是index
            next();//
         } 
        this.$router.push({path: 'index'})//返回鍵要返回的路由
    }
}

  優點:監控了頁面其他路由的點擊事件,這樣在返回到指定的頁面中肯定是無問題的,排除了其他路由的影響~給個贊👍

方法二:

cordova 打包成apk時應用的webview的內核,因此可以應用頁面監聽的方法:popstate方法對頁面返回時進行監聽~~

 mounted(){
     if (window.history && window.history.pushState) {
         history.pushState(null, null, document.URL);
         window.addEventListener('popstate', this.fun, false);//false阻止默認事件
      }
   }, 
   destroyed(){
       window.removeEventListener('popstate', this.fun, false);//false阻止默認事件
     },
    methods:{
      fun(){
       this.$router.push({'name':'index'});
      }
    },

  在vue的mounted階段添加監聽函數~~,觸發后可以調用fun函數進行自定義的返回路由,返回后進行停止監聽

       缺點:如果是大型的頁面,多處都存在自定義的返回路徑,這也是一筆不少的代碼,經過驗證,這是一個很好的方法,但是這個方法有一定的缺點,如果頁面中存在着報錯,那就無法執行這個代碼了(比如,我們引用了一些框架,可能會缺少參數,直接堵塞了)

方法三:

全局定義:更適合退出app系統;首先要安裝mui的框架 npm就好了~

將下面的這段代碼直接插入到index.html中,試驗過:可以直接退出app的使用,

 

<script>
      mui(' body').on('tap', 'a', function() {
    document. location.href = this.href;
    
    });
    mui.init({
        swipeBack: false, //關閉右滑關閉功能(默認就是false)
        keyEventBind: {
        backbutton: true //開啟back按鍵監聽( 默認就是true)
        }
    });
    var quitTime = null;
    mui.plusReady(function(){
    mui.back = function(){
        //首次按鍵,提示“再按次退出應用’
        if(!quitTime){ 
        //記錄第次按下回退鍵的時間 
        quitTime = new Date().getTime();
        //回退到上一頁面
        window.history.go(-1); 
        setTimeout(function(){
        //1s中后清除
        quitTime = null;
        },1000);
    }
    else{
           if((new Date().getTime()-quitTime) < 1000){
    
              plus.runtime.quit();
          }
       }
       };
    });

 

  個人思考如果頁面返回的自定義路由比較多,其實全局監聽popstate的函數,定義全局變量進行更改~需要實踐;

走坑走坑~~就找到方法解決

~~~~~~~~~~~~~~~~~~~~~·

                                                           你想成為幸福的人嗎?但願你首先學會吃得起苦。——屠格涅夫

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM