diff --git a/lib/OpenLayers/Handler.js b/lib/OpenLayers/Handler.js index 38a4875c8d..0fef88e537 100644 --- a/lib/OpenLayers/Handler.js +++ b/lib/OpenLayers/Handler.js @@ -85,6 +85,14 @@ OpenLayers.Handler = OpenLayers.Class({ * the OpenLayers code. */ evt: null, + + /** + * Property: touch + * {Boolean} Indicates the support of touch events. When touch events are + * started touch will be true and all mouse related listeners will do + * nothing. + */ + touch: false, /** * Constructor: OpenLayers.Handler @@ -187,10 +195,32 @@ OpenLayers.Handler = OpenLayers.Class({ this.unregister(events[i], this[events[i]]); } } + this.touch = false; this.active = false; return true; }, + /** + * Method: startTouch + * Start touch events, this method must be called by subclasses in + * "touchstart" method. When touch events are started will be + * true and all mouse related listeners will do nothing. + */ + startTouch: function() { + if (!this.touch) { + this.touch = true; + var events = [ + "mousedown", "mouseup", "mousemove", "click", "dblclick", + "mouseout" + ]; + for (var i=0, len=events.length; i. */ timerId: null, - - /** - * Property: touch - * {Boolean} When a touchstart event is fired, touch will be true and all - * mouse related listeners will do nothing. - */ - touch: false, /** * Property: down @@ -155,10 +148,7 @@ OpenLayers.Handler.Click = OpenLayers.Class(OpenLayers.Handler, { * {Boolean} Continue propagating this event. */ touchstart: function(evt) { - if (!this.touch) { - this.unregisterMouseListeners(); - this.touch = true; - } + this.startTouch(); this.down = this.getEventInfo(evt); this.last = this.getEventInfo(evt); return true; @@ -195,20 +185,6 @@ OpenLayers.Handler.Click = OpenLayers.Class(OpenLayers.Handler, { } return true; }, - - /** - * Method: unregisterMouseListeners - * In a touch environment, we don't want to handle mouse events. - */ - unregisterMouseListeners: function() { - this.map.events.un({ - mousedown: this.mousedown, - mouseup: this.mouseup, - click: this.click, - dblclick: this.dblclick, - scope: this - }); - }, /** * Method: mousedown @@ -520,7 +496,6 @@ OpenLayers.Handler.Click = OpenLayers.Class(OpenLayers.Handler, { this.down = null; this.first = null; this.last = null; - this.touch = false; deactivated = true; } return deactivated; diff --git a/lib/OpenLayers/Handler/Drag.js b/lib/OpenLayers/Handler/Drag.js index 9298db14c0..8c3cb5587e 100644 --- a/lib/OpenLayers/Handler/Drag.js +++ b/lib/OpenLayers/Handler/Drag.js @@ -50,13 +50,6 @@ OpenLayers.Handler.Drag = OpenLayers.Class(OpenLayers.Handler, { */ dragging: false, - /** - * Property: touch - * {Boolean} When a touchstart event is fired, touch will be true and all - * mouse related listeners will do nothing. - */ - touch: false, - /** * Property: last * {} The last pixel location of the drag. @@ -345,17 +338,7 @@ OpenLayers.Handler.Drag = OpenLayers.Class(OpenLayers.Handler, { * {Boolean} Let the event propagate. */ touchstart: function(evt) { - if (!this.touch) { - this.touch = true; - // unregister mouse listeners - this.map.events.un({ - mousedown: this.mousedown, - mouseup: this.mouseup, - mousemove: this.mousemove, - click: this.click, - scope: this - }); - } + this.startTouch(); return this.dragstart(evt); }, @@ -509,7 +492,6 @@ OpenLayers.Handler.Drag = OpenLayers.Class(OpenLayers.Handler, { deactivate: function() { var deactivated = false; if(OpenLayers.Handler.prototype.deactivate.apply(this, arguments)) { - this.touch = false; this.started = false; this.dragging = false; this.start = null; diff --git a/lib/OpenLayers/Handler/Feature.js b/lib/OpenLayers/Handler/Feature.js index 700dd798cd..d18b248dd1 100644 --- a/lib/OpenLayers/Handler/Feature.js +++ b/lib/OpenLayers/Handler/Feature.js @@ -59,13 +59,6 @@ OpenLayers.Handler.Feature = OpenLayers.Class(OpenLayers.Handler, { * {} The location of the last mouseup. */ up: null, - - /** - * Property: touch - * {Boolean} When a touchstart event is fired, touch will be true and all - * mouse related listeners will do nothing. - */ - touch: false, /** * Property: clickTolerance @@ -139,17 +132,7 @@ OpenLayers.Handler.Feature = OpenLayers.Class(OpenLayers.Handler, { * {Boolean} Let the event propagate. */ touchstart: function(evt) { - if(!this.touch) { - this.touch = true; - this.map.events.un({ - mousedown: this.mousedown, - mouseup: this.mouseup, - mousemove: this.mousemove, - click: this.click, - dblclick: this.dblclick, - scope: this - }); - } + this.startTouch(); return OpenLayers.Event.isMultiTouch(evt) ? true : this.mousedown(evt); }, @@ -398,7 +381,6 @@ OpenLayers.Handler.Feature = OpenLayers.Class(OpenLayers.Handler, { this.lastFeature = null; this.down = null; this.up = null; - this.touch = false; this.map.events.un({ "removelayer": this.handleMapEvents, "changelayer": this.handleMapEvents, diff --git a/lib/OpenLayers/Handler/Point.js b/lib/OpenLayers/Handler/Point.js index c3e1701577..b4bb17c503 100644 --- a/lib/OpenLayers/Handler/Point.js +++ b/lib/OpenLayers/Handler/Point.js @@ -113,12 +113,6 @@ OpenLayers.Handler.Point = OpenLayers.Class(OpenLayers.Handler, { */ pixelTolerance: 5, - /** - * Property: touch - * {Boolean} Indcates the support of touch events. - */ - touch: false, - /** * Property: lastTouchPx * {} The last pixel used to know the distance between @@ -216,7 +210,6 @@ OpenLayers.Handler.Point = OpenLayers.Class(OpenLayers.Handler, { this.layer.destroy(false); } this.layer = null; - this.touch = false; return true; }, @@ -383,18 +376,7 @@ OpenLayers.Handler.Point = OpenLayers.Class(OpenLayers.Handler, { * {Boolean} Allow event propagation */ touchstart: function(evt) { - if (!this.touch) { - this.touch = true; - // unregister mouse listeners - this.map.events.un({ - mousedown: this.mousedown, - mouseup: this.mouseup, - mousemove: this.mousemove, - click: this.click, - dblclick: this.dblclick, - scope: this - }); - } + this.startTouch(); this.lastTouchPx = evt.xy; return this.down(evt); }, diff --git a/tests/Handler/Click.html b/tests/Handler/Click.html index 41172cd896..be508cac75 100644 --- a/tests/Handler/Click.html +++ b/tests/Handler/Click.html @@ -669,6 +669,64 @@ map.destroy(); } + function test_touchstart(t) { + // a test to verify that the touchstart function does + // unregister the mouse listeners when it's called the + // first time + + t.plan(7); + + // set up + + var map = new OpenLayers.Map("map", { + controls: [] + }); + var control = new OpenLayers.Control({}); + var handler = new OpenLayers.Handler.Click(control, {}); + control.handler = handler; + map.addControl(control); + handler.activate(); + + function allRegistered() { + var eventTypes = ['mousedown', 'mouseup', 'click', 'dblclick'], + eventType, + listeners, + listener, + flag; + for(var i=0, ilen=eventTypes.length; i diff --git a/tests/Handler/Drag.html b/tests/Handler/Drag.html index 71ad3ef71f..fa9a3b2c50 100644 --- a/tests/Handler/Drag.html +++ b/tests/Handler/Drag.html @@ -288,7 +288,7 @@ // "touchend" events set expected states in the drag handler. // We also verify that we prevent the default as appropriate. - t.plan(14); + t.plan(19); // set up @@ -318,6 +318,11 @@ t.eq(h.start.y, 0, '[touchstart] start.y is correct'); t.eq(log.length, 1, '[touchstart] one item in log'); t.ok(log[0] === e, "touchstart", '[touchstart] event is stopped'); + t.eq(m.events.listeners.mousedown.length, 0,"mousedown is not registered"); + t.eq(m.events.listeners.mouseup.length, 0,"mouseup is not registered"); + t.eq(m.events.listeners.mousemove.length, 0,"mousemove is not registered"); + t.eq(m.events.listeners.click.length, 0,"click is not registered"); + t.eq(m.events.listeners.mouseout.length, 0,"mouseout is not registered"); e = {xy: new Px(1, 1)}; m.events.triggerEvent('touchmove', e); diff --git a/tests/Handler/Feature.html b/tests/Handler/Feature.html index 580d419d70..4a78e14bce 100644 --- a/tests/Handler/Feature.html +++ b/tests/Handler/Feature.html @@ -280,9 +280,10 @@ handler.mousedown = function() {}; // mock mousedown handler.activate(); + var eventTypes = ['mousedown', 'mouseup', 'mousemove', 'click', 'dblclick']; + function allRegistered() { - var eventTypes = ['mousedown', 'mouseup', 'mousemove', 'click', 'dblclick'], - eventType, + var eventType, listeners, listener, flag; @@ -305,21 +306,18 @@ } function noneRegistered() { - var eventTypes = ['mousedown', 'mouseup', 'mousemove', 'click', 'dblclick'], - eventType, - listeners, - listener; + var eventType, + times, + flag = false; for(var i=0, ilen=eventTypes.length; i