luv-assets 1.0.2 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,313 @@
1
+ /**
2
+ * dropload
3
+ * 西门(http://ons.me/526.html)
4
+ * 0.9.1(161205)
5
+ */
6
+
7
+ ;(function($){
8
+ 'use strict';
9
+ var win = window;
10
+ var doc = document;
11
+ var $win = $(win);
12
+ var $doc = $(doc);
13
+ $.fn.dropload = function(options){
14
+ return new MyDropLoad(this, options);
15
+ };
16
+ var MyDropLoad = function(element, options){
17
+ var me = this;
18
+ me.$element = element;
19
+ // 上方是否插入DOM
20
+ me.upInsertDOM = false;
21
+ // loading状态
22
+ me.loading = false;
23
+ // 是否锁定
24
+ me.isLockUp = false;
25
+ me.isLockDown = false;
26
+ // 是否有数据
27
+ me.isData = true;
28
+ me._scrollTop = 0;
29
+ me._threshold = 0;
30
+ me.init(options);
31
+ };
32
+
33
+ // 初始化
34
+ MyDropLoad.prototype.init = function(options){
35
+ var me = this;
36
+ me.opts = $.extend(true, {}, {
37
+ scrollArea : me.$element, // 滑动区域
38
+ domUp : { // 上方DOM
39
+ domClass : 'dropload-up',
40
+ domRefresh : '<div class="dropload-refresh">↓下拉刷新</div>',
41
+ domUpdate : '<div class="dropload-update">↑释放更新</div>',
42
+ domLoad : '<div class="dropload-load"><span class="loading"></span>加载中...</div>'
43
+ },
44
+ domDown : { // 下方DOM
45
+ domClass : 'dropload-down',
46
+ domRefresh : '<div class="dropload-refresh">↑上拉加载更多</div>',
47
+ domLoad : '<div class="dropload-load"><span class="loading"></span>加载中...</div>',
48
+ domNoData : '<div class="dropload-noData">暂无数据</div>'
49
+ },
50
+ autoLoad : true, // 自动加载
51
+ distance : 50, // 拉动距离
52
+ threshold : '', // 提前加载距离
53
+ loadUpFn : '', // 上方function
54
+ loadDownFn : '' // 下方function
55
+ }, options);
56
+
57
+ // 如果加载下方,事先在下方插入DOM
58
+ if(me.opts.loadDownFn != ''){
59
+ me.$element.append('<div class="'+me.opts.domDown.domClass+'">'+me.opts.domDown.domRefresh+'</div>');
60
+ me.$domDown = $('.'+me.opts.domDown.domClass);
61
+ }
62
+
63
+ // 计算提前加载距离
64
+ if(!!me.$domDown && me.opts.threshold === ''){
65
+ // 默认滑到加载区2/3处时加载
66
+ me._threshold = Math.floor(me.$domDown.height()*1/3);
67
+ }else{
68
+ me._threshold = me.opts.threshold;
69
+ }
70
+
71
+ // 判断滚动区域
72
+ if(me.opts.scrollArea == win){
73
+ me.$scrollArea = $win;
74
+ // 获取文档高度
75
+ me._scrollContentHeight = $doc.height();
76
+ // 获取win显示区高度 —— 这里有坑
77
+ me._scrollWindowHeight = doc.documentElement.clientHeight;
78
+ }else{
79
+ me.$scrollArea = me.opts.scrollArea;
80
+ me._scrollContentHeight = me.$element[0].scrollHeight;
81
+ me._scrollWindowHeight = me.$element.height();
82
+ }
83
+ fnAutoLoad(me);
84
+
85
+ // 窗口调整
86
+ $win.on('resize',function(){
87
+ clearTimeout(me.timer);
88
+ me.timer = setTimeout(function(){
89
+ if(me.opts.scrollArea == win){
90
+ // 重新获取win显示区高度
91
+ me._scrollWindowHeight = win.innerHeight;
92
+ }else{
93
+ me._scrollWindowHeight = me.$element.height();
94
+ }
95
+ fnAutoLoad(me);
96
+ },150);
97
+
98
+ });
99
+
100
+ // 绑定触摸
101
+ me.$element.on('touchstart',function(e){
102
+ if(!me.loading){
103
+ fnTouches(e);
104
+ fnTouchstart(e, me);
105
+ }
106
+ });
107
+ me.$element.on('touchmove',function(e){
108
+ if(!me.loading){
109
+ fnTouches(e, me);
110
+ fnTouchmove(e, me);
111
+ }
112
+ });
113
+ me.$element.on('touchend',function(){
114
+ if(!me.loading){
115
+ fnTouchend(me);
116
+ }
117
+ });
118
+
119
+ // 加载下方
120
+ me.$scrollArea.on('scroll',function(){
121
+ me._scrollTop = me.$scrollArea.scrollTop();
122
+
123
+ // 滚动页面触发加载数据
124
+ if(me.opts.loadDownFn != '' && !me.loading && !me.isLockDown && (me._scrollContentHeight - me._threshold) <= (me._scrollWindowHeight + me._scrollTop)){
125
+ loadDown(me);
126
+ }
127
+ });
128
+ };
129
+
130
+ // touches
131
+ function fnTouches(e){
132
+ if(!e.touches){
133
+ e.touches = e.originalEvent.touches;
134
+ }
135
+ }
136
+
137
+ // touchstart
138
+ function fnTouchstart(e, me){
139
+ me._startY = e.touches[0].pageY;
140
+ // 记住触摸时的scrolltop值
141
+ me.touchScrollTop = me.$scrollArea.scrollTop();
142
+ }
143
+
144
+ // touchmove
145
+ function fnTouchmove(e, me){
146
+ me._curY = e.touches[0].pageY;
147
+ me._moveY = me._curY - me._startY;
148
+
149
+ if(me._moveY > 0){
150
+ me.direction = 'down';
151
+ }else if(me._moveY < 0){
152
+ me.direction = 'up';
153
+ }
154
+
155
+ var _absMoveY = Math.abs(me._moveY);
156
+
157
+ // 加载上方
158
+ if(me.opts.loadUpFn != '' && me.touchScrollTop <= 0 && me.direction == 'down' && !me.isLockUp){
159
+ e.preventDefault();
160
+
161
+ me.$domUp = $('.'+me.opts.domUp.domClass);
162
+ // 如果加载区没有DOM
163
+ if(!me.upInsertDOM){
164
+ me.$element.prepend('<div class="'+me.opts.domUp.domClass+'"></div>');
165
+ me.upInsertDOM = true;
166
+ }
167
+
168
+ fnTransition(me.$domUp,0);
169
+
170
+ // 下拉
171
+ if(_absMoveY <= me.opts.distance){
172
+ me._offsetY = _absMoveY;
173
+ // todo:move时会不断清空、增加dom,有可能影响性能,下同
174
+ me.$domUp.html(me.opts.domUp.domRefresh);
175
+ // 指定距离 < 下拉距离 < 指定距离*2
176
+ }else if(_absMoveY > me.opts.distance && _absMoveY <= me.opts.distance*2){
177
+ me._offsetY = me.opts.distance+(_absMoveY-me.opts.distance)*0.5;
178
+ me.$domUp.html(me.opts.domUp.domUpdate);
179
+ // 下拉距离 > 指定距离*2
180
+ }else{
181
+ me._offsetY = me.opts.distance+me.opts.distance*0.5+(_absMoveY-me.opts.distance*2)*0.2;
182
+ }
183
+
184
+ me.$domUp.css({'height': me._offsetY});
185
+ }
186
+ }
187
+
188
+ // touchend
189
+ function fnTouchend(me){
190
+ var _absMoveY = Math.abs(me._moveY);
191
+ if(me.opts.loadUpFn != '' && me.touchScrollTop <= 0 && me.direction == 'down' && !me.isLockUp){
192
+ fnTransition(me.$domUp,300);
193
+
194
+ if(_absMoveY > me.opts.distance){
195
+ me.$domUp.css({'height':me.$domUp.children().height()});
196
+ me.$domUp.html(me.opts.domUp.domLoad);
197
+ me.loading = true;
198
+ me.opts.loadUpFn(me);
199
+ }else{
200
+ me.$domUp.css({'height':'0'}).on('webkitTransitionEnd mozTransitionEnd transitionend',function(){
201
+ me.upInsertDOM = false;
202
+ $(this).remove();
203
+ });
204
+ }
205
+ me._moveY = 0;
206
+ }
207
+ }
208
+
209
+ // 如果文档高度不大于窗口高度,数据较少,自动加载下方数据
210
+ function fnAutoLoad(me){
211
+ if(me.opts.loadDownFn != '' && me.opts.autoLoad){
212
+ if((me._scrollContentHeight - me._threshold) <= me._scrollWindowHeight){
213
+ loadDown(me);
214
+ }
215
+ }
216
+ }
217
+
218
+ // 重新获取文档高度
219
+ function fnRecoverContentHeight(me){
220
+ if(me.opts.scrollArea == win){
221
+ me._scrollContentHeight = $doc.height();
222
+ }else{
223
+ me._scrollContentHeight = me.$element[0].scrollHeight;
224
+ }
225
+ }
226
+
227
+ // 加载下方
228
+ function loadDown(me){
229
+ me.direction = 'up';
230
+ me.$domDown.html(me.opts.domDown.domLoad);
231
+ me.loading = true;
232
+ me.opts.loadDownFn(me);
233
+ }
234
+
235
+ // 锁定
236
+ MyDropLoad.prototype.lock = function(direction){
237
+ var me = this;
238
+ // 如果不指定方向
239
+ if(direction === undefined){
240
+ // 如果操作方向向上
241
+ if(me.direction == 'up'){
242
+ me.isLockDown = true;
243
+ // 如果操作方向向下
244
+ }else if(me.direction == 'down'){
245
+ me.isLockUp = true;
246
+ }else{
247
+ me.isLockUp = true;
248
+ me.isLockDown = true;
249
+ }
250
+ // 如果指定锁上方
251
+ }else if(direction == 'up'){
252
+ me.isLockUp = true;
253
+ // 如果指定锁下方
254
+ }else if(direction == 'down'){
255
+ me.isLockDown = true;
256
+ // 为了解决DEMO5中tab效果bug,因为滑动到下面,再滑上去点tab,direction=down,所以有bug
257
+ me.direction = 'up';
258
+ }
259
+ };
260
+
261
+ // 解锁
262
+ MyDropLoad.prototype.unlock = function(){
263
+ var me = this;
264
+ // 简单粗暴解锁
265
+ me.isLockUp = false;
266
+ me.isLockDown = false;
267
+ // 为了解决DEMO5中tab效果bug,因为滑动到下面,再滑上去点tab,direction=down,所以有bug
268
+ me.direction = 'up';
269
+ };
270
+
271
+ // 无数据
272
+ MyDropLoad.prototype.noData = function(flag){
273
+ var me = this;
274
+ if(flag === undefined || flag == true){
275
+ me.isData = false;
276
+ }else if(flag == false){
277
+ me.isData = true;
278
+ }
279
+ };
280
+
281
+ // 重置
282
+ MyDropLoad.prototype.resetload = function(){
283
+ var me = this;
284
+ if(me.direction == 'down' && me.upInsertDOM){
285
+ me.$domUp.css({'height':'0'}).on('webkitTransitionEnd mozTransitionEnd transitionend',function(){
286
+ me.loading = false;
287
+ me.upInsertDOM = false;
288
+ $(this).remove();
289
+ fnRecoverContentHeight(me);
290
+ });
291
+ }else if(me.direction == 'up'){
292
+ me.loading = false;
293
+ // 如果有数据
294
+ if(me.isData){
295
+ // 加载区修改样式
296
+ me.$domDown.html(me.opts.domDown.domRefresh);
297
+ fnRecoverContentHeight(me);
298
+ fnAutoLoad(me);
299
+ }else{
300
+ // 如果没数据
301
+ me.$domDown.html(me.opts.domDown.domNoData);
302
+ }
303
+ }
304
+ };
305
+
306
+ // css过渡
307
+ function fnTransition(dom,num){
308
+ dom.css({
309
+ '-webkit-transition':'all '+num+'ms',
310
+ 'transition':'all '+num+'ms'
311
+ });
312
+ }
313
+ })(window.Zepto || window.jQuery);
@@ -0,0 +1,2 @@
1
+
2
+ !function(a){"use strict";function g(a){a.touches||(a.touches=a.originalEvent.touches)}function h(a,b){b._startY=a.touches[0].pageY,b.touchScrollTop=b.$scrollArea.scrollTop()}function i(b,c){c._curY=b.touches[0].pageY,c._moveY=c._curY-c._startY,c._moveY>0?c.direction="down":c._moveY<0&&(c.direction="up");var d=Math.abs(c._moveY);""!=c.opts.loadUpFn&&c.touchScrollTop<=0&&"down"==c.direction&&!c.isLockUp&&(b.preventDefault(),c.$domUp=a("."+c.opts.domUp.domClass),c.upInsertDOM||(c.$element.prepend('<div class="'+c.opts.domUp.domClass+'"></div>'),c.upInsertDOM=!0),n(c.$domUp,0),d<=c.opts.distance?(c._offsetY=d,c.$domUp.html(c.opts.domUp.domRefresh)):d>c.opts.distance&&d<=2*c.opts.distance?(c._offsetY=c.opts.distance+.5*(d-c.opts.distance),c.$domUp.html(c.opts.domUp.domUpdate)):c._offsetY=c.opts.distance+.5*c.opts.distance+.2*(d-2*c.opts.distance),c.$domUp.css({height:c._offsetY}))}function j(b){var c=Math.abs(b._moveY);""!=b.opts.loadUpFn&&b.touchScrollTop<=0&&"down"==b.direction&&!b.isLockUp&&(n(b.$domUp,300),c>b.opts.distance?(b.$domUp.css({height:b.$domUp.children().height()}),b.$domUp.html(b.opts.domUp.domLoad),b.loading=!0,b.opts.loadUpFn(b)):b.$domUp.css({height:"0"}).on("webkitTransitionEnd mozTransitionEnd transitionend",function(){b.upInsertDOM=!1,a(this).remove()}),b._moveY=0)}function k(a){""!=a.opts.loadDownFn&&a.opts.autoLoad&&a._scrollContentHeight-a._threshold<=a._scrollWindowHeight&&m(a)}function l(a){a._scrollContentHeight=a.opts.scrollArea==b?e.height():a.$element[0].scrollHeight}function m(a){a.direction="up",a.$domDown.html(a.opts.domDown.domLoad),a.loading=!0,a.opts.loadDownFn(a)}function n(a,b){a.css({"-webkit-transition":"all "+b+"ms",transition:"all "+b+"ms"})}var f,b=window,c=document,d=a(b),e=a(c);a.fn.dropload=function(a){return new f(this,a)},f=function(a,b){var c=this;c.$element=a,c.upInsertDOM=!1,c.loading=!1,c.isLockUp=!1,c.isLockDown=!1,c.isData=!0,c._scrollTop=0,c._threshold=0,c.init(b)},f.prototype.init=function(f){var l=this;l.opts=a.extend(!0,{},{scrollArea:l.$element,domUp:{domClass:"dropload-up",domRefresh:'<div class="dropload-refresh">refresh</div>',domUpdate:'<div class="dropload-update">update</div>',domLoad:'<div class="dropload-load"><span class="loading"></span>loading...</div>'},domDown:{domClass:"dropload-down",domRefresh:'<div class="dropload-refresh">load more</div>',domLoad:'<div class="dropload-load"><span class="loading"></span>loading...</div>',domNoData:'<div class="dropload-noData">empty</div>'},autoLoad:!0,distance:50,threshold:"",loadUpFn:"",loadDownFn:""},f),""!=l.opts.loadDownFn&&(l.$element.append('<div class="'+l.opts.domDown.domClass+'">'+l.opts.domDown.domRefresh+"</div>"),l.$domDown=a("."+l.opts.domDown.domClass)),l._threshold=l.$domDown&&""===l.opts.threshold?Math.floor(1*l.$domDown.height()/3):l.opts.threshold,l.opts.scrollArea==b?(l.$scrollArea=d,l._scrollContentHeight=e.height(),l._scrollWindowHeight=c.documentElement.clientHeight):(l.$scrollArea=l.opts.scrollArea,l._scrollContentHeight=l.$element[0].scrollHeight,l._scrollWindowHeight=l.$element.height()),k(l),d.on("resize",function(){clearTimeout(l.timer),l.timer=setTimeout(function(){l._scrollWindowHeight=l.opts.scrollArea==b?b.innerHeight:l.$element.height(),k(l)},150)}),l.$element.on("touchstart",function(a){l.loading||(g(a),h(a,l))}),l.$element.on("touchmove",function(a){l.loading||(g(a,l),i(a,l))}),l.$element.on("touchend",function(){l.loading||j(l)}),l.$scrollArea.on("scroll",function(){l._scrollTop=l.$scrollArea.scrollTop(),""!=l.opts.loadDownFn&&!l.loading&&!l.isLockDown&&l._scrollContentHeight-l._threshold<=l._scrollWindowHeight+l._scrollTop&&m(l)})},f.prototype.lock=function(a){var b=this;void 0===a?"up"==b.direction?b.isLockDown=!0:"down"==b.direction?b.isLockUp=!0:(b.isLockUp=!0,b.isLockDown=!0):"up"==a?b.isLockUp=!0:"down"==a&&(b.isLockDown=!0,b.direction="up")},f.prototype.unlock=function(){var a=this;a.isLockUp=!1,a.isLockDown=!1,a.direction="up"},f.prototype.noData=function(a){var b=this;void 0===a||1==a?b.isData=!1:0==a&&(b.isData=!0)},f.prototype.resetload=function(){var b=this;"down"==b.direction&&b.upInsertDOM?b.$domUp.css({height:"0"}).on("webkitTransitionEnd mozTransitionEnd transitionend",function(){b.loading=!1,b.upInsertDOM=!1,a(this).remove(),l(b)}):"up"==b.direction&&(b.loading=!1,b.isData?(b.$domDown.html(b.opts.domDown.domRefresh),l(b),k(b)):b.$domDown.html(b.opts.domDown.domNoData))}}(window.Zepto||window.jQuery);