UNPKG

leaflet

Version:

JavaScript library for mobile-friendly interactive maps

90 lines (71 loc) 2.42 kB
/* * Extends the event handling code with double tap support for mobile browsers. */ L.extend(L.DomEvent, { _touchstart: L.Browser.msPointer ? 'MSPointerDown' : L.Browser.pointer ? 'pointerdown' : 'touchstart', _touchend: L.Browser.msPointer ? 'MSPointerUp' : L.Browser.pointer ? 'pointerup' : 'touchend', // inspired by Zepto touch code by Thomas Fuchs addDoubleTapListener: function (obj, handler, id) { var last, touch, doubleTap = false, delay = 250; function onTouchStart(e) { var count; if (L.Browser.pointer) { count = L.DomEvent._pointersCount; } else { count = e.touches.length; } if (count > 1) { return; } var now = Date.now(), delta = now - (last || now); touch = e.touches ? e.touches[0] : e; doubleTap = (delta > 0 && delta <= delay); last = now; } function onTouchEnd() { if (doubleTap && !touch.cancelBubble) { if (L.Browser.pointer) { // work around .type being readonly with MSPointer* events var newTouch = {}, prop, i; for (i in touch) { prop = touch[i]; newTouch[i] = prop && prop.bind ? prop.bind(touch) : prop; } touch = newTouch; } touch.type = 'dblclick'; handler(touch); last = null; } } var pre = '_leaflet_', touchstart = this._touchstart, touchend = this._touchend; obj[pre + touchstart + id] = onTouchStart; obj[pre + touchend + id] = onTouchEnd; obj[pre + 'dblclick' + id] = handler; obj.addEventListener(touchstart, onTouchStart, false); obj.addEventListener(touchend, onTouchEnd, false); // On some platforms (notably, chrome on win10 + touchscreen + mouse), // the browser doesn't fire touchend/pointerup events but does fire // native dblclicks. See #4127. if (!L.Browser.edge) { obj.addEventListener('dblclick', handler, false); } return this; }, removeDoubleTapListener: function (obj, id) { var pre = '_leaflet_', touchstart = obj[pre + this._touchstart + id], touchend = obj[pre + this._touchend + id], dblclick = obj[pre + 'dblclick' + id]; obj.removeEventListener(this._touchstart, touchstart, false); obj.removeEventListener(this._touchend, touchend, false); if (!L.Browser.edge) { obj.removeEventListener('dblclick', dblclick, false); } return this; } });