|
|
|
@ -95,6 +95,52 @@ Utils = { |
|
|
|
|
increment, |
|
|
|
|
}; |
|
|
|
|
}, |
|
|
|
|
|
|
|
|
|
// Detect touch device
|
|
|
|
|
isTouchDevice() { |
|
|
|
|
const isTouchable = (() => { |
|
|
|
|
const prefixes = ' -webkit- -moz- -o- -ms- '.split(' '); |
|
|
|
|
const mq = function(query) { |
|
|
|
|
return window.matchMedia(query).matches; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
if (('ontouchstart' in window) || window.DocumentTouch && document instanceof window.DocumentTouch) { |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// include the 'heartz' as a way to have a non matching MQ to help terminate the join
|
|
|
|
|
// https://git.io/vznFH
|
|
|
|
|
const query = ['(', prefixes.join('touch-enabled),('), 'heartz', ')'].join(''); |
|
|
|
|
return mq(query); |
|
|
|
|
})(); |
|
|
|
|
return isTouchable; |
|
|
|
|
}, |
|
|
|
|
|
|
|
|
|
calculateTouchDistance(touchA, touchB) { |
|
|
|
|
return Math.sqrt( |
|
|
|
|
Math.pow(touchA.screenX - touchB.screenX, 2) + |
|
|
|
|
Math.pow(touchA.screenY - touchB.screenY, 2) |
|
|
|
|
); |
|
|
|
|
}, |
|
|
|
|
|
|
|
|
|
enableClickOnTouch(element) { |
|
|
|
|
let touchStart = null; |
|
|
|
|
let lastTouch = null; |
|
|
|
|
element.addEventListener('touchstart', function(e) { |
|
|
|
|
touchStart = e.touches[0]; |
|
|
|
|
}, false); |
|
|
|
|
element.addEventListener('touchmove', function(e) { |
|
|
|
|
const touches = e.touches; |
|
|
|
|
lastTouch = touches[touches.length - 1]; |
|
|
|
|
}, true); |
|
|
|
|
element.addEventListener('touchend', function() { |
|
|
|
|
if (touchStart && lastTouch && Utils.calculateTouchDistance(touchStart, lastTouch) <= 20) { |
|
|
|
|
const clickEvent = document.createEvent('MouseEvents'); |
|
|
|
|
clickEvent.initEvent('click', true, true); |
|
|
|
|
this.dispatchEvent(clickEvent); |
|
|
|
|
} |
|
|
|
|
}, false); |
|
|
|
|
}, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
// A simple tracker dependency that we invalidate every time the window is
|
|
|
|
|