2018-10-23 01:05:09 +03:00
|
|
|
define(["dom", "events"], function(dom, events) {
|
|
|
|
"use strict";
|
|
|
|
|
|
|
|
function getTouches(e) {
|
|
|
|
return e.changedTouches || e.targetTouches || e.touches
|
|
|
|
}
|
|
|
|
|
|
|
|
function TouchHelper(elem, options) {
|
|
|
|
options = options || {};
|
|
|
|
var touchTarget, touchStartX, touchStartY, lastDeltaX, lastDeltaY, thresholdYMet, self = this,
|
|
|
|
swipeXThreshold = options.swipeXThreshold || 50,
|
|
|
|
swipeYThreshold = options.swipeYThreshold || 50,
|
|
|
|
excludeTagNames = options.ignoreTagNames || [],
|
|
|
|
touchStart = function(e) {
|
|
|
|
var touch = getTouches(e)[0];
|
|
|
|
if (touchTarget = null, touchStartX = 0, touchStartY = 0, lastDeltaX = null, lastDeltaY = null, thresholdYMet = !1, touch) {
|
|
|
|
var currentTouchTarget = touch.target;
|
|
|
|
if (dom.parentWithTag(currentTouchTarget, excludeTagNames)) return;
|
|
|
|
touchTarget = currentTouchTarget, touchStartX = touch.clientX, touchStartY = touch.clientY
|
|
|
|
}
|
|
|
|
},
|
|
|
|
touchEnd = function(e) {
|
|
|
|
var isTouchMove = "touchmove" === e.type;
|
|
|
|
if (touchTarget) {
|
|
|
|
var deltaX, deltaY, clientX, clientY, touch = getTouches(e)[0];
|
|
|
|
touch ? (clientX = touch.clientX || 0, clientY = touch.clientY || 0, deltaX = clientX - (touchStartX || 0), deltaY = clientY - (touchStartY || 0)) : (deltaX = 0, deltaY = 0);
|
|
|
|
var currentDeltaX = null == lastDeltaX ? deltaX : deltaX - lastDeltaX,
|
|
|
|
currentDeltaY = null == lastDeltaY ? deltaY : deltaY - lastDeltaY;
|
|
|
|
lastDeltaX = deltaX, lastDeltaY = deltaY, deltaX > swipeXThreshold && Math.abs(deltaY) < 30 ? events.trigger(self, "swiperight", [touchTarget]) : deltaX < 0 - swipeXThreshold && Math.abs(deltaY) < 30 ? events.trigger(self, "swipeleft", [touchTarget]) : (deltaY < 0 - swipeYThreshold || thresholdYMet) && Math.abs(deltaX) < 30 ? (thresholdYMet = !0, events.trigger(self, "swipeup", [touchTarget, {
|
|
|
|
deltaY: deltaY,
|
|
|
|
deltaX: deltaX,
|
|
|
|
clientX: clientX,
|
|
|
|
clientY: clientY,
|
|
|
|
currentDeltaX: currentDeltaX,
|
|
|
|
currentDeltaY: currentDeltaY
|
|
|
|
}])) : (deltaY > swipeYThreshold || thresholdYMet) && Math.abs(deltaX) < 30 && (thresholdYMet = !0, events.trigger(self, "swipedown", [touchTarget, {
|
|
|
|
deltaY: deltaY,
|
|
|
|
deltaX: deltaX,
|
|
|
|
clientX: clientX,
|
|
|
|
clientY: clientY,
|
|
|
|
currentDeltaX: currentDeltaX,
|
|
|
|
currentDeltaY: currentDeltaY
|
|
|
|
}])), isTouchMove && options.preventDefaultOnMove && e.preventDefault()
|
|
|
|
}
|
|
|
|
isTouchMove || (touchTarget = null, touchStartX = 0, touchStartY = 0, lastDeltaX = null, lastDeltaY = null, thresholdYMet = !1)
|
|
|
|
};
|
|
|
|
this.touchStart = touchStart, this.touchEnd = touchEnd, dom.addEventListener(elem, "touchstart", touchStart, {
|
|
|
|
passive: !0
|
|
|
|
}), options.triggerOnMove && dom.addEventListener(elem, "touchmove", touchEnd, {
|
|
|
|
passive: !options.preventDefaultOnMove
|
|
|
|
}), dom.addEventListener(elem, "touchend", touchEnd, {
|
|
|
|
passive: !0
|
|
|
|
}), dom.addEventListener(elem, "touchcancel", touchEnd, {
|
|
|
|
passive: !0
|
|
|
|
})
|
|
|
|
}
|
|
|
|
return TouchHelper.prototype.destroy = function() {
|
|
|
|
var elem = this.elem;
|
|
|
|
if (elem) {
|
|
|
|
var touchStart = this.touchStart,
|
|
|
|
touchEnd = this.touchEnd;
|
|
|
|
dom.removeEventListener(elem, "touchstart", touchStart, {
|
|
|
|
passive: !0
|
|
|
|
}), dom.removeEventListener(elem, "touchmove", touchEnd, {
|
|
|
|
passive: !0
|
|
|
|
}), dom.removeEventListener(elem, "touchend", touchEnd, {
|
|
|
|
passive: !0
|
|
|
|
}), dom.removeEventListener(elem, "touchcancel", touchEnd, {
|
|
|
|
passive: !0
|
|
|
|
})
|
|
|
|
}
|
|
|
|
this.touchStart = null, this.touchEnd = null, this.elem = null
|
|
|
|
}, TouchHelper
|
|
|
|
});
|