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,//子頁面底部位置
        width: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,//新頁面底部位置
      width: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:{
        width: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頁面。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM