-
Notifications
You must be signed in to change notification settings - Fork 22
/
refresh.js
214 lines (195 loc) · 8.49 KB
/
refresh.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
/**
* @file 加载更多组件
* @name Refresh
* @desc 加载更多组件
* @import core/zepto.ui.js
* @importCSS loading.css
*/
(function($, undefined) {
/**
* @name $.ui.refresh
* @grammar $.ui.refresh(options) ⇒ self
* @grammar refresh(options) ⇒ self
* @desc **Options**
* - ''ready'' {Function}: (必选) 当点击按钮,或者滑动达到可加载内容条件时,此方法会被调用。需要在此方法里面进行ajax内容请求,并在请求完后,调用afterDataLoading(),通知refresh组件,改变状态。
* - ''statechange'' {Function}: (可选) 样式改变时触发,该事件可以被阻止,阻止后可以自定义加载样式,回调参数:event(事件对象), elem(refresh按钮元素), state(状态), dir(方向)
* - ''events'' 所有[Trigger Events](#refresh_triggerevents)中提及的事件都可以在此设置Hander, 如init: function(e){}。
*
* **setup方式html规则**
* <code type="html">
* <div>
* <!--如果需要在头部放更多按钮-->
* <div class="ui-refresh-up"></div>
* ......
* <!--如果需要在底部放更多按钮-->
* <div class="ui-refresh-down"></div>
* </div>
* </code>
* @notice 此组件不支持render模式,只支持setup模式
* @desc **Demo**
* <codepreview href="../gmu/_examples/widget/refresh/refresh.html">
* ../gmu/_examples/widget/refresh/refresh.html
* </codepreview>
*/
$.ui.define('refresh', {
_data: {
ready: null,
statechange: null
},
_setup: function () {
var me = this,
data = me._data,
$el = me.root();
data.$upElem = $el.find('.ui-refresh-up');
data.$downElem = $el.find('.ui-refresh-down');
$el.addClass('ui-refresh');
return me;
},
_init: function() {
var me = this,
data = me._data;
$.each(['up', 'down'], function (i, dir) {
var $elem = data['$' + dir + 'Elem'],
elem = $elem.get(0);
if ($elem.length) {
me._status(dir, true); //初始设置加载状态为可用
if (!elem.childNodes.length || ($elem.find('.ui-refresh-icon').length && $elem.find('.ui-refresh-label').length)) { //若内容为空则创建,若不满足icon和label的要求,则不做处理
!elem.childNodes.length && me._createBtn(dir);
data.refreshInfo || (data.refreshInfo = {});
data.refreshInfo[dir] = {
$icon: $elem.find('.ui-refresh-icon'),
$label: $elem.find('.ui-refresh-label'),
text: $elem.find('.ui-refresh-label').html()
}
}
$elem.on('click', function () {
if (!me._status(dir) || data._actDir) return; //检查是否处于可用状态,同一方向上的仍在加载中,或者不同方向的还未加载完成 traceID:FEBASE-569
me._setStyle(dir, 'loading');
me._loadingAction(dir, 'click');
});
}
});
return me;
},
_createBtn: function (dir) {
this._data['$' + dir + 'Elem'].html('<span class="ui-refresh-icon"></span><span class="ui-refresh-label">加载更多</span>');
return this;
},
_setStyle: function (dir, state) {
var me = this,
stateChange = $.Event('statechange');
me.trigger(stateChange, [me._data['$' + dir + 'Elem'], state, dir]);
if (stateChange.defaultPrevented) return me;
return me._changeStyle(dir, state);
},
_changeStyle: function (dir, state) {
var data = this._data,
refreshInfo = data.refreshInfo[dir];
switch (state) {
case 'loaded':
refreshInfo['$label'].html(refreshInfo['text']);
refreshInfo['$icon'].removeClass();
data._actDir = '';
break;
case 'loading':
refreshInfo['$label'].html('加载中...');
refreshInfo['$icon'].addClass('ui-loading');
data._actDir = dir;
break;
case 'disable':
refreshInfo['$label'].html('没有更多内容了');
break;
}
return this;
},
_loadingAction: function (dir, type) {
var me = this,
data = me._data,
readyFn = data.ready;
$.isFunction(readyFn) && readyFn.call(me, dir, type);
me._status(dir, false);
return me;
},
/**
* @name afterDataLoading
* @grammar afterDataLoading(dir) ⇒ instance
* @desc - ''dir'' \'up\' 或者 \'down\'
*
* 当组件调用ready,在ready中通过ajax请求内容回来后,需要调用此方法,来改变refresh状态。
*/
afterDataLoading: function (dir) {
var me = this,
dir = dir || me._data._actDir;
me._setStyle(dir, 'loaded');
me._status(dir, true);
return me;
},
/**
* @name status
* @grammar status(dir, status) ⇒ instance
* @desc 用来设置加载是否可用,分方向的。
* - ''dir'' \'up\' 或者 \'down\'
* - ''status'' ''true'' 或者 ''false''。
*
* 当组件调用reday,在ready中通过ajax请求内容回来后,需要调用此方法,来改变refresh状态。
*/
_status: function(dir, status) {
var data = this._data;
return status === undefined ? data['_' + dir + 'Open'] : data['_' + dir + 'Open'] = !!status;
},
_setable: function (able, dir, hide) {
var me = this,
data = me._data,
dirArr = dir ? [dir] : ['up', 'down'];
$.each(dirArr, function (i, dir) {
var $elem = data['$' + dir + 'Elem'];
if (!$elem.length) return;
//若是enable操作,直接显示,disable则根据text是否是true来确定是否隐藏
able ? $elem.show() : (hide ? $elem.hide() : me._setStyle(dir, 'disable'));
me._status(dir, able);
});
return me;
},
/**
* @name disable
* @grammar disable(dir) ⇒ instance
* @desc 如果已无类容可加载时,可以调用此方法来,禁用Refresh。
* - ''dir'' \'up\' 或者 \'down\'
* - ''hide'' {Boolean} 是否隐藏按钮。如果此属性为false,将只有文字变化。
*/
disable: function (dir, hide) {
return this._setable(false, dir, hide);
},
/**
* @name enable
* @grammar enable(dir) ⇒ instance
* @desc 用来启用组件。
* - ''dir'' \'up\' 或者 \'down\'
*/
enable: function (dir) {
return this._setable(true, dir);
}
/**
* @name Trigger Events
* @theme event
* @desc 组件内部触发的事件
*
* ^ 名称 ^ 处理函数参数 ^ 描述 ^
* | init | event | 组件初始化的时候触发,不管是render模式还是setup模式都会触发 |
* | statechange | event, elem, state, dir | 组件发生状态变化时会触发 |
* | destroy | event | 组件在销毁的时候触发 |
*
* **组件状态说明**
* - ''loaded'' 默认状态
* - ''loading'' 加载中状态。
* - ''disabled'' 禁用状态,表示无内容加载了!
* - ''beforeload'' 在手没有松开前满足加载的条件状态。 需要引入插件才有此状态,lite,iscroll,或者iOS5。
*
* statechnage事件可以用来DIY按钮样式,包括各种状态。组件内部通过了一套,如果statechange事件被阻止了,组件内部的将不会执行。
* 如:
* <codepreview href="../gmu/_examples/widget/refresh/refresh_iscroll_custom.html">
* ../gmu/_examples/widget/refresh/refresh_iscroll_custom.html
* </codepreview>
*/
});
})(Zepto);