微信小程序页面返回按键控制

今天在开发公司内部的小程序项目时,遇到了一个问题,就是控制手机返回按键的问题,原本我觉得很快就能够解决的,没想到最后我用了快一天的时间,才给作好,并且还不是我最初想到的方法。javascript

场景

公司开发的小程序因为业务须要,要把后台管理的部分页面也给搬到小程序中,因为功能相同,且后台使用的elementui,作一下手机适配就能够拿来用,因此,直接用web-view来实现就能够了,然而,这个页面是“个人”页面,即须要作为三个tabBar之一的页面。java

个人作法是:在consumer(微信小程序的一个page)中的onshow方法中直接转到一个空白页面(跳转页面),在空白页面里使用webview来跳转页面(由于consumer有底部导航,而须要跳转到的页面也有底部导航,若是直接在consumer中直接跳转,目标页面下就会有两个导航,且其余页面也须要转到这个页面,因此这个页面的底部导航还不能去掉),好了,页面跳转很成功,然而 ,恶心的事儿来了,当我点击浏览器上的返回或手机上的物理返回按键时,就出问题了,页面会返回到consumer这个页面,而后在onshow方法内又跳回到h5页面,如此循环,周而复始。web

有问题就要解决,这个明显就是返回时出现了问题,我就只得监听返回按键,而后跳转到我想要的页面小程序

methods:{
	//  返回到微信小程序的首页
	goBack(){
            wx.miniProgram.switchTab({
                url:"/pages/home/home"
            })
        },
    //  监听popstate事件,将空白页面压入到history栈中
        popstate(){
            let self = this;
            function pushHistory(){
                let state = {title:"",url:"#"}
                window.history.pushState(state,state.title,state.url)
            }
            pushHistory();
            window.addEventListener("popstate",e=>{self.goBack},false);
        }
}
mounted(){
        this.popstate();
},
beforeDestroy(){
        let self = this;
	//  移除监听,防止其余页面受影响
        window.removeEventListener("popstate",e=>{self.goBack},false)
    },

而后开开心心的去测试了,一测试,发现出了个问题,这个问题很奇葩:我点击返回时,不起效,我觉得是我写的有问题,就加上了window.onload,不行,又加了this.$nextTick不行,加上timout仍是不行,后来,我点了一下页面(就是点了一下,不是拖动),而后返回了一下,能够了,居然能够了,而后再刷新一下页面,再返回,又不行了,再点击一下,就又能够了,WOF,什么鬼,我觉得找到缘由了,就在mounted中经过查找dom的方法,给一个标签添加了点击微信小程序

//  在页面中添加 了一个id为autoClick的div
document.getElementById("autoClick").click();

而后再去试试,仍是不行,真是见鬼了,为何,为何点一下就能够了,不点一下就不行,是我写错了仍是elementui对事件监听作了特殊处理。浏览器

新想法新思路

虽然不知道为了什么,可是,我不用了,好吧,想其余方法吧,已知我在consumer页面的onshow方法中作了页面跳转,若是我进入到consumer页面时,先判断一个时间,若是有时间证实多是我从h5返回到这个页面的,那我就跳转到home页面,而后把这个时间给删掉。若是没有这个时间,证实我是第一次进入到这个页面,那我就能够放行,而后把时间给存一下。为了防止从h5页面直接经过底部导航跳转到其余页面而没有删除时间,因此,须要在底部导航跳转的其余页面内都加上移除这个时间的方法,OK,完美解决,不过不知道有没有bug还须要测试,有知道这个问题出现的原理的大佬请帮我解惑一下,我正是百思不得其解微信

//  这个是consumer.js中的方法
onshow(){
	let _time = wx.getStorageSync("now");
    if(!_time){//没有时间,证实是须要进入到myinfo页面
      wx.setStorageSync("now", new Date().getTime());
      wx.navigateTo({
        url: '/pages/management/homePage/homePage?target=myinfo,
      })
    }else{//有时间,证实是返回的页面
      wx.switchTab({
        url: '/pages/home/home',
      });
      wx.removeStorageSync("now")
    }
}
//  在home.js和map.js中添加
//  home,map和consumer是tarbar页面
onshow(){
	wx.removeStorageSync("now");
}

好了,问题解决了,欢迎大佬把这个问题的原理在评论区给我解答,谢谢了!dom

相关文章
相关标签/搜索