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

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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