mui webview操作

摘要:
隐藏Webview窗口voidplus.Webview.Hide;描述:根据指定的WebviewObject对象或id隐藏Webview窗口,使窗口不可见。查找指定的WebviewObject窗口WebviewObjectplus.webview.getWebviewById;描述:在创建的窗口列表中查找具有指定ID的Webview窗口并返回。创建并打开Webview窗口WebviewObjectplus.Webview.open;描述:创建并显示用于加载新HTML页面的Webview窗口。您可以通过样式设置Webview窗口的样式。创建后,将自动显示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="http://t.zoukankan.com/js/mui.min.js"></script>
    <link href="http://t.zoukankan.com/css/mui.min.css" rel="stylesheet"/>
</head>
<body>
    <header class="mui-bar mui-bar-nav">
        <h1   id="title">标题</h1>
    </header>
    <nav   href="http://t.zoukankan.com/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   href="http://t.zoukankan.com/html/message.html">
            <span class="mui-icon mui-icon-email"></span>
            <span class="mui-tab-label">邮件</span>
        </a>
        <a   href="http://t.zoukankan.com/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页面。

免责声明:文章转载自《mui webview操作》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【linux】linux下shell命令 多个变量在命令中的引用 以及重新赋值给新的变量常用CSS样式下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

mui 页面传值

点击第一个页面的标签,跳转到第二个页面,把第一个页面的值也传往目标页面 现在提供两种实现方式 注意:需要在手机运行才可以,用电脑浏览器可能不支持。 第一种方式  页面已创建,通过自定义事件传值 first.html <!DOCTYPE html> <html> <head>...

Electron webview

Electron webviewhttp://www.ayqy.net/blog/electron-webview完全指南/ 一.webview标签 Electron提供了webview标签,用来嵌入Web页面: Display external web content in an isolated frame and process. 作用上类似于HTM...

goahead3.6.3就基本使用(后台上传信息到html页面),高手请忽略

声明:这里面的代码均为网上找的然后有小小的改动,并非原创。但文章为原创 一、.编译 1.1,、下载:进入http://embedthis.com/goahead/下载goahead3.6.3(2017年9月12日还是这版本) 1.2、解压 , 然后进入goahead-3.6.3-rc目录,进入后为这样 , 然后在进入goahead-3.6.3 然后在终端...

在可编辑div中插入文字或图片的问题解决思路

最近在网上碰到一个人问了我一个问题,在可编辑div中插入文字或者图片。因为web在线编辑器我从来只是用,基本不会去研究源代码。后来正好一个在线聊天web项目中也要用到这个功能,我就特地看看了代码。 基本上编辑器或者在线聊天web页面,是不太可能用textarea在做输入框的,因为我们可能要插入图片或者超级链接,因此选择在iframe或者div作为输入框是必...

浏览器工作原理和实践(三)——页面

《浏览器工作原理与实践》是极客时间上的一个浏览器学习系列,在学习之后特在此做记录和总结。 一、事件循环 消息队列是一种数据结构,可以存放要执行的任务。它符合队列“先进先出”的特点,也就是说要添加任务的话,添加到队列的尾部;要取出任务的话,从队列头部去取。 从上图可以看出,改造可以分为下面三个步骤: (1)添加一个消息队列; (2)IO 线程中产生的新任务...

解决Eclipse中更改HTML页面后,浏览器查看页面无变化

遇到问题:最近有些同学出现了一些很奇怪的情况,无论怎么修改Eclipse中的HTML代码,然后run on server,用浏览器查看,但页面还是没有任何变化。右键查看源代码,发现代码依旧是之前没有修改的代码。重启服务器和Eclipse都没有效果。情况如下: 需要访问 "Login" 在eclipse中修改代码 然后右键-->Run On Ser...