webview侧滑菜单遮罩问题
问题是这样的,我使用了模板自带的登录模板创建的应用
再整个应用的右上角有一个菜单按钮,菜单是用官方的例子,使用webview的侧滑菜单。
再main.html页面实现了 侧滑菜单的开关。因为侧滑菜单里面有很多子页面,所以当点击侧滑菜单里面的子项时 我就openWindows一个窗口,再新开的窗口右上角也有个侧滑菜单调用的是一个全局的webview菜单,再点击相同的子项,比如刚才点的是关于,现在在点击关于,这时候问题就出来了。菜单是可以消失的,但是遮罩没有消失。
我想到的问题是,
1.因为main里面用了一个遮罩,我没法实现把遮罩放到全局的最上面,webview菜单的下面,我的解决办法是在新开的页面 点击菜单的时候再做一个遮罩,但是我再点击菜单的时候没法确认打开的是哪个页面,所以没法关闭遮罩,问题就出现了
-
或者有没有方式实现,点击菜单的时候能不能知道 我打开页面是哪个,如果是打开的页面就是点击的页面那么就关闭菜单什么都不做,如果是新页面则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');
};
});
下面是打开的新页面代码:
1 个回复
badfl (作者) - mui详细文档:http://ask.dcloud.net.cn/article/1039
现在的代码我没有调用mask.close(),一调用就报错[ERROR] : RangeError: Maximum call stack size exceeded.