jquery-rockdoupull.js 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335
  1. /**
  2. * jqury的下拉上拉加载插件,带样式滚动条,呵呵。
  3. * createname:雨中磐石
  4. * homeurl:http://www.rockoa.com/
  5. * Copyright (c) 2016 rainrock (xh829.com)
  6. * Date:2016-11-24
  7. */
  8. (function ($) {
  9. function rockclass(element, options){
  10. var me = this;
  11. var opts = $.extend({
  12. ondragstart:function(){},
  13. ondrag:function(){},
  14. ondrayrl:function(){},
  15. ondrayrlend:false,
  16. scrollbool:true, //是否添加滚动条样式
  17. downbool:false, //是否下拉加载
  18. upbool:false, //是否上拉加载
  19. leftbool:false, //左
  20. rightbool:false, //右
  21. ondownbefore:function(){return true},
  22. onupbefore:function(){return true},
  23. downbgcolor:'#f1f1f1', //下拉背景
  24. upmsgdiv:'' //上来提示区域
  25. }, options);
  26. var obj = element;
  27. this._init=function(){
  28. this.rand = js.getrand();
  29. this.reloadbo = false;
  30. this.mobj = $(obj);
  31. for(var a in opts)this[a]=opts[a];
  32. obj.addEventListener('touchstart',function(e){
  33. me._dragstart(e);
  34. },false);
  35. obj.addEventListener('touchmove',function(e){
  36. me._dragmove(e);
  37. },false);
  38. obj.addEventListener('touchend',function(e){
  39. this.removeEventListener('touchmove', function(){}, false);
  40. this.removeEventListener('touchstart', function(){}, false);
  41. me._dragend(e);
  42. },false);
  43. this._initscrool();
  44. };
  45. this._dragstart=function(e){
  46. if(this.reloadbo)return;
  47. $('#updowns_'+this.rand+'').remove();
  48. this.startarr = [e.touches[0].clientX, e.touches[0].clientY, this.mobj.scrollTop(),obj.scrollHeight-this.mobj.height()];
  49. if(this.upbool && this.upmsgdiv)this.startarr[4]=$('#'+this.upmsgdiv+'').html();
  50. this.upstartbo = false;
  51. this.up_ysa = 0;
  52. this.movearr = [0,0];
  53. this.ondragstart(e);
  54. };
  55. this._dragmove=function(e){
  56. if(this.reloadbo)return;
  57. this.upheight = 0;
  58. var hei = e.touches[0].clientY-this.startarr[1],downbo=false,upbo=false,ler = e.touches[0].clientX-this.startarr[0];
  59. this.movearr = [ler,hei];
  60. var updown = Math.abs(hei) > Math.abs(ler);
  61. if(this.up_ysa==0)this.up_ysa = updown ? 1 :2;
  62. //js.msg('msg',''+hei+'.'+ler+'');
  63. //下拉刷新
  64. if(this.downbool && this.up_ysa==1){
  65. var dowbcak = this.ondownbefore();
  66. if(hei>0 && dowbcak && this.startarr[2]==0){
  67. e.preventDefault();
  68. downbo = true;
  69. }
  70. if(downbo){
  71. this._downstart(hei, dowbcak);
  72. }
  73. if(!downbo)$('#downs_'+this.rand+'').remove();
  74. }
  75. //上拉刷新
  76. if(this.upbool && this.up_ysa==1){
  77. var upback = this.onupbefore();
  78. if(hei<0 && upback && this.startarr[2]==this.startarr[3]){
  79. e.preventDefault();
  80. upbo = true;
  81. }
  82. if(upbo){
  83. this._upstart(hei, upback);
  84. }
  85. if(!upbo)this.translateY(0);
  86. }
  87. if(this.up_ysa==2){
  88. e.preventDefault();
  89. this.ondrayrl(ler, e);
  90. }
  91. //左滑动
  92. if(this.leftbool && ler<0 && this.up_ysa==2){
  93. this.mobj.css('transform','translateX('+ler+'px)');
  94. }
  95. //右滑动
  96. if(this.rightbool && ler>0 && this.up_ysa==2){
  97. this.mobj.css('transform','translateX('+ler+'px)');
  98. }
  99. this.ondrag(e,this.movearr);
  100. };
  101. this._downstart=function(hei){
  102. if(this.reloadbo)return;
  103. hei = hei*0.6;
  104. this.upheight = hei;
  105. if(hei>200)return;
  106. var sid = 'downs_'+this.rand+'',tx= '↓ 下拉刷新',o1;
  107. if(hei>50)tx='↑ 释放立即刷新';
  108. if(get(sid)){
  109. o1 = $('#'+sid+'');
  110. o1.css('height',''+hei+'px').find('div').html(tx);
  111. }else{
  112. var s = '<div id="'+sid+'" style="height:'+hei+'px;overflow:hidden; line-height:50px;text-align:center;color:#666666;background:'+this.downbgcolor+';font-size:14px;position:relative"><div style="height:50px;line-height:50px;position:absolute;left:0px;bottom:0px;width:100%">'+tx+'</div></div>';
  113. this.mobj.before(s);
  114. }
  115. };
  116. this._upstart=function(hei, bsrs){
  117. if(this.reloadbo)return;
  118. hei = hei*0.6;
  119. this.upheight = hei;
  120. if(hei<-200)return;
  121. var a = {msg:'↑ 上拉刷新','msgok': '↓ 释放立即刷新','msgdiv':this.upmsgdiv},i;
  122. if(typeof(bsrs)=='object'){
  123. for(i in bsrs)a[i]=bsrs[i];
  124. }
  125. var tx= a.msg;
  126. if(hei<-50)tx=a.msgok;
  127. if(a.msgdiv)$('#'+a.msgdiv+'').html(tx);
  128. this.upstartbo = true;
  129. this.translateY(hei);
  130. };
  131. this.translateY=function(h){
  132. var o = obj,val= "translateY("+h+"px)";
  133. o.style.transform=val;
  134. o.style.webkitTransform=val;
  135. o.style.msTransform=val;
  136. o.style.MozTransform=val;
  137. o.style.OTransform=val;
  138. };
  139. this._dragend=function(e){
  140. var sid = 'downs_'+this.rand+'';
  141. if(get(sid)){
  142. var o1 = $('#'+sid+'');
  143. if(this.upheight>50){
  144. this.reloadbo = true;
  145. o1.animate({'height':'50px'},200,function(){
  146. o1.html('<img src="images/loading.gif" align="absmiddle"> 刷新中...');
  147. me.ondownsuccess ? me.ondownsuccess(e) : me.ondownok();
  148. });
  149. }else{
  150. $('#'+sid+'').slideUp(200);
  151. }
  152. }
  153. var bhui = true;
  154. if(this.upheight<0){
  155. this.translateY(0);
  156. if(this.upheight<-50){
  157. this.reloadbo = true;
  158. if(this.onupsuccess){
  159. this.onupsuccess();
  160. }else{
  161. setTimeout(function(){me.onupok()}, 500);
  162. }
  163. bhui = false;
  164. }
  165. }
  166. if(this.upstartbo || bhui){
  167. if(this.upmsgdiv)$('#'+this.upmsgdiv+'').html(this.startarr[4]);
  168. }
  169. if(this.ondrayrlend){
  170. this.ondrayrlend(this.movearr[0], e);
  171. }
  172. };
  173. this.ondownok=function(ts){
  174. this.reloadbo = false;
  175. var o1 = $('#downs_'+this.rand+'');
  176. if(!ts)ts='√ 刷新成功';
  177. o1.html(ts);
  178. setTimeout(function(){o1.slideUp(200,function(){o1.remove();});}, 500);
  179. };
  180. this.ondownerror=function(ts){
  181. if(!ts)ts='× 超时失败';
  182. this.ondownok(ts);
  183. };
  184. this.onupok=function(ts){
  185. this.reloadbo = false;
  186. this.upstartbo = false;
  187. };
  188. this.onuperror=function(ts){
  189. if(!ts)ts='× 超时失败';
  190. this.ondownok(ts);
  191. };
  192. this._initscrool=function(){
  193. if(!this.scrollbool)return;
  194. var off = this.mobj.offset();
  195. this.scrollsid = 'scrolllists_'+this.rand+'';
  196. var l = off.left+this.mobj.width()-6;
  197. this.scroor_h = 80;
  198. this.scroor_hs = obj.scrollHeight;
  199. var s = '<div style="height:'+this.scroor_h+'px;width:5px;background:rgba(0,0,0,0.3);display:none;overflow:hidden;border-radius:2px;right:0px;top:0px;position:absolute" id="'+this.scrollsid+'"></div>';
  200. s='<div id="'+this.scrollsid+'_min" style="height:'+obj.clientHeight+'px;width:5px;overflow:hidden;position:fixed;z-index:1;background:rgba(0,0,0,0);left:'+l+'px;top:'+off.top+'px">'+s+'</div>';
  201. $('body').append(s);
  202. this.resize();
  203. this.mobj.scroll(function(){
  204. me._scrollov();
  205. });
  206. };
  207. this._hidescrolls = function(){
  208. clearTimeout(this._hidescrollstime);
  209. this._hidescrollstime = setTimeout(function(){
  210. $('#'+me.scrollsid+'').fadeOut();
  211. },1000);
  212. };
  213. this._scrollovs=function(){
  214. clearTimeout(this._scrollovstime);
  215. this._scrollovstime=setTimeout(function(){
  216. me._scrollov();
  217. },1);
  218. };
  219. this._scrollov=function(){
  220. var top,zh,bl,mh,wzh;
  221. top = this.mobj.scrollTop();
  222. wzh = obj.scrollHeight;
  223. if(wzh!=this.scroor_hs){
  224. this.resize();
  225. }
  226. zh = wzh-obj.clientHeight;
  227. mh = obj.clientHeight-this.scroor_h; //可滚动高度
  228. bl = top/zh;
  229. var jgt = bl*mh;
  230. $('#'+this.scrollsid+'').css('top',''+jgt+'px').show();
  231. this._hidescrolls();
  232. };
  233. this.hidescrolls=function(){
  234. $('#'+this.scrollsid+'').hide();
  235. }
  236. /**
  237. * 窗口改变时重新设置滚动条
  238. */
  239. this.resize = function(){
  240. if(!this.scrollbool)return;
  241. var off = this.mobj.offset(),zh;
  242. var l = off.left+this.mobj.width()-6,hei = obj.clientHeight;
  243. zh = obj.scrollHeight;
  244. $('#'+this.scrollsid+'_min').css({'left':''+l+'px','top':''+off.top+'px','height':''+hei+'px'});
  245. var bl = hei/zh;if(bl>1)bl=0.9;
  246. this.scroor_h = bl * hei;
  247. $('#'+this.scrollsid+'').css({'height':''+this.scroor_h+'px'});
  248. this.scroor_hs = zh;
  249. }
  250. };
  251. $.fn.rockdoupull = function(options){
  252. var can = $.extend({}, options);
  253. var clsa = new rockclass(this[0], can);
  254. clsa._init();
  255. return clsa;
  256. };
  257. /**
  258. * 长按
  259. */
  260. function longpress(element, options){
  261. var me = this;
  262. var opts = $.extend({
  263. ondragstart:function(){return true;}, //按下前
  264. ondragend:function(){return true;}, //按下后
  265. downbgcolor:'#f1f1f1', //下拉背景
  266. presstime:500,
  267. onpress:function(){}
  268. }, options);
  269. var obj = element;
  270. var obj = element;
  271. this.ele = obj;
  272. this._init=function(){
  273. this.mobj = $(obj);
  274. for(var a in opts)this[a]=opts[a];
  275. obj.addEventListener('touchstart',function(e){
  276. me._dragstart(e);
  277. },false);
  278. obj.addEventListener('touchend',function(e){
  279. me._dragend(e);
  280. },false);
  281. };
  282. this._dragstart=function(e){
  283. if(!this.ondragstart(e))return false;
  284. e.preventDefault();
  285. this.oldbackcolor = obj.style.backgroundColor;
  286. obj.style.backgroundColor = this.downbgcolor;
  287. this.anxiamiao = 0;
  288. clearInterval(this.shumiaotime);
  289. this.shumiaotime=setInterval(function(){
  290. me.downtimes(e);
  291. },100);
  292. };
  293. this.downtimes=function(e){
  294. this.anxiamiao+=100;
  295. if(this.anxiamiao>=this.presstime){
  296. this._dragend(e);
  297. this.onpress();//触发
  298. }
  299. };
  300. this._dragend=function(e){
  301. obj.removeEventListener('touchstart', function(){}, false);
  302. clearInterval(this.shumiaotime);
  303. if(typeof(this.oldbackcolor=='string'))obj.style.backgroundColor = this.oldbackcolor;
  304. this.ondragend(this.anxiamiao>=this.presstime,e);
  305. };
  306. }
  307. $.fn.longpress = function(options){
  308. var can = $.extend({}, options);
  309. var clsa = new longpress(this[0], can);
  310. clsa._init();
  311. return clsa;
  312. };
  313. })(jQuery);