From d8443d28d536fe5cb00dad25c06746920d8af050 Mon Sep 17 00:00:00 2001 From: Quincy Morgan Date: Thu, 28 May 2020 11:13:09 -0400 Subject: [PATCH] Detect and ignore erroneous mouse-type pointermove events sent after pointerup events on iOS when drawing --- modules/behavior/draw.js | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/modules/behavior/draw.js b/modules/behavior/draw.js index e549c891b..83b25178a 100644 --- a/modules/behavior/draw.js +++ b/modules/behavior/draw.js @@ -59,6 +59,7 @@ export function behaviorDraw(context) { return (d && d.properties && d.properties.target) ? d : {}; } + var _lastPointerUpEvent; function pointerdown() { @@ -73,11 +74,16 @@ export function behaviorDraw(context) { element.on(_pointerPrefix + 'move.draw', null); - d3_select(window).on(_pointerPrefix + 'up.draw', function() { + d3_select(window) + .on(_pointerPrefix + 'up.draw', pointerup, true); + + function pointerup() { if (_downPointerId !== (d3_event.pointerId || 'mouse')) return; _downPointerId = null; + _lastPointerUpEvent = d3_event; + element.on(_pointerPrefix + 'move.draw', pointermove); d3_select(window).on(_pointerPrefix + 'up.draw', null); @@ -100,7 +106,7 @@ export function behaviorDraw(context) { click(p2); } - }, true); + } } @@ -109,6 +115,13 @@ export function behaviorDraw(context) { d3_event.buttons || _downPointerId) return; + // HACK: Mobile Safari likes to send one or more `mouse` type pointermove + // events immediately after non-mouse pointerup events; detect and ignore them. + if (_lastPointerUpEvent && + _lastPointerUpEvent.pointerType !== 'mouse' && + geoVecLength([_lastPointerUpEvent.clientX, _lastPointerUpEvent.clientY], [d3_event.clientX, d3_event.clientY]) < 2 && + d3_event.timeStamp - _lastPointerUpEvent.timeStamp < 100) return; + _lastMouse = d3_event; dispatch.call('move', this, datum()); }