From 2b5e0c2c311d58a6e160cad159fe87a7cf8df883 Mon Sep 17 00:00:00 2001 From: Frederic Junod Date: Wed, 28 Aug 2013 11:08:08 +0200 Subject: [PATCH 1/3] Change touchmove and touchstart listened element to 'document' As for the mouse events, this allows to drag, zoom or rotate the map with pointer(s) who moved outside of the viewport. --- src/ol/mapbrowserevent.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ol/mapbrowserevent.js b/src/ol/mapbrowserevent.js index ccc82b3f5e..2d586dd614 100644 --- a/src/ol/mapbrowserevent.js +++ b/src/ol/mapbrowserevent.js @@ -185,11 +185,11 @@ ol.MapBrowserEventHandler = function(map) { goog.events.EventType.TOUCHSTART, goog.events.EventType.MSPOINTERDOWN ], this.handleTouchStart_, false, this), - goog.events.listen(element, [ + goog.events.listen(goog.global.document, [ goog.events.EventType.TOUCHMOVE, goog.events.EventType.MSPOINTERMOVE ], this.handleTouchMove_, false, this), - goog.events.listen(element, [ + goog.events.listen(goog.global.document, [ goog.events.EventType.TOUCHEND, goog.events.EventType.MSPOINTERUP ], this.handleTouchEnd_, false, this) From 77f6b4ff59447b4af95c05850c4a0ef65ae5a710 Mon Sep 17 00:00:00 2001 From: Frederic Junod Date: Wed, 28 Aug 2013 10:40:47 +0200 Subject: [PATCH 2/3] Only consider touch events to compute ol.interaction.Touch.targetTouches --- src/ol/interaction/touchinteraction.js | 40 +++++++++++++++++++------- 1 file changed, 30 insertions(+), 10 deletions(-) diff --git a/src/ol/interaction/touchinteraction.js b/src/ol/interaction/touchinteraction.js index f1d258a223..814c742593 100644 --- a/src/ol/interaction/touchinteraction.js +++ b/src/ol/interaction/touchinteraction.js @@ -1,6 +1,7 @@ goog.provide('ol.interaction.Touch'); +goog.require('goog.asserts'); goog.require('goog.functions'); goog.require('goog.object'); goog.require('ol.MapBrowserEvent'); @@ -57,24 +58,43 @@ ol.interaction.Touch.centroid = function(touches) { }; +/** + * @param {ol.MapBrowserEvent} mapBrowserEvent Event. + * @return {boolean} Whether the event is a touchstart, touchmove + * or touchend event. + * @private + */ +ol.interaction.Touch.isTouchEvent_ = function(mapBrowserEvent) { + var type = mapBrowserEvent.type; + return ( + type === ol.MapBrowserEvent.EventType.TOUCHSTART || + type === ol.MapBrowserEvent.EventType.TOUCHMOVE || + type === ol.MapBrowserEvent.EventType.TOUCHEND); +}; + + /** * @param {ol.MapBrowserEvent} mapBrowserEvent Event. * @private */ ol.interaction.Touch.prototype.updateTrackedTouches_ = function(mapBrowserEvent) { - var event = mapBrowserEvent.browserEvent.getBrowserEvent(); - if (goog.isDef(event.targetTouches)) { - // W3C touch events - this.targetTouches = event.targetTouches; - } else { - // IE pointer event - if (mapBrowserEvent.type == ol.MapBrowserEvent.EventType.TOUCHEND) { - delete this.trackedTouches_[event.pointerId]; + if (ol.interaction.Touch.isTouchEvent_(mapBrowserEvent)) { + var event = mapBrowserEvent.browserEvent.getBrowserEvent(); + if (goog.isDef(event.targetTouches)) { + // W3C touch events + this.targetTouches = event.targetTouches; + } else if (goog.isDef(event.pointerId)) { + // IE pointer event + if (mapBrowserEvent.type == ol.MapBrowserEvent.EventType.TOUCHEND) { + delete this.trackedTouches_[event.pointerId]; + } else { + this.trackedTouches_[event.pointerId] = event; + } + this.targetTouches = goog.object.getValues(this.trackedTouches_); } else { - this.trackedTouches_[event.pointerId] = event; + goog.asserts.fail('unknown touch event model'); } - this.targetTouches = goog.object.getValues(this.trackedTouches_); } }; From f994c4f8a17e4389a1a1c9e744f39f0a88afd1b8 Mon Sep 17 00:00:00 2001 From: Frederic Junod Date: Wed, 28 Aug 2013 12:16:40 +0200 Subject: [PATCH 3/3] Only dispatch touchmove events after a touchstart --- src/ol/mapbrowserevent.js | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/ol/mapbrowserevent.js b/src/ol/mapbrowserevent.js index 2d586dd614..566169d561 100644 --- a/src/ol/mapbrowserevent.js +++ b/src/ol/mapbrowserevent.js @@ -312,10 +312,16 @@ ol.MapBrowserEventHandler.prototype.handleTouchStart_ = function(browserEvent) { * @private */ ol.MapBrowserEventHandler.prototype.handleTouchMove_ = function(browserEvent) { - this.dragged_ = true; - var newEvent = new ol.MapBrowserEvent( - ol.MapBrowserEvent.EventType.TOUCHMOVE, this.map_, browserEvent); - this.dispatchEvent(newEvent); + if (this.down_) { + // 'touchmove' events are dispatched only when this.down_ is set + // (set after a touch start) to prevent unwanted events when the + // mouse hover the page. This only happens with the IE pointer + // event system. + this.dragged_ = true; + var newEvent = new ol.MapBrowserEvent( + ol.MapBrowserEvent.EventType.TOUCHMOVE, this.map_, browserEvent); + this.dispatchEvent(newEvent); + } };