//************************************************** //**Work inspired by multiple jquery swipe plugins** //**Done by Yohai Ararat *************************** //************************************************** import $ from 'jquery'; var Touch = {}; var startPosX, startPosY, startTime, elapsedTime, startEvent, isMoving = false, didMoved = false; function onTouchEnd(e) { this.removeEventListener('touchmove', onTouchMove); this.removeEventListener('touchend', onTouchEnd); // If the touch did not move, consider it as a "tap" if (!didMoved) { var tapEvent = $.Event('tap', startEvent || e); $(this).trigger(tapEvent); } startEvent = null; isMoving = false; didMoved = false; } function onTouchMove(e) { if ($.spotSwipe.preventDefault) { e.preventDefault(); } if(isMoving) { var x = e.touches[0].pageX; var y = e.touches[0].pageY; var dx = startPosX - x; var dy = startPosY - y; var dir; didMoved = true; elapsedTime = new Date().getTime() - startTime; if(Math.abs(dx) >= $.spotSwipe.moveThreshold && elapsedTime <= $.spotSwipe.timeThreshold) { dir = dx > 0 ? 'left' : 'right'; } // else if(Math.abs(dy) >= $.spotSwipe.moveThreshold && elapsedTime <= $.spotSwipe.timeThreshold) { // dir = dy > 0 ? 'down' : 'up'; // } if(dir) { e.preventDefault(); onTouchEnd.apply(this, arguments); $(this) .trigger($.Event('swipe', e), dir) .trigger($.Event(`swipe${dir}`, e)); } } } function onTouchStart(e) { if (e.touches.length == 1) { startPosX = e.touches[0].pageX; startPosY = e.touches[0].pageY; startEvent = e; isMoving = true; didMoved = false; startTime = new Date().getTime(); this.addEventListener('touchmove', onTouchMove, false); this.addEventListener('touchend', onTouchEnd, false); } } function init() { this.addEventListener && this.addEventListener('touchstart', onTouchStart, false); } function teardown() { this.removeEventListener('touchstart', onTouchStart); } class SpotSwipe { constructor($) { this.version = '1.0.0'; this.enabled = 'ontouchstart' in document.documentElement; this.preventDefault = false; this.moveThreshold = 75; this.timeThreshold = 200; this.$ = $; this._init(); } _init() { var $ = this.$; $.event.special.swipe = { setup: init }; $.event.special.tap = { setup: init }; $.each(['left', 'up', 'down', 'right'], function () { $.event.special[`swipe${this}`] = { setup: function(){ $(this).on('swipe', $.noop); } }; }); } } /**************************************************** * As far as I can tell, both setupSpotSwipe and * * setupTouchHandler should be idempotent, * * because they directly replace functions & * * values, and do not add event handlers directly. * ****************************************************/ Touch.setupSpotSwipe = function($) { $.spotSwipe = new SpotSwipe($); }; /**************************************************** * Method for adding pseudo drag events to elements * ***************************************************/ Touch.setupTouchHandler = function($) { $.fn.addTouch = function(){ this.each(function(i,el){ $(el).bind('touchstart touchmove touchend touchcancel', function(event) { //we pass the original event object because the jQuery event //object is normalized to w3c specs and does not provide the TouchList handleTouch(event); }); }); var handleTouch = function(event){ var touches = event.changedTouches, first = touches[0], eventTypes = { touchstart: 'mousedown', touchmove: 'mousemove', touchend: 'mouseup' }, type = eventTypes[event.type], simulatedEvent ; if('MouseEvent' in window && typeof window.MouseEvent === 'function') { simulatedEvent = new window.MouseEvent(type, { 'bubbles': true, 'cancelable': true, 'screenX': first.screenX, 'screenY': first.screenY, 'clientX': first.clientX, 'clientY': first.clientY }); } else { simulatedEvent = document.createEvent('MouseEvent'); simulatedEvent.initMouseEvent(type, true, true, window, 1, first.screenX, first.screenY, first.clientX, first.clientY, false, false, false, false, 0/*left*/, null); } first.target.dispatchEvent(simulatedEvent); }; }; }; Touch.init = function ($) { if(typeof($.spotSwipe) === 'undefined') { Touch.setupSpotSwipe($); Touch.setupTouchHandler($); } }; export {Touch};