pull-up.esm.js 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. /*!
  2. * better-scroll / pull-up
  3. * (c) 2016-2021 ustbhuangyi
  4. * Released under the MIT License.
  5. */
  6. // ssr support
  7. var inBrowser = typeof window !== 'undefined';
  8. var ua = inBrowser && navigator.userAgent.toLowerCase();
  9. !!(ua && /wechatdevtools/.test(ua));
  10. ua && ua.indexOf('android') > 0;
  11. /* istanbul ignore next */
  12. ((function () {
  13. if (typeof ua === 'string') {
  14. var regex = /os (\d\d?_\d(_\d)?)/;
  15. var matches = regex.exec(ua);
  16. if (!matches)
  17. return false;
  18. var parts = matches[1].split('_').map(function (item) {
  19. return parseInt(item, 10);
  20. });
  21. // ios version >= 13.4 issue 982
  22. return !!(parts[0] === 13 && parts[1] >= 4);
  23. }
  24. return false;
  25. }))();
  26. /* istanbul ignore next */
  27. var supportsPassive = false;
  28. /* istanbul ignore next */
  29. if (inBrowser) {
  30. var EventName = 'test-passive';
  31. try {
  32. var opts = {};
  33. Object.defineProperty(opts, 'passive', {
  34. get: function () {
  35. supportsPassive = true;
  36. },
  37. }); // https://github.com/facebook/flow/issues/285
  38. window.addEventListener(EventName, function () { }, opts);
  39. }
  40. catch (e) { }
  41. }
  42. var extend = function (target, source) {
  43. for (var key in source) {
  44. target[key] = source[key];
  45. }
  46. return target;
  47. };
  48. var elementStyle = (inBrowser &&
  49. document.createElement('div').style);
  50. var vendor = (function () {
  51. /* istanbul ignore if */
  52. if (!inBrowser) {
  53. return false;
  54. }
  55. var transformNames = [
  56. {
  57. key: 'standard',
  58. value: 'transform',
  59. },
  60. {
  61. key: 'webkit',
  62. value: 'webkitTransform',
  63. },
  64. {
  65. key: 'Moz',
  66. value: 'MozTransform',
  67. },
  68. {
  69. key: 'O',
  70. value: 'OTransform',
  71. },
  72. {
  73. key: 'ms',
  74. value: 'msTransform',
  75. },
  76. ];
  77. for (var _i = 0, transformNames_1 = transformNames; _i < transformNames_1.length; _i++) {
  78. var obj = transformNames_1[_i];
  79. if (elementStyle[obj.value] !== undefined) {
  80. return obj.key;
  81. }
  82. }
  83. /* istanbul ignore next */
  84. return false;
  85. })();
  86. /* istanbul ignore next */
  87. function prefixStyle(style) {
  88. if (vendor === false) {
  89. return style;
  90. }
  91. if (vendor === 'standard') {
  92. if (style === 'transitionEnd') {
  93. return 'transitionend';
  94. }
  95. return style;
  96. }
  97. return vendor + style.charAt(0).toUpperCase() + style.substr(1);
  98. }
  99. vendor && vendor !== 'standard' ? '-' + vendor.toLowerCase() + '-' : '';
  100. var transform = prefixStyle('transform');
  101. var transition = prefixStyle('transition');
  102. inBrowser && prefixStyle('perspective') in elementStyle;
  103. ({
  104. transform: transform,
  105. transition: transition,
  106. transitionTimingFunction: prefixStyle('transitionTimingFunction'),
  107. transitionDuration: prefixStyle('transitionDuration'),
  108. transitionDelay: prefixStyle('transitionDelay'),
  109. transformOrigin: prefixStyle('transformOrigin'),
  110. transitionEnd: prefixStyle('transitionEnd'),
  111. transitionProperty: prefixStyle('transitionProperty'),
  112. });
  113. var sourcePrefix = 'plugins.pullUpLoad';
  114. var propertiesMap = [
  115. {
  116. key: 'finishPullUp',
  117. name: 'finishPullUp'
  118. },
  119. {
  120. key: 'openPullUp',
  121. name: 'openPullUp'
  122. },
  123. {
  124. key: 'closePullUp',
  125. name: 'closePullUp'
  126. },
  127. {
  128. key: 'autoPullUpLoad',
  129. name: 'autoPullUpLoad'
  130. }
  131. ];
  132. var propertiesConfig = propertiesMap.map(function (item) {
  133. return {
  134. key: item.key,
  135. sourceKey: sourcePrefix + "." + item.name
  136. };
  137. });
  138. var PULL_UP_HOOKS_NAME = 'pullingUp';
  139. var PullUp = /** @class */ (function () {
  140. function PullUp(scroll) {
  141. this.scroll = scroll;
  142. this.pulling = false;
  143. this.watching = false;
  144. this.init();
  145. }
  146. PullUp.prototype.init = function () {
  147. this.handleBScroll();
  148. this.handleOptions(this.scroll.options.pullUpLoad);
  149. this.handleHooks();
  150. this.watch();
  151. };
  152. PullUp.prototype.handleBScroll = function () {
  153. this.scroll.registerType([PULL_UP_HOOKS_NAME]);
  154. this.scroll.proxy(propertiesConfig);
  155. };
  156. PullUp.prototype.handleOptions = function (userOptions) {
  157. if (userOptions === void 0) { userOptions = {}; }
  158. userOptions = (userOptions === true ? {} : userOptions);
  159. var defaultOptions = {
  160. threshold: 0,
  161. };
  162. this.options = extend(defaultOptions, userOptions);
  163. this.scroll.options.probeType = 3 /* Realtime */;
  164. };
  165. PullUp.prototype.handleHooks = function () {
  166. var _this = this;
  167. this.hooksFn = [];
  168. var scrollBehaviorY = this.scroll.scroller.scrollBehaviorY;
  169. this.registerHooks(this.scroll.hooks, this.scroll.hooks.eventTypes.contentChanged, function () {
  170. _this.finishPullUp();
  171. });
  172. this.registerHooks(scrollBehaviorY.hooks, scrollBehaviorY.hooks.eventTypes.computeBoundary, function (boundary) {
  173. // content is smaller than wrapper
  174. if (boundary.maxScrollPos > 0) {
  175. // allow scrolling when content is not full of wrapper
  176. boundary.maxScrollPos = -1;
  177. }
  178. });
  179. };
  180. PullUp.prototype.registerHooks = function (hooks, name, handler) {
  181. hooks.on(name, handler, this);
  182. this.hooksFn.push([hooks, name, handler]);
  183. };
  184. PullUp.prototype.watch = function () {
  185. if (this.watching) {
  186. return;
  187. }
  188. this.watching = true;
  189. this.registerHooks(this.scroll, this.scroll.eventTypes.scroll, this.checkPullUp);
  190. };
  191. PullUp.prototype.unwatch = function () {
  192. this.watching = false;
  193. this.scroll.off(this.scroll.eventTypes.scroll, this.checkPullUp);
  194. };
  195. PullUp.prototype.checkPullUp = function (pos) {
  196. var _this = this;
  197. var threshold = this.options.threshold;
  198. if (this.scroll.movingDirectionY === 1 /* Positive */ &&
  199. pos.y <= this.scroll.maxScrollY + threshold) {
  200. this.pulling = true;
  201. // must reset pulling after scrollEnd
  202. this.scroll.once(this.scroll.eventTypes.scrollEnd, function () {
  203. _this.pulling = false;
  204. });
  205. this.unwatch();
  206. this.scroll.trigger(PULL_UP_HOOKS_NAME);
  207. }
  208. };
  209. PullUp.prototype.finishPullUp = function () {
  210. var _this = this;
  211. // reset Direction, fix #936
  212. this.scroll.scroller.scrollBehaviorY.setMovingDirection(0 /* Default */);
  213. if (this.pulling) {
  214. this.scroll.once(this.scroll.eventTypes.scrollEnd, function () {
  215. _this.watch();
  216. });
  217. }
  218. else {
  219. this.watch();
  220. }
  221. };
  222. // allow 'true' type is compat for beta version implements
  223. PullUp.prototype.openPullUp = function (config) {
  224. if (config === void 0) { config = {}; }
  225. this.handleOptions(config);
  226. this.watch();
  227. };
  228. PullUp.prototype.closePullUp = function () {
  229. this.unwatch();
  230. };
  231. PullUp.prototype.autoPullUpLoad = function () {
  232. var threshold = this.options.threshold;
  233. var scrollBehaviorY = this.scroll.scroller.scrollBehaviorY;
  234. if (this.pulling || !this.watching) {
  235. return;
  236. }
  237. // simulate a pullUp action
  238. var NEGATIVE_VALUE = -1;
  239. var outOfBoundaryPos = scrollBehaviorY.maxScrollPos + threshold + NEGATIVE_VALUE;
  240. this.scroll.scroller.scrollBehaviorY.setMovingDirection(NEGATIVE_VALUE);
  241. this.scroll.scrollTo(this.scroll.x, outOfBoundaryPos, this.scroll.options.bounceTime);
  242. };
  243. PullUp.pluginName = 'pullUpLoad';
  244. return PullUp;
  245. }());
  246. export default PullUp;