UNPKG

leaflet

Version:

JavaScript library for mobile-friendly interactive maps

76 lines (59 loc) 1.95 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.addEventListener(touchstart, onTouchStart, false); obj.addEventListener(touchend, onTouchEnd, false); return this; }, removeDoubleTapListener: function (obj, id) { var pre = '_leaflet_', touchend = obj[pre + this._touchend + id]; obj.removeEventListener(this._touchstart, obj[pre + this._touchstart + id], false); obj.removeEventListener(this._touchend, touchend, false); return this; } });