You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

324 lines
15 KiB

4 years ago
/**
* pullRefresh 5+
* @param {type} $
* @returns {undefined}
*/
(function($, document) {
if (!($.os.plus)) { //仅在5+android支持多webview的使用
return;
}
$.plusReady(function() {
if (window.__NWin_Enable__ === false) { //不支持多webview则不用5+下拉刷新
return;
}
var CLASS_PLUS_PULLREFRESH = $.className('plus-pullrefresh');
var CLASS_VISIBILITY = $.className('visibility');
var CLASS_HIDDEN = $.className('hidden');
var CLASS_BLOCK = $.className('block');
var CLASS_PULL_CAPTION = $.className('pull-caption');
var CLASS_PULL_CAPTION_DOWN = $.className('pull-caption-down');
var CLASS_PULL_CAPTION_REFRESH = $.className('pull-caption-refresh');
var CLASS_PULL_CAPTION_NOMORE = $.className('pull-caption-nomore');
var PlusPullRefresh = $.Class.extend({
init: function(element, options) {
this.element = element;
this.options = options;
this.wrapper = this.scroller = element;
this._init();
this._initPulldownRefreshEvent();
},
_init: function() {
var self = this;
//document.addEventListener('plusscrollbottom', this);
window.addEventListener('dragup', self);
document.addEventListener("plusscrollbottom", self);
self.scrollInterval = window.setInterval(function() {
if (self.isScroll && !self.loading) {
if (window.pageYOffset + window.innerHeight + 10 >= document.documentElement.scrollHeight) {
self.isScroll = false; //放在这里是因为快速滚动的话,有可能检测时,还没到底,所以只要有滚动,没到底之前一直检测高度变化
if (self.bottomPocket) {
self.pullupLoading();
}
}
}
}, 100);
},
_initPulldownRefreshEvent: function() {
var self = this;
$.plusReady(function() {
if(self.options.down.style == "circle"){
//单webview、原生转圈
self.options.webview = plus.webview.currentWebview();
self.options.webview.setPullToRefresh({
support: true,
color:self.options.down.color || '#2BD009',
height: self.options.down.height || '50px',
range: self.options.down.range || '100px',
style: 'circle',
offset: self.options.down.offset || '0px'
}, function() {
self.options.down.callback();
});
}else if (self.topPocket && self.options.webviewId) {
var webview = plus.webview.getWebviewById(self.options.webviewId);//子窗口
if (!webview) {
return;
}
self.options.webview = webview;
var downOptions = self.options.down;
var height = downOptions.height;
webview.addEventListener('close', function() {
var attrWebviewId = self.options.webviewId && self.options.webviewId.replace(/\//g, "_"); //替换所有"/"
self.element.removeAttribute('data-pullrefresh-plus-' + attrWebviewId);
});
webview.addEventListener("dragBounce", function(e) {
if (!self.pulldown) {
self._initPulldownRefresh();
} else {
self.pullPocket.classList.add(CLASS_BLOCK);
}
switch (e.status) {
case "beforeChangeOffset": //下拉可刷新状态
self._setCaption(downOptions.contentdown);
break;
case "afterChangeOffset": //松开可刷新状态
self._setCaption(downOptions.contentover);
break;
case "dragEndAfterChangeOffset": //正在刷新状态
//执行下拉刷新所在webview的回调函数
webview.evalJS("window.mui&&mui.options.pullRefresh.down.callback()");
self._setCaption(downOptions.contentrefresh);
break;
default:
break;
}
}, false);
webview.setBounce({
position: {
top: height * 2 + 'px'
},
changeoffset: {
top: height + 'px'
}
});
}
});
},
handleEvent: function(e) {
var self = this;
if (self.stopped) {
return;
}
self.isScroll = false;
if (e.type === 'dragup' || e.type === 'plusscrollbottom') {
self.isScroll = true;
setTimeout(function() {
self.isScroll = false;
}, 1000);
}
}
}).extend($.extend({
setStopped: function(stopped) { //该方法是子页面调用的
this.stopped = !!stopped;
//TODO 此处需要设置当前webview的bounce为none,目前5+有BUG
var webview = plus.webview.currentWebview();
if (this.stopped) {
webview.setStyle({
bounce: 'none'
});
webview.setBounce({
position: {
top: 'none'
}
});
} else {
var height = this.options.down.height;
webview.setStyle({
bounce: 'vertical'
});
webview.setBounce({
position: {
top: height * 2 + 'px'
},
changeoffset: {
top: height + 'px'
}
});
}
},
beginPulldown:function() {
var self = this;
$.plusReady(function() {
//这里延时的目的是为了保证下拉刷新组件初始化完成,后续应该做成有状态的
setTimeout(function () {
if(self.options.down.style == "circle"){//单webview下拉刷新
plus.webview.currentWebview().beginPullToRefresh();
}else{//双webview模式
var webview = self.options.webview;
if(webview){
webview.setBounce({
offset: {
top: self.options.down.height + "px"
}
});
}
}
},15);
}.bind(this));
},
pulldownLoading: function () {//该方法是子页面调用的兼容老的历史API
this.beginPulldown();
},
_pulldownLoading: function() { //该方法是父页面调用的
var self = this;
$.plusReady(function() {
var childWebview = plus.webview.getWebviewById(self.options.webviewId);
childWebview && childWebview.setBounce({
offset: {
top: self.options.down.height + "px"
}
});
});
},
endPulldown:function(){
var _wv = plus.webview.currentWebview();
//双webview的下拉刷新需要修改父窗口提示信息
if(_wv.parent() && this.options.down.style !== "circle"){
_wv.parent().evalJS("mui&&mui(document.querySelector('.mui-content')).pullRefresh('" + JSON.stringify({
webviewId: _wv.id
}) + "')._endPulldownToRefresh()");
}else{
_wv.endPullToRefresh();
}
},
endPulldownToRefresh: function () {//该方法是子页面调用的兼容老的历史API
this.endPulldown();
},
_endPulldownToRefresh: function() { //该方法是父页面调用的
var self = this;
if (self.topPocket && self.options.webview) {
self.options.webview.endPullToRefresh(); //下拉刷新所在webview回弹
self.loading = false;
self._setCaption(self.options.down.contentdown, true);
setTimeout(function() {
self.loading || self.topPocket.classList.remove(CLASS_BLOCK);
}, 350);
}
},
beginPullup:function(callback) {//开始上拉加载
var self = this;
if (self.isLoading) return;
self.isLoading = true;
if (self.pulldown !== false) {
self._initPullupRefresh();
} else {
this.pullPocket.classList.add(CLASS_BLOCK);
}
setTimeout(function() {
self.pullLoading.classList.add(CLASS_VISIBILITY);
self.pullLoading.classList.remove(CLASS_HIDDEN);
self.pullCaption.innerHTML = ''; //修正5+里边第一次加载时文字显示的bug(还会显示出来个“多”,猜测应该是渲染问题导致的)
self.pullCaption.className = CLASS_PULL_CAPTION + ' ' + CLASS_PULL_CAPTION_REFRESH;
self.pullCaption.innerHTML = self.options.up.contentrefresh;
callback = callback || self.options.up.callback;
callback && callback.call(self);
}, 300);
},
pullupLoading:function (callback) {//兼容老的API
this.beginPullup(callback);
},
endPullup:function(finished) {//上拉加载结束
var self = this;
if (self.pullLoading) {
self.pullLoading.classList.remove(CLASS_VISIBILITY);
self.pullLoading.classList.add(CLASS_HIDDEN);
self.isLoading = false;
if (finished) {
self.finished = true;
self.pullCaption.className = CLASS_PULL_CAPTION + ' ' + CLASS_PULL_CAPTION_NOMORE;
self.pullCaption.innerHTML = self.options.up.contentnomore;
//取消5+的plusscrollbottom事件
document.removeEventListener('plusscrollbottom', self);
window.removeEventListener('dragup', self);
} else { //初始化时隐藏,后续不再隐藏
self.pullCaption.className = CLASS_PULL_CAPTION + ' ' + CLASS_PULL_CAPTION_DOWN;
self.pullCaption.innerHTML = self.options.up.contentdown;
}
}
},
endPullupToRefresh: function (finished) {//上拉加载结束兼容老的API
this.endPullup(finished);
},
disablePullupToRefresh: function() {
this._initPullupRefresh();
this.bottomPocket.className = $.className('pull-bottom-pocket') + ' ' + CLASS_HIDDEN;
window.removeEventListener('dragup', this);
},
enablePullupToRefresh: function() {
this._initPullupRefresh();
this.bottomPocket.classList.remove(CLASS_HIDDEN);
this.pullCaption.className = CLASS_PULL_CAPTION + ' ' + CLASS_PULL_CAPTION_DOWN;
this.pullCaption.innerHTML = this.options.up.contentdown;
document.addEventListener("plusscrollbottom", this);
window.addEventListener('dragup', this);
},
scrollTo: function(x, y, time) {
$.scrollTo(y, time);
},
scrollToBottom: function(time) {
$.scrollTo(document.documentElement.scrollHeight, time);
},
refresh: function(isReset) {
if (isReset && this.finished) {
this.enablePullupToRefresh();
this.finished = false;
}
}
}, $.PullRefresh));
//override h5 pullRefresh
$.fn.pullRefresh_native = function(options) {
var self;
if (this.length === 0) {
self = document.createElement('div');
self.className = 'mui-content';
document.body.appendChild(self);
} else {
self = this[0];
}
var args = options;
//一个父需要支持多个子下拉刷新
options = options || {}
if (typeof options === 'string') {
options = $.parseJSON(options);
};
!options.webviewId && (options.webviewId = (plus.webview.currentWebview().id || plus.webview.currentWebview().getURL()));
var pullRefreshApi = null;
var attrWebviewId = options.webviewId && options.webviewId.replace(/\//g, "_"); //替换所有"/"
var id = self.getAttribute('data-pullrefresh-plus-' + attrWebviewId);
if (!id && typeof args === 'undefined') {
return false;
}
if (!id) { //避免重复初始化5+ pullrefresh
id = ++$.uuid;
self.setAttribute('data-pullrefresh-plus-' + attrWebviewId, id);
document.body.classList.add(CLASS_PLUS_PULLREFRESH);
$.data[id] = pullRefreshApi = new PlusPullRefresh(self, options);
} else {
pullRefreshApi = $.data[id];
}
if (options.down && options.down.auto) { //如果设置了auto则自动下拉一次
//pullRefreshApi._pulldownLoading(); //parent webview
pullRefreshApi.beginPulldown();
} else if (options.up && options.up.auto) { //如果设置了auto则自动上拉一次
pullRefreshApi.beginPullup();
}
return pullRefreshApi;
};
});
})(mui, document);