mui.pullrefresh.js 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. (function($, document, undefined) {
  2. var CLASS_PULL_TOP_POCKET = $.className('pull-top-pocket');
  3. var CLASS_PULL_BOTTOM_POCKET = $.className('pull-bottom-pocket');
  4. var CLASS_PULL = $.className('pull');
  5. var CLASS_PULL_LOADING = $.className('pull-loading');
  6. var CLASS_PULL_CAPTION = $.className('pull-caption');
  7. var CLASS_PULL_CAPTION_DOWN = $.className('pull-caption-down');
  8. var CLASS_PULL_CAPTION_REFRESH = $.className('pull-caption-refresh');
  9. var CLASS_PULL_CAPTION_NOMORE = $.className('pull-caption-nomore');
  10. var CLASS_ICON = $.className('icon');
  11. var CLASS_SPINNER = $.className('spinner');
  12. var CLASS_ICON_PULLDOWN = $.className('icon-pulldown');
  13. var CLASS_BLOCK = $.className('block');
  14. var CLASS_HIDDEN = $.className('hidden');
  15. var CLASS_VISIBILITY = $.className('visibility');
  16. var CLASS_LOADING_UP = CLASS_PULL_LOADING + ' ' + CLASS_ICON + ' ' + CLASS_ICON_PULLDOWN;
  17. var CLASS_LOADING_DOWN = CLASS_PULL_LOADING + ' ' + CLASS_ICON + ' ' + CLASS_ICON_PULLDOWN;
  18. var CLASS_LOADING = CLASS_PULL_LOADING + ' ' + CLASS_ICON + ' ' + CLASS_SPINNER;
  19. var pocketHtml = ['<div class="' + CLASS_PULL + '">', '<div class="{icon}"></div>', '<div class="' + CLASS_PULL_CAPTION + '">{contentrefresh}</div>', '</div>'].join('');
  20. var PullRefresh = {
  21. init: function(element, options) {
  22. this._super(element, $.extend(true, {
  23. scrollY: true,
  24. scrollX: false,
  25. indicators: true,
  26. deceleration: 0.003,
  27. down: {
  28. height: 50,
  29. contentinit: '下拉可以刷新',
  30. contentdown: '下拉可以刷新',
  31. contentover: '释放立即刷新',
  32. contentrefresh: '正在刷新...'
  33. },
  34. up: {
  35. height: 50,
  36. auto: false,
  37. contentinit: '上拉显示更多',
  38. contentdown: '上拉显示更多',
  39. contentrefresh: '正在加载...',
  40. contentnomore: '没有更多数据了',
  41. duration: 300
  42. }
  43. }, options));
  44. },
  45. _init: function() {
  46. this._super();
  47. this._initPocket();
  48. },
  49. _initPulldownRefresh: function() {
  50. this.pulldown = true;
  51. if (this.topPocket) {
  52. this.pullPocket = this.topPocket;
  53. this.pullPocket.classList.add(CLASS_BLOCK);
  54. this.pullPocket.classList.add(CLASS_VISIBILITY);
  55. this.pullCaption = this.topCaption;
  56. this.pullLoading = this.topLoading;
  57. }
  58. },
  59. _initPullupRefresh: function() {
  60. this.pulldown = false;
  61. if (this.bottomPocket) {
  62. this.pullPocket = this.bottomPocket;
  63. this.pullPocket.classList.add(CLASS_BLOCK);
  64. this.pullPocket.classList.add(CLASS_VISIBILITY);
  65. this.pullCaption = this.bottomCaption;
  66. this.pullLoading = this.bottomLoading;
  67. }
  68. },
  69. _initPocket: function() {
  70. var options = this.options;
  71. if (options.down && options.down.hasOwnProperty('callback')) {
  72. this.topPocket = this.scroller.querySelector('.' + CLASS_PULL_TOP_POCKET);
  73. if (!this.topPocket) {
  74. this.topPocket = this._createPocket(CLASS_PULL_TOP_POCKET, options.down, CLASS_LOADING_DOWN);
  75. this.wrapper.insertBefore(this.topPocket, this.wrapper.firstChild);
  76. }
  77. this.topLoading = this.topPocket.querySelector('.' + CLASS_PULL_LOADING);
  78. this.topCaption = this.topPocket.querySelector('.' + CLASS_PULL_CAPTION);
  79. }
  80. if (options.up && options.up.hasOwnProperty('callback')) {
  81. this.bottomPocket = this.scroller.querySelector('.' + CLASS_PULL_BOTTOM_POCKET);
  82. if (!this.bottomPocket) {
  83. this.bottomPocket = this._createPocket(CLASS_PULL_BOTTOM_POCKET, options.up, CLASS_LOADING);
  84. this.scroller.appendChild(this.bottomPocket);
  85. }
  86. this.bottomLoading = this.bottomPocket.querySelector('.' + CLASS_PULL_LOADING);
  87. this.bottomCaption = this.bottomPocket.querySelector('.' + CLASS_PULL_CAPTION);
  88. //TODO only for h5
  89. this.wrapper.addEventListener('scrollbottom', this);
  90. }
  91. },
  92. _createPocket: function(clazz, options, iconClass) {
  93. var pocket = document.createElement('div');
  94. pocket.className = clazz;
  95. pocket.innerHTML = pocketHtml.replace('{contentrefresh}', options.contentinit).replace('{icon}', iconClass);
  96. return pocket;
  97. },
  98. _resetPullDownLoading: function() {
  99. var loading = this.pullLoading;
  100. if (loading) {
  101. this.pullCaption.innerHTML = this.options.down.contentdown;
  102. loading.style.webkitTransition = "";
  103. loading.style.webkitTransform = "";
  104. loading.style.webkitAnimation = "";
  105. loading.className = CLASS_LOADING_DOWN;
  106. }
  107. },
  108. _setCaptionClass: function(isPulldown, caption, title) {
  109. if (!isPulldown) {
  110. switch (title) {
  111. case this.options.up.contentdown:
  112. caption.className = CLASS_PULL_CAPTION + ' ' + CLASS_PULL_CAPTION_DOWN;
  113. break;
  114. case this.options.up.contentrefresh:
  115. caption.className = CLASS_PULL_CAPTION + ' ' + CLASS_PULL_CAPTION_REFRESH
  116. break;
  117. case this.options.up.contentnomore:
  118. caption.className = CLASS_PULL_CAPTION + ' ' + CLASS_PULL_CAPTION_NOMORE;
  119. break;
  120. }
  121. }
  122. },
  123. _setCaption: function(title, reset) {
  124. if (this.loading) {
  125. return;
  126. }
  127. var options = this.options;
  128. var pocket = this.pullPocket;
  129. var caption = this.pullCaption;
  130. var loading = this.pullLoading;
  131. var isPulldown = this.pulldown;
  132. var self = this;
  133. if (pocket) {
  134. if (reset) {
  135. setTimeout(function() {
  136. caption.innerHTML = self.lastTitle = title;
  137. if (isPulldown) {
  138. loading.className = CLASS_LOADING_DOWN;
  139. } else {
  140. self._setCaptionClass(false, caption, title);
  141. loading.className = CLASS_LOADING;
  142. }
  143. loading.style.webkitAnimation = "";
  144. loading.style.webkitTransition = "";
  145. loading.style.webkitTransform = "";
  146. }, 100);
  147. } else {
  148. if (title !== this.lastTitle) {
  149. caption.innerHTML = title;
  150. if (isPulldown) {
  151. if (title === options.down.contentrefresh) {
  152. loading.className = CLASS_LOADING;
  153. loading.style.webkitAnimation = "spinner-spin 1s step-end infinite";
  154. } else if (title === options.down.contentover) {
  155. loading.className = CLASS_LOADING_UP;
  156. loading.style.webkitTransition = "-webkit-transform 0.3s ease-in";
  157. loading.style.webkitTransform = "rotate(180deg)";
  158. } else if (title === options.down.contentdown) {
  159. loading.className = CLASS_LOADING_DOWN;
  160. loading.style.webkitTransition = "-webkit-transform 0.3s ease-in";
  161. loading.style.webkitTransform = "rotate(0deg)";
  162. }
  163. } else {
  164. if (title === options.up.contentrefresh) {
  165. loading.className = CLASS_LOADING + ' ' + CLASS_VISIBILITY;
  166. } else {
  167. loading.className = CLASS_LOADING + ' ' + CLASS_HIDDEN;
  168. }
  169. self._setCaptionClass(false, caption, title);
  170. }
  171. this.lastTitle = title;
  172. }
  173. }
  174. }
  175. }
  176. };
  177. $.PullRefresh = PullRefresh;
  178. })(mui, document);