var webviewGroup = function(id, options) { this.id = id; this.options = options; this.styles = options.styles; this.items = options.items; this.onChange = options.onChange this.options.index = options.index || 0; this.webviews = {}; this.webviewContexts = {}; this.currentWebview = false; this._init(); }; var proto = webviewGroup.prototype; proto._init = function() { this._initParent(); this._initNativeView(); this._initWebviewContexts(this.options.index); }; proto._initParent = function() { this.parent = plus.webview.getWebviewById(this.id); if(!this.parent) { this.parent = plus.webview.create(this.id, this.id); this.parent.show('none'); } }; proto._initNativeView = function() { // fixed by wmy 因为沉浸式应用,需要额外加上状态栏高度 var statusbar_H = plus.navigator.getStatusbarHeight(); this.nativeView = new plus.nativeObj.View('__MUI_TAB_NATIVE', { 'top': (83 + statusbar_H) +'px', //这个需要根据顶部导航及顶部选项卡高度自动调整 'height': (window.screen.height - 83)+"px", 'left': '100%', 'width': '100%', "backgroundColor":"#ffffff" }); this.nativeView.show(); }; proto._initWebviewContexts = function() { for(var len = this.items.length, i = len - 1; i >= 0; i--) { var webviewOptions = this.items[i]; var id = webviewOptions.id; var isFirst = i === 0; var isLast = i === (len - 1); var isCurrent = this.options.index === i; var extras = webviewOptions.extras; extras.__mui_url = webviewOptions.url; extras.__mui_index = i; extras.__mui_left = isFirst ? '' : this.items[i - 1].id; extras.__mui_right = isLast ? '' : this.items[i + 1].id; var styles = webviewOptions.styles || {}; if(i > this.options.index) { styles.left = '100%'; } else if(i < this.options.index) { styles.left = '-100%'; } else { styles.left = '0'; } var webviewContext = new webviewGroupContext(id, webviewOptions, this); this.webviewContexts[id] = webviewContext; if(isCurrent) { webviewContext.webview = plus.webview.getWebviewById(id); webviewContext.createWebview(); webviewContext.webview.show("none"); this._initDrags(webviewContext.webview); this.currentWebview = webviewContext.webview; } } }; proto._onChange = function(webview) { this.currentWebview = webview; this.onChange({ index: webview.__mui_index }); }; proto._dragCallback = function(dir, fromWebview, view, viewId) { if(view === this.nativeView) { //需要创建webview //第一步:初始化目标webview this.webviewContexts[viewId].createWebview('drag'); var targetWebview = this.webviewContexts[viewId].webview; targetWebview.show(); this.nativeView.setStyle({ left: '100%' }); //第二步:初始化目标webview的drag this._initDrags(targetWebview); this._onChange(targetWebview); //第三步:校验目标webview的左右webview的drag初始化 this._checkDrags(targetWebview); } else { this._onChange(view); } }; proto._initDrag = function(webview, dir) { var flag = ('__mui_drag_' + dir + '_flag'); if(webview[flag]) { return; } var viewId = webview['__mui_' + (dir === 'left' ? 'right' : 'left')]; if(viewId) { var view = plus.webview.getWebviewById(viewId); if(!view) { //如果目标webview不存在,使用nativeView替换 view = this.nativeView; } else { webview[flag] = true; } webview.drag({ 'direction': dir, 'moveMode': 'followFinger' }, { 'view': view, 'moveMode': 'follow' }, function(res) { if(res.type === 'end' && res.result) { //拖拽完成 this._dragCallback(dir, webview, view, viewId); } }.bind(this) ) } else { webview[flag] = true; } }; proto._initDrags = function(webview) { this._initDrag(webview, 'left'); this._initDrag(webview, 'right'); }; proto._checkDrags = function(webview) { var left = webview.__mui_left; var right = webview.__mui_right; if(left) { var leftWebview = plus.webview.getWebviewById(left); if(leftWebview && !leftWebview.__mui_drag_left_flag) { this._initDrag(leftWebview, 'left'); } } if(right) { var rightWebview = plus.webview.getWebviewById(right); if(rightWebview && !rightWebview.__mui_drag_right_flag) { this._initDrag(rightWebview, 'right'); } } }; proto.getCurrentWebview = function() { return this.currentWebview; }; proto.getCurrentWebviewContext = function() { if(this.currentWebview) { return this.webviewContexts[this.currentWebview.id]; } return false; }; proto.switchTab = function(id) { id = id.replace('_0', ''); //首页需要替换为appid var fromWebview = this.currentWebview; if(id === fromWebview.id) { return; } var toWebviewContext = this.webviewContexts[id]; var toWebview = toWebviewContext.webview; var fromToLeft = '100%'; var toFromLeft = '-100%'; if(toWebviewContext.options.extras.__mui_index > fromWebview.__mui_index) { fromToLeft = '-100%'; toFromLeft = '100%'; } var isNew = false; if(!toWebview) { isNew = true; toWebviewContext.createWebview('startAnimation'); toWebview = toWebviewContext.webview; // toWebview.showBehind(plus.webview.getSecondWebview()); toWebview.show(); this._initDrags(toWebview); this._checkDrags(toWebview); //新建的时候均需校验 } var self = this; // console.log("current:" + fromWebview.id + ",to:" + fromToLeft); // console.log("next:" + toWebview.id + ",from:" + toFromLeft); plus.webview.startAnimation({ 'view': fromWebview, 'styles': { 'fromLeft': '0', 'toLeft': fromToLeft }, 'action': 'show' }, { 'view': toWebview, 'styles': { 'fromLeft': toFromLeft, 'toLeft': '0' }, 'action': 'show' }, function(e) { //console.log("startAnimation callback..."); if(e.id === toWebview.id) { isNew && plus.nativeUI.showWaiting(); this.currentWebview = toWebview; this.onChange({ index: toWebview.__mui_index }); } }.bind(this) ) }; /** * @param {Object} id * @param {Object} webviewOptions */ var webviewGroupContext = function(id, webviewOptions, groupContext) { this.id = id; this.url = webviewOptions.url; this.options = webviewOptions; this.groupContext = groupContext; this.webview = false; this.inited = false; }; var _proto = webviewGroupContext.prototype; _proto.createWebview = function(from) { var options = this.options; options.styles = options.styles || { top: "83px", bottom: "0px", render: "always" }; options.styles.popGesture = 'none'; if(this.webview) { this.webview.setStyle(options.styles); for(var key in options.extras) { this.webview[key] = options.extras[key]; } } else { options.styles.left = '100%'; if(from !== 'startAnimation') { options.styles.left = '0'; plus.nativeUI.showWaiting(); } this.webview = plus.webview.create(this.url, this.id, options.styles, options.extras); //append进去,避免返回时闪屏 plus.webview.currentWebview().append(this.webview); } this._initWebview(); this.inited = true; }; _proto._initWebview = function() { var options = this.options; if(!this.webview) { return; } this.webview.addEventListener('rendering', function() { setTimeout(function() { plus.nativeUI.closeWaiting(); }, 500); }); if(options.pullToRefresh && options.pullToRefresh.support && support.pullToRefresh()) { var callback = options.pullToRefresh.callback; this.webview.setPullToRefresh(options.pullToRefresh, function() { if(callback) { //如果指定了下拉回调 callback(this.webview); } else { //下拉刷新回调,默认reload当前页面 var self = this; var titleUpdate = function() { setTimeout(function() { self.webview.endPullToRefresh(); }.bind(this), 1000); self.webview.removeEventListener('titleUpdate', titleUpdate); }; this.webview.addEventListener('titleUpdate', titleUpdate); this.webview.reload(); } }.bind(this)); } };