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頁面。