| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313 | 
							- /**
 
-  * dropload
 
-  * 西门(http://ons.me/526.html)
 
-  * 0.9.1(161205)
 
-  */
 
- ;(function($){
 
-     'use strict';
 
-     var win = window;
 
-     var doc = document;
 
-     var $win = $(win);
 
-     var $doc = $(doc);
 
-     $.fn.dropload = function(options){
 
-         return new MyDropLoad(this, options);
 
-     };
 
-     var MyDropLoad = function(element, options){
 
-         var me = this;
 
-         me.$element = element;
 
-         // 上方是否插入DOM
 
-         me.upInsertDOM = false;
 
-         // loading状态
 
-         me.loading = false;
 
-         // 是否锁定
 
-         me.isLockUp = false;
 
-         me.isLockDown = false;
 
-         // 是否有数据
 
-         me.isData = true;
 
-         me._scrollTop = 0;
 
-         me._threshold = 0;
 
-         me.init(options);
 
-     };
 
-     // 初始化
 
-     MyDropLoad.prototype.init = function(options){
 
-         var me = this;
 
-         me.opts = $.extend(true, {}, {
 
-             scrollArea : me.$element,                                            // 滑动区域
 
-             domUp : {                                                            // 上方DOM
 
-                 domClass   : 'dropload-up',
 
-                 domRefresh : '<div class="dropload-refresh">↓下拉刷新</div>',
 
-                 domUpdate  : '<div class="dropload-update">↑释放更新</div>',
 
-                 domLoad    : '<div class="dropload-load"><span class="loading"></span>加载中...</div>'
 
-             },
 
-             domDown : {                                                          // 下方DOM
 
-                 domClass   : 'dropload-down',
 
-                 domRefresh : '<div class="dropload-refresh">↑上拉加载更多</div>',
 
-                 domLoad    : '<div class="dropload-load"><span class="loading"></span>加载中...</div>',
 
-                 domNoData  : '<div class="dropload-noData">暂无数据</div>'
 
-             },
 
-             autoLoad : true,                                                     // 自动加载
 
-             distance : 50,                                                       // 拉动距离
 
-             threshold : '',                                                      // 提前加载距离
 
-             loadUpFn : '',                                                       // 上方function
 
-             loadDownFn : ''                                                      // 下方function
 
-         }, options);
 
-         // 如果加载下方,事先在下方插入DOM
 
-         if(me.opts.loadDownFn != ''){
 
-             me.$element.append('<div class="'+me.opts.domDown.domClass+'">'+me.opts.domDown.domRefresh+'</div>');
 
-             me.$domDown = $('.'+me.opts.domDown.domClass);
 
-         }
 
-         // 计算提前加载距离
 
-         if(!!me.$domDown && me.opts.threshold === ''){
 
-             // 默认滑到加载区2/3处时加载
 
-             me._threshold = Math.floor(me.$domDown.height()*1/3);
 
-         }else{
 
-             me._threshold = me.opts.threshold;
 
-         }
 
-         // 判断滚动区域
 
-         if(me.opts.scrollArea == win){
 
-             me.$scrollArea = $win;
 
-             // 获取文档高度
 
-             me._scrollContentHeight = $doc.height();
 
-             // 获取win显示区高度  —— 这里有坑
 
-             me._scrollWindowHeight = doc.documentElement.clientHeight;
 
-         }else{
 
-             me.$scrollArea = me.opts.scrollArea;
 
-             me._scrollContentHeight = me.$element[0].scrollHeight;
 
-             me._scrollWindowHeight = me.$element.height();
 
-         }
 
-         fnAutoLoad(me);
 
-         // 窗口调整
 
-         $win.on('resize',function(){
 
-             clearTimeout(me.timer);
 
-             me.timer = setTimeout(function(){
 
-                 if(me.opts.scrollArea == win){
 
-                 // 重新获取win显示区高度
 
-                 me._scrollWindowHeight = win.innerHeight;
 
-                 }else{
 
-                     me._scrollWindowHeight = me.$element.height();
 
-                 }
 
-                 fnAutoLoad(me);
 
-             },150);
 
-             
 
-         });
 
-         // 绑定触摸
 
-         me.$element.on('touchstart',function(e){
 
-             if(!me.loading){
 
-                 fnTouches(e);
 
-                 fnTouchstart(e, me);
 
-             }
 
-         });
 
-         me.$element.on('touchmove',function(e){
 
-             if(!me.loading){
 
-                 fnTouches(e, me);
 
-                 fnTouchmove(e, me);
 
-             }
 
-         });
 
-         me.$element.on('touchend',function(){
 
-             if(!me.loading){
 
-                 fnTouchend(me);
 
-             }
 
-         });
 
-         // 加载下方
 
-         me.$scrollArea.on('scroll',function(){
 
-             me._scrollTop = me.$scrollArea.scrollTop();
 
-             // 滚动页面触发加载数据
 
-             if(me.opts.loadDownFn != '' && !me.loading && !me.isLockDown && (me._scrollContentHeight - me._threshold) <= (me._scrollWindowHeight + me._scrollTop)){
 
-                 loadDown(me);
 
-             }
 
-         });
 
-     };
 
-     // touches
 
-     function fnTouches(e){
 
-         if(!e.touches){
 
-             e.touches = e.originalEvent.touches;
 
-         }
 
-     }
 
-     // touchstart
 
-     function fnTouchstart(e, me){
 
-         me._startY = e.touches[0].pageY;
 
-         // 记住触摸时的scrolltop值
 
-         me.touchScrollTop = me.$scrollArea.scrollTop();
 
-     }
 
-     // touchmove
 
-     function fnTouchmove(e, me){
 
-         me._curY = e.touches[0].pageY;
 
-         me._moveY = me._curY - me._startY;
 
-         if(me._moveY > 0){
 
-             me.direction = 'down';
 
-         }else if(me._moveY < 0){
 
-             me.direction = 'up';
 
-         }
 
-         var _absMoveY = Math.abs(me._moveY);
 
-         // 加载上方
 
-         if(me.opts.loadUpFn != '' && me.touchScrollTop <= 0 && me.direction == 'down' && !me.isLockUp){
 
-             e.preventDefault();
 
-             me.$domUp = $('.'+me.opts.domUp.domClass);
 
-             // 如果加载区没有DOM
 
-             if(!me.upInsertDOM){
 
-                 me.$element.prepend('<div class="'+me.opts.domUp.domClass+'"></div>');
 
-                 me.upInsertDOM = true;
 
-             }
 
-             
 
-             fnTransition(me.$domUp,0);
 
-             // 下拉
 
-             if(_absMoveY <= me.opts.distance){
 
-                 me._offsetY = _absMoveY;
 
-                 // todo:move时会不断清空、增加dom,有可能影响性能,下同
 
-                 me.$domUp.html(me.opts.domUp.domRefresh);
 
-             // 指定距离 < 下拉距离 < 指定距离*2
 
-             }else if(_absMoveY > me.opts.distance && _absMoveY <= me.opts.distance*2){
 
-                 me._offsetY = me.opts.distance+(_absMoveY-me.opts.distance)*0.5;
 
-                 me.$domUp.html(me.opts.domUp.domUpdate);
 
-             // 下拉距离 > 指定距离*2
 
-             }else{
 
-                 me._offsetY = me.opts.distance+me.opts.distance*0.5+(_absMoveY-me.opts.distance*2)*0.2;
 
-             }
 
-             me.$domUp.css({'height': me._offsetY});
 
-         }
 
-     }
 
-     // touchend
 
-     function fnTouchend(me){
 
-         var _absMoveY = Math.abs(me._moveY);
 
-         if(me.opts.loadUpFn != '' && me.touchScrollTop <= 0 && me.direction == 'down' && !me.isLockUp){
 
-             fnTransition(me.$domUp,300);
 
-             if(_absMoveY > me.opts.distance){
 
-                 me.$domUp.css({'height':me.$domUp.children().height()});
 
-                 me.$domUp.html(me.opts.domUp.domLoad);
 
-                 me.loading = true;
 
-                 me.opts.loadUpFn(me);
 
-             }else{
 
-                 me.$domUp.css({'height':'0'}).on('webkitTransitionEnd mozTransitionEnd transitionend',function(){
 
-                     me.upInsertDOM = false;
 
-                     $(this).remove();
 
-                 });
 
-             }
 
-             me._moveY = 0;
 
-         }
 
-     }
 
-     // 如果文档高度不大于窗口高度,数据较少,自动加载下方数据
 
-     function fnAutoLoad(me){
 
-         if(me.opts.loadDownFn != '' && me.opts.autoLoad){
 
-             if((me._scrollContentHeight - me._threshold) <= me._scrollWindowHeight){
 
-                 loadDown(me);
 
-             }
 
-         }
 
-     }
 
-     // 重新获取文档高度
 
-     function fnRecoverContentHeight(me){
 
-         if(me.opts.scrollArea == win){
 
-             me._scrollContentHeight = $doc.height();
 
-         }else{
 
-             me._scrollContentHeight = me.$element[0].scrollHeight;
 
-         }
 
-     }
 
-     // 加载下方
 
-     function loadDown(me){
 
-         me.direction = 'up';
 
-         me.$domDown.html(me.opts.domDown.domLoad);
 
-         me.loading = true;
 
-         me.opts.loadDownFn(me);
 
-     }
 
-     // 锁定
 
-     MyDropLoad.prototype.lock = function(direction){
 
-         var me = this;
 
-         // 如果不指定方向
 
-         if(direction === undefined){
 
-             // 如果操作方向向上
 
-             if(me.direction == 'up'){
 
-                 me.isLockDown = true;
 
-             // 如果操作方向向下
 
-             }else if(me.direction == 'down'){
 
-                 me.isLockUp = true;
 
-             }else{
 
-                 me.isLockUp = true;
 
-                 me.isLockDown = true;
 
-             }
 
-         // 如果指定锁上方
 
-         }else if(direction == 'up'){
 
-             me.isLockUp = true;
 
-         // 如果指定锁下方
 
-         }else if(direction == 'down'){
 
-             me.isLockDown = true;
 
-             // 为了解决DEMO5中tab效果bug,因为滑动到下面,再滑上去点tab,direction=down,所以有bug
 
-             me.direction = 'up';
 
-         }
 
-     };
 
-     // 解锁
 
-     MyDropLoad.prototype.unlock = function(){
 
-         var me = this;
 
-         // 简单粗暴解锁
 
-         me.isLockUp = false;
 
-         me.isLockDown = false;
 
-         // 为了解决DEMO5中tab效果bug,因为滑动到下面,再滑上去点tab,direction=down,所以有bug
 
-         me.direction = 'up';
 
-     };
 
-     // 无数据
 
-     MyDropLoad.prototype.noData = function(flag){
 
-         var me = this;
 
-         if(flag === undefined || flag == true){
 
-             me.isData = false;
 
-         }else if(flag == false){
 
-             me.isData = true;
 
-         }
 
-     };
 
-     // 重置
 
-     MyDropLoad.prototype.resetload = function(){
 
-         var me = this;
 
-         if(me.direction == 'down' && me.upInsertDOM){
 
-             me.$domUp.css({'height':'0'}).on('webkitTransitionEnd mozTransitionEnd transitionend',function(){
 
-                 me.loading = false;
 
-                 me.upInsertDOM = false;
 
-                 $(this).remove();
 
-                 fnRecoverContentHeight(me);
 
-             });
 
-         }else if(me.direction == 'up'){
 
-             me.loading = false;
 
-             // 如果有数据
 
-             if(me.isData){
 
-                 // 加载区修改样式
 
-                 me.$domDown.html(me.opts.domDown.domRefresh);
 
-                 fnRecoverContentHeight(me);
 
-                 fnAutoLoad(me);
 
-             }else{
 
-                 // 如果没数据
 
-                 me.$domDown.html(me.opts.domDown.domNoData);
 
-             }
 
-         }
 
-     };
 
-     // css过渡
 
-     function fnTransition(dom,num){
 
-         dom.css({
 
-             '-webkit-transition':'all '+num+'ms',
 
-             'transition':'all '+num+'ms'
 
-         });
 
-     }
 
- })(window.Zepto || window.jQuery);
 
 
  |