|
|
/**
|
|
|
* 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); |