UNPKG

zoro-cli

Version:

https://github.com/vuejs/vue-cli

87 lines (74 loc) 2.85 kB
import { packAddEventListenerOptionsNoPassive } from './passive' import { getScrollTop } from './scroll' import { on, off, stopPropagation } from './event' export function getTouchEventTouch(event) { if (!event) return {} const { changedTouches: touches } = event if (!touches || !touches.length) return {} return touches[0] || {} } export function getTouchEventPageBox(event) { const touch = getTouchEventTouch(event) const { screenX, screenY, pageX, pageY, clientX, clientY } = touch return { screenX: screenX || 0, screenY: screenY || 0, pageX: pageX || 0, pageY: pageY || 0, clientX: clientX || 0, clientY: clientY || 0, } } export function getTouchEventPageY(event) { const box = getTouchEventPageBox(event) return box.pageY } const disableBounceDefaultTarget = document.body function handleBounceTouchStart(element, event) { const isDefault = element === disableBounceDefaultTarget const scrollTop = isDefault ? getScrollTop() : element.scrollTop const scrollHeight = isDefault ? document.documentElement.scrollHeight : element.scrollHeight const clientHeight = isDefault ? document.documentElement.clientHeight : element.clientHeight element.allowDown = scrollTop < scrollHeight - clientHeight element.allowUp = scrollTop > 0 element.slideBeginY = getTouchEventPageY(event) } function handleBounceTouchMove(element, event) { const pageY = getTouchEventPageY(event) const up = pageY > element.slideBeginY const down = !up if ((up && element.allowUp) || (down && element.allowDown)) { event.stopPropagation() } else { event.preventDefault() } } // options: passive option defaults to true for touchstart and touchmove events export function disableBounce(element = disableBounceDefaultTarget) { const options = packAddEventListenerOptionsNoPassive() element.handleBounceTouchStart = handleBounceTouchStart.bind(null, element) on(element, 'touchstart', element.handleBounceTouchStart, options) element.handleBounceTouchMove = handleBounceTouchMove.bind(null, element) on(element, 'touchmove', element.handleBounceTouchMove, options) } export function enableBounce(element = disableBounceDefaultTarget) { off(element, 'touchstart', element.handleBounceTouchStart) off(element, 'touchmove', element.handleBounceTouchMove) } export function disableTouchPropagation(element) { const options = packAddEventListenerOptionsNoPassive() on(element, 'touchstart', stopPropagation, options) on(element, 'touchmove', stopPropagation, options) on(element, 'touchend', stopPropagation, options) disableBounce(element) } export function enableTouchPropagation(element) { off(element, 'touchstart', stopPropagation) off(element, 'touchmove', stopPropagation) off(element, 'touchend', stopPropagation) enableBounce(element) }