• MUI窗口管理


    参考窗口管理

    http://dev.dcloud.net.cn/mui/window/

    页面初始化:在app开发中,若要使用HTML5+扩展api,必须等plusready事件发生后才能正常使用,mui将该事件封装成了mui.plusReady()方法,涉及到HTML5+的api,建议都写在mui.plusReady方法中。

    mui.plusReady(function(){
         console.log("当前页面URL:"+plus.webview.currentWebview().getURL());
    });
    // 拓展
    mui.init();// mui插件初始化
    mui.ready();// 当DOM准备就绪时,指定一个函数来执行。

    创建子页面

    <script type="text/javascript">
    mui.init({
        subpages:[{
            url:your-subpage-url,//子页面HTML地址,支持本地地址和网络地址
            id:your-subpage-id,//子页面标志
            styles:{
                top:subpage-top-position,//子页面顶部位置
                bottom:subpage-bottom-position,//子页面底部位置
                subpage-width,//子页面宽度,默认为100%
                height:subpage-height,//子页面高度,默认为100%
            ......
            },
            extras:{}//额外扩展参数
        }]
    });
    </script>

    具体示例

    <script type="text/javascript">
    mui.init({
        subpages:[{
            url:"childindex.html",//子页面HTML地址,支持本地地址和网络地址
            id:"childIndex",//子页面标志
            styles:{
                top:'120px',//子页面顶部位置
                bottom:'0px',//子页面底部位置
                '0px',//子页面宽度,默认为100%
                height:'0px',//子页面高度,默认为100%
            },
            extras:{}//额外扩展参数
        }]
    });
    </script>

    打开新页面

    <script type="text/javascript">
    mui.openWindow({
        url:new-page-url,
        id:new-page-id,
        styles:{
          top:newpage-top-position,//新页面顶部位置
          bottom:newage-bottom-position,//新页面底部位置
          newpage-width,//新页面宽度,默认为100%
          height:newpage-height,//新页面高度,默认为100%
          ......
        },
        extras:{
          .....//自定义扩展参数,可以用来处理页面间传值
        },
        createNew:false,//是否重复创建同样id的webview,默认为false:不重复创建,直接显示
        show:{
          autoShow:true,//页面loaded事件发生后自动显示,默认为true
          aniShow:animationType,//页面显示动画,默认为”slide-in-right“;
          duration:animationTime//页面动画持续时间,Android平台默认100毫秒,iOS平台默认200毫秒;
        },
        waiting:{
          autoShow:true,//自动显示等待框,默认为true
          title:'正在加载...',//等待对话框上显示的提示内容
          options:{
            waiting-dialog-widht,//等待框背景区域宽度,默认根据内容自动计算合适宽度
            height:waiting-dialog-height,//等待框背景区域高度,默认根据内容自动计算合适高度
            ......
          }
        }
    })
    </script>

     具体示例

    <script type="text/javascript">
    mui.init();
    $("#openNewPage").bind('tap',function(){
        mui.openWindow({
            url:'childIndex.html',
            id:'childIndex'
        });
    });
    </script>

    页面之间传递参数

    <script type="text/javascript">
    mui.init();
    $("#openNewPage").bind('tap',function(){
        var webview = mui.openWindow({
            url:'childIndex.html',
            id:'childIndex',
            extras:{
                name:'mui' // 拓展参数
            }
        });
        console.log(webview.name);
    });
    </script>

    优化页面跳转:当A页面跳转到B页面的时候,B页面是从服务器端加载的一个列表,若在B页面loaded事件发生时就将其显示出来,因服务器数据尚未加载完毕,列表页面为空,用户体验不好;可通过如下方式改善用户体验(最好的用户体验应该是通过预加载的方式):

    第一步,B页面loaded事件发生后,不自动显示;

    <script type="text/javascript">
    //A页面中打开B页面,设置show的autoShow为false,则B页面在其loaded事件发生后,不会自动显示;
    mui.openWindow({
        url: 'B.html', 
        show:{
            autoShow:false
        }
    });
    </script>

    第二步,在B页面获取列表数据后,再关闭等待框、显示B页面

    //B页面onload从服务器获取列表数据;
    window.onload = function(){
      //从服务器获取数据
      ....
      //业务数据获取完毕,并已插入当前页面DOM;
      //注意:若为ajax请求,则需将如下代码放在处理完ajax响应数据之后;
      mui.plusReady(function(){
        //关闭等待框
        plus.nativeUI.closeWaiting();
        //显示当前页面
        mui.currentWebview.show();
      });
    }

    使用父子webview或者同屏显示多个webview的性能和资源消耗较大。不推荐使用同屏多webview。推荐使用原生导航栏方案代替。可以加快窗体进入速度,内存占用更少。

    具体参考:打开带原生导航栏的新页面

    http://dev.dcloud.net.cn/mui/window/#openWindowWithTitle

    关闭页面

    mui框架将窗口关闭功能封装在mui.back方法中,具体执行逻辑是:

    若当前webview为预加载页面,则hide当前webview;
    否则,close当前webview;

    在mui框架中,有三种操作会触发页面关闭(执行mui.back方法):

    点击包含.mui-action-back类的控件
    在屏幕内,向右快速滑动
    Android手机按下back按键

    hbuilder中敲mheader生成的代码块,会自动生成带有返回导航箭头的标题栏,点击返回箭头可关闭当前页面,原因就是因为该返回箭头包含.mui-action-back类,代码如下:

    <header class="mui-bar mui-bar-nav">
        <a class="mui-action-back mui-icon mui-icon-left-nav mui-pull-left"></a>
        <h1 class="mui-title">标题</h1>
    </header>

    若希望在顶部导航栏之外的其它区域添加关闭页面的控件,只需要在对应控件上添加.mui-action-back类即可,如下为一个关闭按钮示例:

    <button type="button" class='mui-btn mui-btn-danger mui-action-back'>关闭</button>

    mui框架封装的页面右滑关闭功能,默认未启用,若要使用右滑关闭功能,需要在mui.init();方法中设置swipeBack参数,如下:

    mui.init({
        swipeBack:true //启用右滑关闭功能
    });

    mui框架默认会监听Android手机的back按键,然后执行页面关闭逻辑; 若不希望mui自动处理back按键,可通过如下方式关闭mui的back按键监听;

    mui.init({
        keyEventBind: {
            backbutton: false  //关闭back按键监听
        }
    });

    除了如上三种操作外,也可以直接调用mui.back()方法,执行窗口关闭逻辑;

    mui.back()仅处理窗口逻辑,若希望在窗口关闭之前再处理一些其它业务逻辑,则可将业务逻辑抽象成一个具体函数,然后注册为mui.init方法的beforeback参数;beforeback的执行逻辑为:

    执行beforeback参数对应的函数若返回false,则不再执行mui.back()方法;
    否则(返回true或无返回值),继续执行mui.back()方法;

    示例:从列表打开详情页面,从详情页面再返回后希望刷新列表界面,此时可注册beforeback参数,然后通过自定义事件通知列表页面刷新数据,示例代码如下:

    mui.init({
        beforeback: function(){
            //获得列表界面的webview
            var list = plus.webview.getWebviewById('list');
            //触发列表界面的自定义事件(refresh),从而进行数据刷新
            mui.fire(list,'refresh');
            //返回true,继续页面关闭逻辑
            return true;
        }
    });

    注意:beforeback的执行返回必须是同步的(阻塞模式),若使用nativeUI这种异步js(非阻塞模式),则可能会出现意想不到的结果;比如:通过plus.nativeUI.confirm()弹出确认框,可能用户尚未选择,页面已经返回了(beforeback同步执行完毕,无返回值,继续执行mui.back()方法,nativeUI不会阻塞js进程):在这种情况下,若要自定义业务逻辑,就需要复写mui.back方法了;如下为一个自定义示例,每次都需要用户确认后,才会关闭当前页面;

    //备份mui.back,mui.back已将窗口关闭逻辑封装的比较完善(预加载及父子窗口),因此最好复用mui.back
    var old_back = mui.back;
    mui.back = function(){
      var btn = ["确定","取消"];
      mui.confirm('确认关闭当前窗口?','Hello MUI',btn,function(e){
        if(e.index==0){
            //执行mui封装好的窗口关闭逻辑;
            old_back();
        }
      });
    }

    预加载

    所谓的预加载技术就是在用户尚未触发页面跳转时,提前创建目标页面,这样当用户跳转时,就可以立即进行页面切换,节省创建新页面的时间,提升app使用体验。mui提供两种方式实现页面预加载。

    方式一:通过mui.init方法中的preloadPages参数进行配置

    mui.init({
      preloadPages:[
        {
          url:prelaod-page-url,
          id:preload-page-id,
          styles:{},//窗口参数
          extras:{},//自定义扩展参数
          subpages:[{},{}]//预加载页面的子页面
        }
      ],
      preloadLimit:5//预加载窗口数量限制(一旦超出,先进先出)默认不限制
    });

    该种方案使用简单、可预加载多个页面,但不会返回预加载每个页面的引用,若要获得对应webview引用,还需要通过plus.webview.getWebviewById方式获得;另外,因为mui.init是异步执行,执行完mui.init方法后立即获得对应webview引用,可能会失败,例如如下代码:

    mui.init({
      preloadPages:[
        {
          url:'list.html',
          id:'list'
        }
      ]
    });
    var list = plus.webview.getWebviewByid('list');//这里可能返回空;

    方式二:通过mui.preload方法预加载.

    var page = mui.preload({
        url:new-page-url,
        id:new-page-id,//默认使用当前页面的url作为id
        styles:{},//窗口参数
        extras:{}//自定义扩展参数
    });

    通过mui.preload()方法预加载,可立即返回对应webview的引用,但一次仅能预加载一个页面;若需加载多个webview,则需多次调用mui.preload()方法;

    如上两种方案,各有优劣,需根据具体业务场景灵活选择;

  • 相关阅读:
    Linux_vi编辑器
    Linux_几个符号命令
    Linux_权限
    Linux_用户/用户组
    Linux_文件及文件夹[创建][复制][移动][删除][重命名]
    Linux_文件查看
    Linux_初识
    码农网站
    学习网站
    软件设计师考试范围
  • 原文地址:https://www.cnblogs.com/e0yu/p/7851903.html
Copyright © 2020-2023  润新知