badfl
badfl
  • 发布:2016-05-06 09:12
  • 更新:2016-05-06 09:34
  • 阅读:3024

webview侧滑菜单遮罩问题

分类:MUI

webview侧滑菜单遮罩问题
问题是这样的,我使用了模板自带的登录模板创建的应用
再整个应用的右上角有一个菜单按钮,菜单是用官方的例子,使用webview的侧滑菜单。
再main.html页面实现了 侧滑菜单的开关。因为侧滑菜单里面有很多子页面,所以当点击侧滑菜单里面的子项时 我就openWindows一个窗口,再新开的窗口右上角也有个侧滑菜单调用的是一个全局的webview菜单,再点击相同的子项,比如刚才点的是关于,现在在点击关于,这时候问题就出来了。菜单是可以消失的,但是遮罩没有消失。
我想到的问题是,
1.因为main里面用了一个遮罩,我没法实现把遮罩放到全局的最上面,webview菜单的下面,我的解决办法是在新开的页面 点击菜单的时候再做一个遮罩,但是我再点击菜单的时候没法确认打开的是哪个页面,所以没法关闭遮罩,问题就出现了

  1. 或者有没有方式实现,点击菜单的时候能不能知道 我打开页面是哪个,如果是打开的页面就是点击的页面那么就关闭菜单什么都不做,如果是新页面则openwindows一个新页面
    下面是部分代码:
    main.html的代码
    <script>

    
            (function($, doc) {  
                $.init();  
                var settings = app.getSettings();  
    
            var main, menu;  
            var maskMain = mui.createMask(closeMenu);  
            var showMenu = false;  
    
                $.plusReady(function() {  
    
                    //--  
                    $.oldBack = mui.back;  
                    var backButtonPress = 0;  
                    $.back = function(event) {  
                        backButtonPress++;  
                        if (backButtonPress > 1) {  
                            plus.runtime.quit();  
                        } else {  
                            plus.nativeUI.toast('再按一次退出应用');  
                        }  
                        setTimeout(function() {  
                            backButtonPress = 0;  
                        }, 1000);  
                        return false;  
                    };  
    
                    if (mui.os.android) {  
                    plus.screen.lockOrientation("portrait-primary");  
                }  
                main = plus.webview.currentWebview();  
                //main.addEventListener('maskClick', closeMenu);  
                //setTimeout的目的是等待窗体动画结束后,再执行create webview操作,避免资源竞争,导致窗口动画不流畅;  
                setTimeout(function() {  
                    menu = mui.preload({  
                        id: 'index-menu',  
                        url: 'index-menu.html',  
                        styles: {  
                            left: "70%",  
                            width: '70%',  
                            zindex: 9997  
                        },  
                        show: {  
                            aniShow: 'none'  
                        }  
                    });  
                }, 300);  
                //点击侧滑图标,打开侧滑菜单;  
                document.getElementById("openMenuBtn").addEventListener('tap', openMenu);  
                //在android4.4中的swipe事件,需要preventDefault一下,否则触发不正常  
                //故,在dragleft,dragright中preventDefault  
                window.addEventListener('dragright', function(e) {  
                    e.detail.gesture.preventDefault();  
                });  
                window.addEventListener('dragleft', function(e) {  
                    e.detail.gesture.preventDefault();  
                });  
                //主界面向左滑动,若菜单未显示,则显示菜单;否则不做任何操作;  
                window.addEventListener("swipeleft", openMenu);  
                //主界面向右滑动,若菜单已显示,则关闭菜单;否则,不做任何操作;  
                window.addEventListener("swiperight", closeMenu);  
                //menu页面向右滑动,关闭菜单;  
                window.addEventListener("menu:swiperight", closeMenu);  
    
                }); //end plus ready  
    
            mui.init({  
                swipeBack: false, //Boolean(默认false)关闭右滑关闭功能  
                beforeback: back, //处理窗口关闭前的业务  
                preloadLimit: 5 //预加载窗口数量限制(一旦超出,先进先出)默认不限制  
            });  
    
            function back() {  
                if (showMenu) {  
                    //菜单处于显示状态,返回键应该先关闭菜单,阻止主窗口执行mui.back逻辑;  
                    closeMenu();  
                    return false;  
                } else {  
                    //菜单处于隐藏状态,执行返回时,要先close菜单页面,然后继续执行mui.back逻辑关闭主窗口;  
                    menu.close('none');  
                    return true;  
                }  
            }  
            var aniShow = {};  
    
            /*  
             * 显示菜单菜单  
             */  
            function openMenu() {  
                if (!showMenu) {  
                    //解决android 4.4以下版本webview移动时,导致fixed定位元素错乱的bug;  
                    if (mui.os.android && parseFloat(mui.os.version) < 4.4) {  
                        document.querySelector("header.mui-bar").style.position = "static";  
                        //同时需要修改以下.mui-contnt的padding-top,否则会多出空白;  
                        document.querySelector(".mui-bar-nav~.mui-content").style.paddingTop = "0px";  
                    }  
    //                  menu.setStyle({  
    //                      mask: 'rgba(0,0,0,0)'         
    //                  }); //menu设置透明遮罩防止点击  
                    //侧滑菜单处于隐藏状态,则立即显示出来;  
                    //显示完毕后,根据不同动画效果移动窗体;  
                    menu.show('none', 0, function() {  
                        //主窗体开始侧滑;  
                        main.setStyle({  
                            //mask: 'rgba(0,0,0,0.4)',  
                            left: '-70%',  
                            transition: {  
                                duration: 150  
                            }  
                        });  
                        menu.setStyle({  
                            left: '30%',  
                            transition: {  
                                duration: 150  
                            }  
                        });  
    //                      mui.later(function() {  
    //                          menu.setStyle({  
    //                              mask: "none"  
    //                          }); //移除menu的mask  
    //                      }, 160);  
                    });  
                    maskMain.show();  
                    showMenu = true;  
                }  
            }  
            /**  
             * 关闭侧滑菜单(业务部分)  
             */  
            function closeMenu() {  
                if (showMenu) {  
                    //解决android 4.4以下版本webview移动时,导致fixed定位元素错乱的bug;  
                    if (mui.os.android && parseFloat(mui.os.version) < 4.4) {  
                        document.querySelector("header.mui-bar").style.position = "fixed";  
                        //同时需要修改以下.mui-contnt的padding-top,否则会多出空白;  
                        document.querySelector(".mui-bar-nav~.mui-content").style.paddingTop = "44px";  
                    }  
                    //主窗体开始侧滑;  
                    main.setStyle({  
                        //mask: 'none',  
                        left: '0',  
                        transition: {  
                            duration: 150  
                        }  
                    });  
                    menu.setStyle({  
                        left: '100%',  
                        transition: {  
                            duration: 150  
                        }  
                    });  
                    //等窗体动画结束后,隐藏菜单webview,节省资源;  
                    setTimeout(function() {  
                        menu.hide();  
                    }, 300);  
    
                    showMenu = false;  
                }  
            }  
            //重写mui.menu方法,Android版本menu按键按下可自动打开、关闭侧滑菜单;  
            mui.menu = function() {  
                if (showMenu) {  
                    closeMenu();  
                } else {  
                    openMenu();  
                }  
            }  
    
            window.addEventListener('closeMenu',function(event){  
                closeMenu();  
                console.log('调用了关闭菜单');  
            });  
            window.addEventListener('openMenu',function(event){  
                openMenu();  
                console.log('调用了打开菜单');  
            });  
    
            }(mui, document));  
```javascript  

这个是新页面的代码:  
mui.init();  
            mui.plusReady(function() {  
                mui(".mui-table-view").on('tap', '.mui-table-view-cell', function() {  
                });  
                document.getElementById("openMenuBtn").addEventListener('tap', openMenu);  
                var mask = mui.createMask(closeMenu);  
                //打开主页面菜单  
                function openMenu() {  
                    mask.show();  
                    var mainPage = plus.webview.getWebviewById('main')    
                    mui.fire(mainPage, 'openMenu');  
                }  

                function closeMenu() {  
                    var mainPage = plus.webview.getWebviewById('main')  
                    mui.fire(mainPage, 'closeMenu');  
                };  

            }); 

下面是打开的新页面代码:

2016-05-06 09:12 负责人:无 分享
已邀请:
badfl

badfl (作者) - mui详细文档:http://ask.dcloud.net.cn/article/1039

现在的代码我没有调用mask.close(),一调用就报错[ERROR] : RangeError: Maximum call stack size exceeded.

该问题目前已经被锁定, 无法添加新回复