zoro-cli
Version:
https://github.com/vuejs/vue-cli
87 lines (74 loc) • 2.85 kB
JavaScript
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)
}