onTouchEnd.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  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. swiper.updateClickedSlide(e);
  34. swiper.emit('tap click', e);
  35. if (timeDiff < 300 && touchEndTime - data.lastClickTime < 300) {
  36. swiper.emit('doubleTap doubleClick', e);
  37. }
  38. }
  39. data.lastClickTime = now();
  40. nextTick(() => {
  41. if (!swiper.destroyed) swiper.allowClick = true;
  42. });
  43. if (!data.isTouched || !data.isMoved || !swiper.swipeDirection || touches.diff === 0 || data.currentTranslate === data.startTranslate) {
  44. data.isTouched = false;
  45. data.isMoved = false;
  46. data.startMoving = false;
  47. return;
  48. }
  49. data.isTouched = false;
  50. data.isMoved = false;
  51. data.startMoving = false;
  52. let currentPos;
  53. if (params.followFinger) {
  54. currentPos = rtl ? swiper.translate : -swiper.translate;
  55. } else {
  56. currentPos = -data.currentTranslate;
  57. }
  58. if (params.cssMode) {
  59. return;
  60. }
  61. if (swiper.params.freeMode && params.freeMode.enabled) {
  62. swiper.freeMode.onTouchEnd({
  63. currentPos
  64. });
  65. return;
  66. } // Find current slide
  67. let stopIndex = 0;
  68. let groupSize = swiper.slidesSizesGrid[0];
  69. for (let i = 0; i < slidesGrid.length; i += i < params.slidesPerGroupSkip ? 1 : params.slidesPerGroup) {
  70. const increment = i < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup;
  71. if (typeof slidesGrid[i + increment] !== 'undefined') {
  72. if (currentPos >= slidesGrid[i] && currentPos < slidesGrid[i + increment]) {
  73. stopIndex = i;
  74. groupSize = slidesGrid[i + increment] - slidesGrid[i];
  75. }
  76. } else if (currentPos >= slidesGrid[i]) {
  77. stopIndex = i;
  78. groupSize = slidesGrid[slidesGrid.length - 1] - slidesGrid[slidesGrid.length - 2];
  79. }
  80. } // Find current slide size
  81. const ratio = (currentPos - slidesGrid[stopIndex]) / groupSize;
  82. const increment = stopIndex < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup;
  83. if (timeDiff > params.longSwipesMs) {
  84. // Long touches
  85. if (!params.longSwipes) {
  86. swiper.slideTo(swiper.activeIndex);
  87. return;
  88. }
  89. if (swiper.swipeDirection === 'next') {
  90. if (ratio >= params.longSwipesRatio) swiper.slideTo(stopIndex + increment);else swiper.slideTo(stopIndex);
  91. }
  92. if (swiper.swipeDirection === 'prev') {
  93. if (ratio > 1 - params.longSwipesRatio) swiper.slideTo(stopIndex + increment);else swiper.slideTo(stopIndex);
  94. }
  95. } else {
  96. // Short swipes
  97. if (!params.shortSwipes) {
  98. swiper.slideTo(swiper.activeIndex);
  99. return;
  100. }
  101. const isNavButtonTarget = swiper.navigation && (e.target === swiper.navigation.nextEl || e.target === swiper.navigation.prevEl);
  102. if (!isNavButtonTarget) {
  103. if (swiper.swipeDirection === 'next') {
  104. swiper.slideTo(stopIndex + increment);
  105. }
  106. if (swiper.swipeDirection === 'prev') {
  107. swiper.slideTo(stopIndex);
  108. }
  109. } else if (e.target === swiper.navigation.nextEl) {
  110. swiper.slideTo(stopIndex + increment);
  111. } else {
  112. swiper.slideTo(stopIndex);
  113. }
  114. }
  115. }