/* * 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, doubleTap = false, delay = 250, touch, pre = '_leaflet_', touchstart = this._touchstart, touchend = this._touchend, trackedTouches = []; function onTouchStart(e) { var count; if (L.Browser.pointer) { trackedTouches.push(e.pointerId); count = trackedTouches.length; } 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(e) { if (L.Browser.pointer) { var idx = trackedTouches.indexOf(e.pointerId); if (idx === -1) { return; } trackedTouches.splice(idx, 1); } if (doubleTap) { if (L.Browser.pointer) { // work around .type being readonly with MSPointer* events var newTouch = { }, prop; // jshint forin:false for (var i in touch) { prop = touch[i]; if (typeof prop === 'function') { newTouch[i] = prop.bind(touch); } else { newTouch[i] = prop; } } touch = newTouch; } touch.type = 'dblclick'; handler(touch); last = null; } } obj[pre + touchstart + id] = onTouchStart; obj[pre + touchend + id] = onTouchEnd; // on pointer we need to listen on the document, otherwise a drag starting on the map and moving off screen // will not come through to us, so we will lose track of how many touches are ongoing var endElement = L.Browser.pointer ? document.documentElement : obj; obj.addEventListener(touchstart, onTouchStart, false); endElement.addEventListener(touchend, onTouchEnd, false); if (L.Browser.pointer) { endElement.addEventListener(L.DomEvent.POINTER_CANCEL, onTouchEnd, false); } return this; }, removeDoubleTapListener: function (obj, id) { var pre = '_leaflet_'; obj.removeEventListener(this._touchstart, obj[pre + this._touchstart + id], false); (L.Browser.pointer ? document.documentElement : obj).removeEventListener( this._touchend, obj[pre + this._touchend + id], false); if (L.Browser.pointer) { document.documentElement.removeEventListener(L.DomEvent.POINTER_CANCEL, obj[pre + this._touchend + id], false); } return this; } });