美文网首页
ionic3集成进微信公众号使用微信自带导航栏的方法

ionic3集成进微信公众号使用微信自带导航栏的方法

作者: 叶子丶恬 | 来源:发表于2018-01-19 11:55 被阅读0次

            将开发好的ionic3项目加入到微信公众号中,在微信浏览器访问,使用ionic的自带的导航栏难免会跟微信自带的导航有冲突,而且会出现双导航栏的现象,如下。

            问题一:在微信浏览器中,IOS系统跟安卓系统的返回机制又有不同,IOS的微信浏览器的导航是返回上一层,而安卓的微信浏览器的导航的返回是直接返回微信界面。所以去掉导航栏后要考虑好适配IOS的导航跟安卓的返回键。

            问题二:另一种情况是弹出了输入法和内置的选项,如:ion-datetime、ion-select等有弹出层的情况下,按下返回,应先去除弹出层,在按返回返回上一层。

            问题三:还有一种情况是部分人反映的跳转到首页后页面乱跳的问题。这个问题考虑了很久,依旧没有想到特别好的解决方案,所以目前只能做到返回到首页后不再跳转到任何页面,只停留在首页。

    具体的实现逻辑是使用浏览器的popstate来接管浏览器的历史浏览记录,代码如下:

    /**

      * 浏览器返回按钮及安卓返回键

      */

      backEvent(){

    //设置一个在页面手动pop的初始标识

        window.sessionStorage.setItem('popFlag','0');

        window.addEventListener("popstate",()=>{

      //判断是否打开输入法键盘

          if(this.keyboard.isOpen()){

        //关闭键盘

            this.keyboard.close();

            history.pushState(null, null, location.href);

          }else{

              //获取NavController

              let activeNav: NavController = this.appCtrl.getActiveNav();

      //只有网址的情况,如:http://www.baidu.com

              if(location.href.indexOf("#")==-1){

        //设置返回首页的一个标识

                window.sessionStorage.setItem('backFlag',"backBtn");

                history.pushState(null, null, location.href);

                return;

              }

      //返回首页,历史记录的Url中有login,如:http://www.baidu.com/#/login

              if(location.href.indexOf("login")>-1){

    //设置返回首页的一个标识

                window.sessionStorage.setItem('backFlag',"backBtn");

                history.pushState(null, null, location.href);

                return;

              }

      //非首页返回的登录页,历史记录的Url中有上一页面的记录,如:http://www.baidu.com/#/tabs/%E5%85%B3%E4%BA%8E%E6%88%91/password-modify

              if(location.href.indexOf("password-modify")>-1){

                this.rootPage = 'LoginPage'; 

                history.pushState(null, null, location.href);

                return;

              }else{

                  //判断是否可以返回上一页

                  if (activeNav.canGoBack()) {

                    //取出在session中设置的手动pop标识

                    let popFlag = window.sessionStorage.getItem('popFlag');

    //popFlag  0:表示通过安卓返回键或通过IOS微信导航栏返回  1:手动返回

                    if(popFlag != "1"){

                        //获取选项控件(如:弹出的时间控件、弹出的选项控件等。。)

                        let backdrop = document.getElementsByTagNameNS("http://www.w3.org/1999/xhtml","ion-backdrop");

                        if(backdrop.length>0){

      //模拟执行click操作,关闭控件

                          backdrop[0].click();

                          history.pushState(null, null, location.href);

                        }else{

                          activeNav.pop();

    }

                    }

    //执行成功后将该标识重新设置成初始值

    window.sessionStorage.setItem('popFlag',"0");

                  }

              }

          }

        },false);

      }

            该方法直接放在app.component.ts的constructor中,在手动pop的地方将sessionStorage中的popFlag设置为1即可,

            在首页的的ionViewWillEnter勾子中要特殊处理一下。

            该方法能解决大部分问题项目运行在微信浏览器的问题,当然它不是完美的,如果有修改的地方请友情提出。

    相关文章

      网友评论

          本文标题:ionic3集成进微信公众号使用微信自带导航栏的方法

          本文链接:https://www.haomeiwen.com/subject/vckooxtx.html