• mui webview操作


    HBuilder的webview操作

    webviewAPI文档:http://www.html5plus.org/doc/zh_cn/webview.html

    创建新的webview窗口:

    WebviewObject plus.webview.create( url, id, styles, extras );

    说明:创建Webview窗口,用于加载新的HTML页面,可通过styles设置Webview窗口的样式,创建完成后需要调用show方法才能将Webview窗口显示出来。

    显示Webview窗口

    void plus.webview.show( id_wvobj, aniShow, duration, showedCB, extras );

    说明:显示已创建或隐藏的Webview窗口,需先获取窗口对象或窗口id,并可指定显示窗口的动画及动画持续时间。

    隐藏Webview窗口

    void plus.webview.hide( id_wvobj, aniHide, duration, extras );

    说明:根据指定的WebviewObject对象或id隐藏Webview窗口,使得窗口不可见。

    获取当前窗口的WebviewObject对象

    WebviewObject plus.webview.currentWebview();

    说明:获取当前页面所属的Webview窗口对象。

    查找指定标识的WebviewObject窗口

    WebviewObject plus.webview.getWebviewById( id );

    说明:在已创建的窗口列表中查找指定标识的Webview窗口并返回。 若没有查找到指定标识的窗口则返回null,若存在多个相同标识的Webview窗口,则返回第一个创建的Webview窗口。 如果要获取应用入口页面所属的Webview窗口,其标识为应用的%APPID%,可通过plus.runtime.appid获取。

    创建并打开Webview窗口

    WebviewObject plus.webview.open( url, id, styles, aniShow, duration, showedCB );

    说明:创建并显示Webview窗口,用于加载新的HTML页面,可通过styles设置Webview窗口的样式,创建完成后自动将Webview窗口显示出来。

    以上内容来自文档,详细可阅读官方文档。

    1.mui的双webview模式需要在页面初始化的时候配置器参数:

    mui.init({
        //子页面
        subpages: [{
            //...
        }],
        //预加载
        preloadPages:[
            //...
         ],
        //下拉刷新、上拉加载
         pullRefresh : {
           //...
        },
        //手势配置
          gestureConfig:{
           //...
        },
        //侧滑关闭
        swipeBack:true, //Boolean(默认false)启用右滑关闭功能
    
        //监听Android手机的back、menu按键
        keyEventBind: {
            backbutton: false,  //Boolean(默认truee)关闭back按键监听
            menubutton: false   //Boolean(默认true)关闭menu按键监听
        },
        //处理窗口关闭前的业务
        beforeback: function() {
            //... //窗口关闭前处理其他业务详情点击 ↑ "关闭页面"链接查看
        },
        //设置状态栏颜色
        statusBarBackground: '#9defbcg', //设置状态栏颜色,仅iOS可用
        preloadLimit:5//预加载窗口数量限制(一旦超出,先进先出)默认不限制
    })

    在APP开发中,若调用API,必须等plusready事件发生后才能正常运行,mui将该事件封装成mui.plusReady(),所以建议API的操作都写在mui.plusReady方法中。
    如打印当前页面的URL:

    mui.plusReady(function(){
         console.log("当前页面URL:"+plus.webview.currentWebview().getURL());
    });

    2.创建子页面

    将固定的页面分离出来,然后在init方法中初始发子页面的内容,具体可参照mui的index页面和list页面。

    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:{}//额外扩展参数
       }]
    });

    参数说明:styles:表示窗口属性,参考5+规范中的WebviewStyle;特别注意,height和width两个属性,即使不设置,也默认按100%计算;因此若设置了top值为非"0px"的情况,建议同时设置bottom值,否则5+ runtime根据高度100%计算,可能会造成页面真实底部位置超出屏幕范围的情况;left、right同理。

    3.打开新页面

    mui的解决思路是:单个webview只承担页面的dom,减少dom层级及页面大小,页面切换使用原生动画,将最消耗性能的部分交给原生实现。

    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,//等待框背景区域高度,默认根据内容自动计算合适高度
            ......
          }
        }
    })

    注意:扩展参数只在打开页面的时候有效,若目标窗口为预加载页面,则通过mui.openwindow方法打开时传递的extras参数无效。

    1.示例1,打开新页面

    //tap为mui封装的单击事件,可参考手势事件章节
    document.getElementById('info').addEventListener('tap', function() {
      //打开关于页面
      mui.openWindow({
        url: 'examples/info.html',
        id:'info'
      });
    });

    2.打开需要从服务器端获取数据的页面

    1.在跳转页面loaded事件发生后,不自动显示:

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


    2.在调转页面获取数据之后再关闭等待框,显示调转页面:

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

    关闭页面

    1.包含.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>

    2.如果需要在其他按钮上触发返回事件,只需要添加.mui-action-back类

    3.屏幕右滑动关闭页面,需要在mui.init()方法中是设置:

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

    实战:练习代码如下:

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
        <title></title>
        <script src="js/mui.min.js"></script>
        <link href="css/mui.min.css" rel="stylesheet"/>
    </head>
    <body>
        <header class="mui-bar mui-bar-nav">
            <h1 class="mui-title" id="title">标题</h1>
        </header>
        <nav class="mui-bar mui-bar-tab" href="html/home.html">
            <a class="mui-tab-item mui-active">
                <span class="mui-icon mui-icon-home"></span>
                <span class="mui-tab-label">首页</span>
            </a>
            <a class="mui-tab-item" href="html/message.html">
                <span class="mui-icon mui-icon-email"></span>
                <span class="mui-tab-label">邮件</span>
            </a>
            <a class="mui-tab-item" href="html/setting.html">
                <span class="mui-icon mui-icon-gear"></span>
                <span class="mui-tab-label">设置</span>
            </a>
        </nav>
    </body>
    </html>
    <script type="text/javascript" charset="utf-8">
        // mui初始化
        mui.init();
        
        var subpages = ['html/home.html', 'html/message.html', 'html/setting.html'];
        var subpage_style = {
            top: '45px',
            bottom: '51px'
        };
        var aniShow = {};
        // 当前激活选项
        var activeTab = subpages[0];
        var title = document.getElementById("title");
        
        if(mui.os.plus){
            // 创建子页面,首个选项卡页面显示,其它均隐藏;
            mui.plusReady(function() {
                var self = plus.webview.currentWebview();
                for (var i = 0; i < subpages.length; i++) {
                    var temp = {};
                    var sub = plus.webview.create(subpages[i], subpages[i], subpage_style);
                    if (i > 0) {
                        sub.hide();
                    }else{
                        temp[subpages[i]] = "true";
                        mui.extend(aniShow,temp);
                    }
                    self.append(sub);
                }
            });
        }else{
            // 创建iframe代替子页面
            createIframe('.mui-content',{
                url: activeTab,
                style: subpage_style
            });
        }
        
        // 选项卡点击事件
        mui('.mui-bar-tab').on('tap', 'a', function(e) {
            var targetTab = this.getAttribute('href');
            
            if (targetTab == activeTab) {return;}
            //更换标题
            title.innerHTML = this.querySelector('.mui-tab-label').innerHTML;
            
            //显示目标选项卡
            if(mui.os.plus){
                //若为iOS平台或非首次显示,则直接显示
                if(mui.os.ios||aniShow[targetTab]){
                    plus.webview.show(targetTab);
                }else{
                    //否则,使用fade-in动画,且保存变量
                    var temp = {};
                    temp[targetTab] = "true";
                    mui.extend(aniShow,temp);
                    plus.webview.show(targetTab,"fade-in",300);
                }
                //隐藏当前;
                plus.webview.hide(activeTab);
            }else{
                // 创建iframe代替子页面
                createIframe('.mui-content',{
                    url: targetTab,
                    style: subpage_style
                });
            }
            //更改当前活跃的选项卡
            activeTab = targetTab;
        });
        
        
        /*兼容处理方法*/
        var createIframe=function(el,opt){
            var elContainer=document.querySelector(el);
            var wrapper=document.querySelector('.mui-iframe-wrapper');
            if (!wrapper) {
                //创建wrapper和iframe
                wrapper = document.createElement('div');
                wrapper.className = 'mui-iframe-wrapper';
                for(var i in opt.style){
                    wrapper.style[i] = opt.style[i];
                }
                var iframe = document.createElement('iframe');
                iframe.src = opt.url;
                iframe.id = opt.id || opt.url;
                iframe.name = opt.id;
                wrapper.appendChild(iframe);
                elContainer.appendChild(wrapper);
            } else{
                 var iframe = wrapper.querySelector('iframe');
                iframe.src = opt.url;
                iframe.id = opt.id || opt.url;
                iframe.name = iframe.id;
            }
        }
        
    </script>
    

    //在根目录下,新建html文件,在文件夹中新建home,message,setting的mui页面。

  • 相关阅读:
    WUSTOJ 1247: 递增或递减排序(Java)
    WUSTOJ 1246: 字符串排序(Java)
    Oracle查询部门工资最高员工的两种方法 1、MAX()函数 2、RANK()函数
    Oracle数据库——用户(USER)
    Firefox在新标签页打开“书签”和“搜索栏”(无需插件)
    Oracle数据库——ROWNUM
    Oracle数据库 SET ECHO [ON|OFF]
    WUST Oracle数据库 实验一实验二
    优课在线 嵌入式系统(胡威)2018春季测验 参考解析
    Oracle数据库——查询所有用户
  • 原文地址:https://www.cnblogs.com/crazycode2/p/6865718.html
Copyright © 2020-2023  润新知