UNPKG

2.53 kBJavaScriptView Raw
1import * as Browser from '../core/Browser';
2import {_pointersCount} from './DomEvent.Pointer';
3
4/*
5 * Extends the event handling code with double tap support for mobile browsers.
6 */
7
8var _touchstart = Browser.msPointer ? 'MSPointerDown' : Browser.pointer ? 'pointerdown' : 'touchstart';
9var _touchend = Browser.msPointer ? 'MSPointerUp' : Browser.pointer ? 'pointerup' : 'touchend';
10var _pre = '_leaflet_';
11
12// inspired by Zepto touch code by Thomas Fuchs
13export function addDoubleTapListener(obj, handler, id) {
14 var last, touch,
15 doubleTap = false,
16 delay = 250;
17
18 function onTouchStart(e) {
19 var count;
20
21 if (Browser.pointer) {
22 if ((!Browser.edge) || e.pointerType === 'mouse') { return; }
23 count = _pointersCount;
24 } else {
25 count = e.touches.length;
26 }
27
28 if (count > 1) { return; }
29
30 var now = Date.now(),
31 delta = now - (last || now);
32
33 touch = e.touches ? e.touches[0] : e;
34 doubleTap = (delta > 0 && delta <= delay);
35 last = now;
36 }
37
38 function onTouchEnd(e) {
39 if (doubleTap && !touch.cancelBubble) {
40 if (Browser.pointer) {
41 if ((!Browser.edge) || e.pointerType === 'mouse') { return; }
42 // work around .type being readonly with MSPointer* events
43 var newTouch = {},
44 prop, i;
45
46 for (i in touch) {
47 prop = touch[i];
48 newTouch[i] = prop && prop.bind ? prop.bind(touch) : prop;
49 }
50 touch = newTouch;
51 }
52 touch.type = 'dblclick';
53 touch.button = 0;
54 handler(touch);
55 last = null;
56 }
57 }
58
59 obj[_pre + _touchstart + id] = onTouchStart;
60 obj[_pre + _touchend + id] = onTouchEnd;
61 obj[_pre + 'dblclick' + id] = handler;
62
63 obj.addEventListener(_touchstart, onTouchStart, false);
64 obj.addEventListener(_touchend, onTouchEnd, false);
65
66 // On some platforms (notably, chrome<55 on win10 + touchscreen + mouse),
67 // the browser doesn't fire touchend/pointerup events but does fire
68 // native dblclicks. See #4127.
69 // Edge 14 also fires native dblclicks, but only for pointerType mouse, see #5180.
70 obj.addEventListener('dblclick', handler, false);
71
72 return this;
73}
74
75export function removeDoubleTapListener(obj, id) {
76 var touchstart = obj[_pre + _touchstart + id],
77 touchend = obj[_pre + _touchend + id],
78 dblclick = obj[_pre + 'dblclick' + id];
79
80 obj.removeEventListener(_touchstart, touchstart, false);
81 obj.removeEventListener(_touchend, touchend, false);
82 if (!Browser.edge) {
83 obj.removeEventListener('dblclick', dblclick, false);
84 }
85
86 return this;
87}