Advertisement
Guest User

Untitled

a guest
Sep 27th, 2016
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.56 KB | None | 0 0
  1. import { Lethargy } from 'lethargy';
  2. import { throttle, debounce } from 'throttle-debounce';
  3.  
  4. var lethargy = new Lethargy;
  5.  
  6.  
  7. export default class ScrollHandler {
  8. constructor(dispatcher, actionPrefix = '') {
  9. this.dispatcher = dispatcher;
  10. this.actionPrefix = actionPrefix;
  11.  
  12. this.container = document.body;
  13.  
  14. this.isTouchDevice = navigator.userAgent.match(/(iPhone|iPod|iPad|Android|playbook|silk|BlackBerry|BB10|Windows Phone|Tizen|Bada|webOS|IEMobile|Opera Mini)/);
  15. this.isTouch = (('ontouchstart' in window) || (navigator.msMaxTouchPoints > 0) || (navigator.maxTouchPoints));
  16.  
  17.  
  18.  
  19. this.touchStartY = 0;
  20. this.touchStartX = 0;
  21. this.touchEndY = 0;
  22. this.touchEndX = 0;
  23.  
  24. this.scrollHandler = this.handleScroll.bind(this);
  25. this.boundTouchStartHandler = this.touchStartHandler.bind(this);
  26. this.boundTouchMoveHandler = this.touchMoveHandler.bind(this);
  27.  
  28. this.move = throttle(200, this.move, true);
  29. this.handleTouchMove = debounce(100, this.handleTouchMove);
  30.  
  31. this.createScrollListener();
  32. this.addTouchHandler();
  33.  
  34.  
  35. }
  36.  
  37. move(direction) {
  38. this.dispatcher({
  39. type: `${this.actionPrefix}MOVE_${direction.toUpperCase()}`
  40. })
  41. }
  42.  
  43. destroy() {
  44. this.destroyScrollListener();
  45. this.removeTouchHandler();
  46. }
  47.  
  48. handleScroll(e) {
  49. e = e || window.event
  50.  
  51. var scrollInfo = lethargy.check(e)
  52. if (scrollInfo != false) {
  53. if (scrollInfo === -1) {
  54. this.move('next');
  55. } else {
  56. this.move('prev');
  57. }
  58. }
  59.  
  60. this.preventDefault(e)
  61. }
  62.  
  63. createScrollListener () {
  64. let elem = this.container;
  65. if (elem.addEventListener) {
  66. if ('onScroll' in document) {
  67. return elem.addEventListener("wheel", this.scrollHandler);
  68. } else if ('onmousewheel' in document) {
  69. return elem.addEventListener("mousewheel", this.scrollHandler);
  70. } else {
  71. return elem.addEventListener("MozMousePixelScroll", this.scrollHandler);
  72. }
  73. } else {
  74. return elem.attachEvent("onmousewheel", this.scrollHandler);
  75. }
  76. }
  77.  
  78. destroyScrollListener () {
  79. let elem = this.container;
  80. if (elem.removeEventListener) {
  81. if ('onScroll' in document) {
  82. return elem.removeEventListener("wheel", this.scrollHandler);
  83. } else if ('onmousewheel' in document) {
  84. return elem.removeEventListener("mousewheel", this.scrollHandler);
  85. } else {
  86. return elem.removeEventListener("MozMousePixelScroll", this.scrollHandler);
  87. }
  88. } else {
  89. return elem.detachEvent("onmousewheel", this.scrollHandler);
  90. }
  91. }
  92.  
  93.  
  94. touchMoveHandler(event) {
  95. let e = event || window.event || e || e.originalEvent;
  96. this.preventDefault(e);
  97. if (this.isReallyTouch(e)) {
  98. this.preventDefault(e);
  99. return this.handleTouchMove(e);
  100. }
  101. }
  102.  
  103.  
  104. handleTouchMove(e) {
  105. let touchEvents = this.getEventsPage(e);
  106. this.touchEndY = touchEvents.y;
  107. this.touchEndX = touchEvents.x;
  108. let h = Math.max(document.documentElement.clientHeight, window.innerHeight || 0)
  109. if (Math.abs(this.touchStartX - this.touchEndX) < Math.abs(this.touchStartY - this.touchEndY)) {
  110. if (Math.abs(this.touchStartY - this.touchEndY) > (h / 100) * 5) {
  111. if (this.touchStartY > this.touchEndY) {
  112. this.move('next');
  113. } else if (this.touchEndY > this.touchStartY) {
  114. this.move('prev');
  115. }
  116. }
  117. }
  118.  
  119.  
  120.  
  121. }
  122.  
  123. isReallyTouch(e) {
  124. return typeof e.pointerType === 'undefined' || e.pointerType !== 'mouse';
  125. }
  126.  
  127. touchStartHandler(event) {
  128. let e = event || window.event || e || e.originalEvent;
  129. if (this.isReallyTouch(e)) {
  130. let touchEvents = this.getEventsPage(e);
  131. this.touchStartY = touchEvents.y;
  132. this.touchStartX = touchEvents.x;
  133. }
  134. }
  135.  
  136.  
  137. addTouchHandler() {
  138. if (this.isTouchDevice || this.isTouch) {
  139. let wrapper = this.container;
  140. if (document.addEventListener) {
  141. let MSPointer = this.getMSPointer();
  142. wrapper.removeEventListener('touchstart', this.boundTouchStartHandler);
  143. wrapper.removeEventListener(MSPointer.down, this.boundTouchStartHandler);
  144. wrapper.removeEventListener('touchmove', this.boundTouchMoveHandler);
  145. wrapper.removeEventListener(MSPointer.move, this.boundTouchMoveHandler);
  146. this.addListenerMulti(wrapper, `touchstart ${MSPointer.down}`, this.boundTouchStartHandler);
  147. this.addListenerMulti(wrapper, `touchmove ${MSPointer.move}`, this.boundTouchMoveHandler);
  148. }
  149. }
  150. }
  151.  
  152. removeTouchHandler() {
  153. if (this.isTouchDevice || this.isTouch) {
  154. let wrapper = this.container;
  155. if (document.addEventListener) {
  156. let MSPointer = this.getMSPointer();
  157. wrapper.removeEventListener('touchstart', this.boundTouchStartHandler);
  158. wrapper.removeEventListener(MSPointer.down, this.boundTouchStartHandler);
  159. wrapper.removeEventListener('touchmove', this.boundTouchMoveHandler);
  160. wrapper.removeEventListener(MSPointer.move, this.boundTouchMoveHandler);
  161. this.removeListenerMulti(wrapper, `touchstart ${MSPointer.down}`, this.boundTouchStartHandler);
  162. this.removeListenerMulti(wrapper, `touchmove ${MSPointer.move}`, this.boundTouchMoveHandler);
  163. }
  164. }
  165. }
  166.  
  167. getMSPointer() {
  168. let pointer = undefined;
  169. if (window.PointerEvent) {
  170. pointer = {
  171. down: 'pointerdown',
  172. move: 'pointermove'
  173. };
  174. } else {
  175. pointer = {
  176. down: 'MSPointerDown',
  177. move: 'MSPointerMove'
  178. };
  179. }
  180. return pointer;
  181. }
  182.  
  183. addListenerMulti(el, s, fn) {
  184. let evts = s.split(' ');
  185. let i = 0;
  186. let iLen = evts.length;
  187. while (i < iLen) {
  188. if (document.addEventListener) {
  189. el.addEventListener(evts[i], fn, false);
  190. } else {
  191. el.attachEvent(evts[i], fn, false);
  192. }
  193. //IE 6/7/8
  194. i++;
  195. }
  196. }
  197.  
  198. removeListenerMulti(el, s, fn) {
  199. let evts = s.split(' ');
  200. let i = 0;
  201. let iLen = evts.length;
  202. while (i < iLen) {
  203. if (document.addEventListener) {
  204. el.removeEventListener(evts[i], fn, false);
  205. } else {
  206. el.deattachEvent(evts[i], fn, false);
  207. }
  208. //IE 6/7/8
  209. i++;
  210. }
  211. }
  212.  
  213. getEventsPage(e) {
  214. let events = [];
  215. events.y = typeof e.pageY !== 'undefined' && (e.pageY || e.pageX) ? e.pageY : e.touches[0].pageY;
  216. events.x = typeof e.pageX !== 'undefined' && (e.pageY || e.pageX) ? e.pageX : e.touches[0].pageX;
  217. if (this.isTouch && this.isReallyTouch(e)) {
  218. events.y = e.touches[0].pageY;
  219. events.x = e.touches[0].pageX;
  220. }
  221. return events;
  222. }
  223.  
  224.  
  225. preventDefault(event) {
  226. if (event.preventDefault) { return event.preventDefault(); } else { return event.returnValue = false; }
  227. }
  228.  
  229.  
  230.  
  231. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement