NGToolsCSharp/NGTools/obj/Release/Package/PackageTmp/Scripts/MUI/js/webviewGroup.js

286 lines
7.7 KiB
JavaScript
Raw Normal View History

2024-09-13 08:44:13 +00:00
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));
}
};