NGToolsCSharp/NGTools/Scripts/MUI/js/webviewGroup.js
2024-09-13 16:44:30 +08:00

286 lines
7.7 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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));
}
};