onTouchEnd.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. import { now, nextTick } from '../../shared/utils.js';
  2. export default function onTouchEnd(event) {
  3. const swiper = this;
  4. const data = swiper.touchEventsData;
  5. const {
  6. params,
  7. touches,
  8. rtlTranslate: rtl,
  9. slidesGrid,
  10. enabled
  11. } = swiper;
  12. if (!enabled) return;
  13. let e = event;
  14. if (e.originalEvent) e = e.originalEvent;
  15. if (data.allowTouchCallbacks) {
  16. swiper.emit('touchEnd', e);
  17. }
  18. data.allowTouchCallbacks = false;
  19. if (!data.isTouched) {
  20. if (data.isMoved && params.grabCursor) {
  21. swiper.setGrabCursor(false);
  22. }
  23. data.isMoved = false;
  24. data.startMoving = false;
  25. return;
  26. } // Return Grab Cursor
  27. if (params.grabCursor && data.isMoved && data.isTouched && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) {
  28. swiper.setGrabCursor(false);
  29. } // Time diff
  30. const touchEndTime = now();
  31. const timeDiff = touchEndTime - data.touchStartTime; // Tap, doubleTap, Click
  32. if (swiper.allowClick) {
  33. const pathTree = e.path || e.composedPath && e.composedPath();
  34. swiper.updateClickedSlide(pathTree && pathTree[0] || e.target);
  35. swiper.emit('tap click', e);
  36. if (timeDiff < 300 && touchEndTime - data.lastClickTime < 300) {
  37. swiper.emit('doubleTap doubleClick', e);
  38. }
  39. }
  40. data.lastClickTime = now();
  41. nextTick(() => {
  42. if (!swiper.destroyed) swiper.allowClick = true;
  43. });
  44. if (!data.isTouched || !data.isMoved || !swiper.swipeDirection || touches.diff === 0 || data.currentTranslate === data.startTranslate) {
  45. data.isTouched = false;
  46. data.isMoved = false;
  47. data.startMoving = false;
  48. return;
  49. }
  50. data.isTouched = false;
  51. data.isMoved = false;
  52. data.startMoving = false;
  53. let currentPos;
  54. if (params.followFinger) {
  55. currentPos = rtl ? swiper.translate : -swiper.translate;
  56. } else {
  57. currentPos = -data.currentTranslate;
  58. }
  59. if (params.cssMode) {
  60. return;
  61. }
  62. if (swiper.params.freeMode && params.freeMode.enabled) {
  63. swiper.freeMode.onTouchEnd({
  64. currentPos
  65. });
  66. return;
  67. } // Find current slide
  68. let stopIndex = 0;
  69. let groupSize = swiper.slidesSizesGrid[0];
  70. for (let i = 0; i < slidesGrid.length; i += i < params.slidesPerGroupSkip ? 1 : params.slidesPerGroup) {
  71. const increment = i < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup;
  72. if (typeof slidesGrid[i + increment] !== 'undefined') {
  73. if (currentPos >= slidesGrid[i] && currentPos < slidesGrid[i + increment]) {
  74. stopIndex = i;
  75. groupSize = slidesGrid[i + increment] - slidesGrid[i];
  76. }
  77. } else if (currentPos >= slidesGrid[i]) {
  78. stopIndex = i;
  79. groupSize = slidesGrid[slidesGrid.length - 1] - slidesGrid[slidesGrid.length - 2];
  80. }
  81. }
  82. let rewindFirstIndex = null;
  83. let rewindLastIndex = null;
  84. if (params.rewind) {
  85. if (swiper.isBeginning) {
  86. rewindLastIndex = swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual ? swiper.virtual.slides.length - 1 : swiper.slides.length - 1;
  87. } else if (swiper.isEnd) {
  88. rewindFirstIndex = 0;
  89. }
  90. } // Find current slide size
  91. const ratio = (currentPos - slidesGrid[stopIndex]) / groupSize;
  92. const increment = stopIndex < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup;
  93. if (timeDiff > params.longSwipesMs) {
  94. // Long touches
  95. if (!params.longSwipes) {
  96. swiper.slideTo(swiper.activeIndex);
  97. return;
  98. }
  99. if (swiper.swipeDirection === 'next') {
  100. if (ratio >= params.longSwipesRatio) swiper.slideTo(params.rewind && swiper.isEnd ? rewindFirstIndex : stopIndex + increment);else swiper.slideTo(stopIndex);
  101. }
  102. if (swiper.swipeDirection === 'prev') {
  103. if (ratio > 1 - params.longSwipesRatio) {
  104. swiper.slideTo(stopIndex + increment);
  105. } else if (rewindLastIndex !== null && ratio < 0 && Math.abs(ratio) > params.longSwipesRatio) {
  106. swiper.slideTo(rewindLastIndex);
  107. } else {
  108. swiper.slideTo(stopIndex);
  109. }
  110. }
  111. } else {
  112. // Short swipes
  113. if (!params.shortSwipes) {
  114. swiper.slideTo(swiper.activeIndex);
  115. return;
  116. }
  117. const isNavButtonTarget = swiper.navigation && (e.target === swiper.navigation.nextEl || e.target === swiper.navigation.prevEl);
  118. if (!isNavButtonTarget) {
  119. if (swiper.swipeDirection === 'next') {
  120. swiper.slideTo(rewindFirstIndex !== null ? rewindFirstIndex : stopIndex + increment);
  121. }
  122. if (swiper.swipeDirection === 'prev') {
  123. swiper.slideTo(rewindLastIndex !== null ? rewindLastIndex : stopIndex);
  124. }
  125. } else if (e.target === swiper.navigation.nextEl) {
  126. swiper.slideTo(stopIndex + increment);
  127. } else {
  128. swiper.slideTo(stopIndex);
  129. }
  130. }
  131. }