87 lines
2.4 KiB
JavaScript
Executable File
87 lines
2.4 KiB
JavaScript
Executable File
import * as Browser from '../core/Browser';
|
|
import {_pointersCount} from './DomEvent.Pointer';
|
|
|
|
/*
|
|
* Extends the event handling code with double tap support for mobile browsers.
|
|
*/
|
|
|
|
var _touchstart = Browser.msPointer ? 'MSPointerDown' : Browser.pointer ? 'pointerdown' : 'touchstart';
|
|
var _touchend = Browser.msPointer ? 'MSPointerUp' : Browser.pointer ? 'pointerup' : 'touchend';
|
|
var _pre = '_leaflet_';
|
|
|
|
// inspired by Zepto touch code by Thomas Fuchs
|
|
export function addDoubleTapListener(obj, handler, id) {
|
|
var last, touch,
|
|
doubleTap = false,
|
|
delay = 250;
|
|
|
|
function onTouchStart(e) {
|
|
var count;
|
|
|
|
if (Browser.pointer) {
|
|
if ((!Browser.edge) || e.pointerType === 'mouse') { return; }
|
|
count = _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(e) {
|
|
if (doubleTap && !touch.cancelBubble) {
|
|
if (Browser.pointer) {
|
|
if ((!Browser.edge) || e.pointerType === 'mouse') { return; }
|
|
// 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;
|
|
}
|
|
}
|
|
|
|
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<55 on win10 + touchscreen + mouse),
|
|
// the browser doesn't fire touchend/pointerup events but does fire
|
|
// native dblclicks. See #4127.
|
|
// Edge 14 also fires native dblclicks, but only for pointerType mouse, see #5180.
|
|
obj.addEventListener('dblclick', handler, false);
|
|
|
|
return this;
|
|
}
|
|
|
|
export function removeDoubleTapListener(obj, id) {
|
|
var touchstart = obj[_pre + _touchstart + id],
|
|
touchend = obj[_pre + _touchend + id],
|
|
dblclick = obj[_pre + 'dblclick' + id];
|
|
|
|
obj.removeEventListener(_touchstart, touchstart, false);
|
|
obj.removeEventListener(_touchend, touchend, false);
|
|
if (!Browser.edge) {
|
|
obj.removeEventListener('dblclick', dblclick, false);
|
|
}
|
|
|
|
return this;
|
|
}
|