diff --git a/src/ol/Map.js b/src/ol/Map.js
index dea0e0a8d3..f0dc399523 100644
--- a/src/ol/Map.js
+++ b/src/ol/Map.js
@@ -7,6 +7,7 @@ goog.require('ol.control.Control');
goog.require('ol.renderer.MapRenderer');
goog.require('ol.handler.Drag');
goog.require('ol.handler.MouseWheel');
+goog.require('ol.handler.Click');
goog.require('goog.dom');
goog.require('goog.math');
@@ -23,6 +24,11 @@ ol.ENABLE_DRAG_HANDLER = true;
*/
ol.ENABLE_MOUSEWHEEL_HANDLER = true;
+/**
+ * @define {boolean} Whether to enable the click handler.
+ */
+ol.ENABLE_CLICK_HANDLER = true;
+
/**
* @export
* @constructor
@@ -529,6 +535,10 @@ ol.Map.prototype.initHandlers = function() {
handler = new ol.handler.MouseWheel(this, this.viewport_, states);
this.registerDisposable(handler);
}
+ if (ol.ENABLE_CLICK_HANDLER) {
+ handler = new ol.handler.Click(this, this.viewport_, states);
+ this.registerDisposable(handler);
+ }
};
ol.Map.prototype.createRenderer = function() {
diff --git a/src/ol/handler/Click.js b/src/ol/handler/Click.js
new file mode 100644
index 0000000000..89ab32fe58
--- /dev/null
+++ b/src/ol/handler/Click.js
@@ -0,0 +1,63 @@
+/**
+ * @fileoverview Click Handler.
+ *
+ * Provides a class for listening to click events on a DOM element
+ * and re-dispatching to a map instance.
+ *
+ * This handler has no default behaviour.
+ */
+
+goog.provide('ol.handler.Click');
+
+goog.require('goog.asserts');
+goog.require('goog.events');
+goog.require('goog.events.EventType');
+goog.require('goog.Disposable');
+
+
+/**
+ * @constructor
+ * @extends {goog.Disposable}
+ * @param {ol.Map} map The map instance.
+ * @param {Element} elt The element we listen to mousewheel on.
+ * @param {Object} states An object for the handlers to share states.
+ */
+ol.handler.Click = function(map, elt, states) {
+ goog.base(this);
+
+ /**
+ * @type {ol.Map}
+ */
+ this.map_ = map;
+
+ /**
+ * @type {Element}
+ */
+ this.elt_ = elt;
+
+ /**
+ * @type {Object}
+ */
+ this.states_ = states;
+
+ goog.events.listen(this.elt_, goog.events.EventType.CLICK,
+ this.handleClick, undefined, this);
+};
+goog.inherits(ol.handler.Click, goog.Disposable);
+
+/**
+ * @inheritDoc
+ */
+ol.handler.Click.prototype.disposeInternal = function() {
+ goog.events.unlisten(this.elt_, goog.events.EventType.CLICK,
+ this.handleClick, undefined, this);
+};
+
+/**
+ * @param {goog.events.BrowserEvent} e
+ */
+ol.handler.Click.prototype.handleClick = function(e) {
+ if (!this.states_.dragged) {
+ goog.events.dispatchEvent(this.map_, e);
+ }
+};
diff --git a/test/ol.html b/test/ol.html
index 776efaf0e0..c5bd94291e 100644
--- a/test/ol.html
+++ b/test/ol.html
@@ -89,6 +89,7 @@
+
diff --git a/test/spec/ol/handler/Click.test.js b/test/spec/ol/handler/Click.test.js
new file mode 100644
index 0000000000..9b5082c64a
--- /dev/null
+++ b/test/spec/ol/handler/Click.test.js
@@ -0,0 +1,17 @@
+describe('ol.handler.Click', function() {
+ var map, elt;
+
+ beforeEach(function() {
+ map = new ol.Map();
+ elt = goog.dom.createDom('div');
+ });
+
+ describe('create a drag handler', function() {
+
+ it('returns an ol.handler.Click instance', function() {
+ var handler = new ol.handler.Click(map, elt, {});
+ expect(handler).toBeA(ol.handler.Click);
+ });
+
+ });
+});