UNPKG

swiper

Version:

Most modern mobile touch slider and framework with hardware accelerated transitions

122 lines (95 loc) 4.29 kB
"use strict"; exports.__esModule = true; exports.default = onTouchStart; var _ssrWindow = require("ssr-window"); var _dom = _interopRequireDefault(require("../../../utils/dom")); var _utils = require("../../../utils/utils"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } // Modified from https://stackoverflow.com/questions/54520554/custom-element-getrootnode-closest-function-crossing-multiple-parent-shadowd function closestElement(selector, base) { if (base === void 0) { base = this; } function __closestFrom(el) { if (!el || el === (0, _ssrWindow.getDocument)() || el === (0, _ssrWindow.getWindow)()) return null; if (el.assignedSlot) el = el.assignedSlot; var found = el.closest(selector); return found || __closestFrom(el.getRootNode().host); } return __closestFrom(base); } function onTouchStart(event) { var swiper = this; var document = (0, _ssrWindow.getDocument)(); var window = (0, _ssrWindow.getWindow)(); var data = swiper.touchEventsData; var params = swiper.params, touches = swiper.touches, enabled = swiper.enabled; if (!enabled) return; if (swiper.animating && params.preventInteractionOnTransition) { return; } var e = event; if (e.originalEvent) e = e.originalEvent; var $targetEl = (0, _dom.default)(e.target); if (params.touchEventsTarget === 'wrapper') { if (!$targetEl.closest(swiper.wrapperEl).length) return; } data.isTouchEvent = e.type === 'touchstart'; if (!data.isTouchEvent && 'which' in e && e.which === 3) return; if (!data.isTouchEvent && 'button' in e && e.button > 0) return; if (data.isTouched && data.isMoved) return; // change target el for shadow root component var swipingClassHasValue = !!params.noSwipingClass && params.noSwipingClass !== ''; if (swipingClassHasValue && e.target && e.target.shadowRoot && event.path && event.path[0]) { $targetEl = (0, _dom.default)(event.path[0]); } var noSwipingSelector = params.noSwipingSelector ? params.noSwipingSelector : "." + params.noSwipingClass; var isTargetShadow = !!(e.target && e.target.shadowRoot); // use closestElement for shadow root element to get the actual closest for nested shadow root element if (params.noSwiping && (isTargetShadow ? closestElement(noSwipingSelector, e.target) : $targetEl.closest(noSwipingSelector)[0])) { swiper.allowClick = true; return; } if (params.swipeHandler) { if (!$targetEl.closest(params.swipeHandler)[0]) return; } touches.currentX = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX; touches.currentY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY; var startX = touches.currentX; var startY = touches.currentY; // Do NOT start if iOS edge swipe is detected. Otherwise iOS app cannot swipe-to-go-back anymore var edgeSwipeDetection = params.edgeSwipeDetection || params.iOSEdgeSwipeDetection; var edgeSwipeThreshold = params.edgeSwipeThreshold || params.iOSEdgeSwipeThreshold; if (edgeSwipeDetection && (startX <= edgeSwipeThreshold || startX >= window.innerWidth - edgeSwipeThreshold)) { if (edgeSwipeDetection === 'prevent') { event.preventDefault(); } else { return; } } (0, _utils.extend)(data, { isTouched: true, isMoved: false, allowTouchCallbacks: true, isScrolling: undefined, startMoving: undefined }); touches.startX = startX; touches.startY = startY; data.touchStartTime = (0, _utils.now)(); swiper.allowClick = true; swiper.updateSize(); swiper.swipeDirection = undefined; if (params.threshold > 0) data.allowThresholdMove = false; if (e.type !== 'touchstart') { var preventDefault = true; if ($targetEl.is(data.focusableElements)) preventDefault = false; if (document.activeElement && (0, _dom.default)(document.activeElement).is(data.focusableElements) && document.activeElement !== $targetEl[0]) { document.activeElement.blur(); } var shouldPreventDefault = preventDefault && swiper.allowTouchMove && params.touchStartPreventDefault; if ((params.touchStartForcePreventDefault || shouldPreventDefault) && !$targetEl[0].isContentEditable) { e.preventDefault(); } } swiper.emit('touchStart', e); }