zoukankan      html  css  js  c++  java
  • 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页面。

  • 相关阅读:
    Java实现 LeetCode 136 只出现一次的数字
    Java实现 LeetCode 136 只出现一次的数字
    Java实现 LeetCode 136 只出现一次的数字
    Java实现 LeetCode 135 分发糖果
    Java实现 LeetCode 135 分发糖果
    Java实现 LeetCode 135 分发糖果
    Java实现 LeetCode 134 加油站
    Java实现 LeetCode 134 加油站
    Java实现 LeetCode 134 加油站
    Java实现 LeetCode 133 克隆图
  • 原文地址:https://www.cnblogs.com/crazycode2/p/6865718.html
Copyright © 2011-2022 走看看