Detect and ignore erroneous mouse-type pointermove events sent after pointerup events on iOS when drawing

This commit is contained in:
Quincy Morgan
2020-05-28 11:13:09 -04:00
parent 9ad51ca5d9
commit d8443d28d5
+15 -2
View File
@@ -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());
}