Merge pull request #1120 from bbinet/overlay-stop-events

Configurable event propagation for overlays
This commit is contained in:
Bruno Binet
2013-10-11 07:13:31 -07:00
6 changed files with 41 additions and 10 deletions

View File

@@ -36,13 +36,15 @@ map.addOverlay(marker);
// Vienna label // Vienna label
var vienna = new ol.Overlay({ var vienna = new ol.Overlay({
position: pos, position: pos,
element: document.getElementById('vienna') element: document.getElementById('vienna'),
stopEvent: true
}); });
map.addOverlay(vienna); map.addOverlay(vienna);
// Popup showing the position the user clicked // Popup showing the position the user clicked
var popup = new ol.Overlay({ var popup = new ol.Overlay({
element: document.getElementById('popup') element: document.getElementById('popup'),
stopEvent: true
}); });
map.addOverlay(popup); map.addOverlay(popup);

View File

@@ -31,7 +31,8 @@ closer.onclick = function() {
* Create an overlay to anchor the popup to the map. * Create an overlay to anchor the popup to the map.
*/ */
var overlay = new ol.Overlay({ var overlay = new ol.Overlay({
element: container element: container,
stopEvent: true
}); });

View File

@@ -72,6 +72,8 @@
* @property {ol.Coordinate|undefined} position The overlay position in map * @property {ol.Coordinate|undefined} position The overlay position in map
* projection. * projection.
* @property {ol.OverlayPositioning|undefined} positioning Positioning. * @property {ol.OverlayPositioning|undefined} positioning Positioning.
* @property {boolean|undefined} stopEvent Whether event propagation to the map
* should be stopped. Default is `false`.
*/ */
/** /**

View File

@@ -93,7 +93,7 @@ ol.control.Control.prototype.setMap = function(map) {
this.map_ = map; this.map_ = map;
if (!goog.isNull(this.map_)) { if (!goog.isNull(this.map_)) {
var target = goog.isDef(this.target_) ? var target = goog.isDef(this.target_) ?
this.target_ : map.getOverlayContainer(); this.target_ : map.getOverlayContainerStopEvent();
goog.dom.appendChild(target, this.element); goog.dom.appendChild(target, this.element);
if (this.handleMapPostrender !== goog.nullFunction) { if (this.handleMapPostrender !== goog.nullFunction) {
this.listenerKeys.push(goog.events.listen(map, this.listenerKeys.push(goog.events.listen(map,

View File

@@ -225,13 +225,21 @@ ol.Map = function(options) {
*/ */
this.overlayContainer_ = goog.dom.createDom(goog.dom.TagName.DIV, this.overlayContainer_ = goog.dom.createDom(goog.dom.TagName.DIV,
'ol-overlaycontainer'); 'ol-overlaycontainer');
goog.events.listen(this.overlayContainer_, [ goog.dom.appendChild(this.viewport_, this.overlayContainer_);
/**
* @private
* @type {Element}
*/
this.overlayContainerStopEvent_ = goog.dom.createDom(goog.dom.TagName.DIV,
'ol-overlaycontainer-stopevent');
goog.events.listen(this.overlayContainerStopEvent_, [
goog.events.EventType.CLICK, goog.events.EventType.CLICK,
goog.events.EventType.DBLCLICK, goog.events.EventType.DBLCLICK,
ol.BrowserFeature.HAS_TOUCH ? ol.BrowserFeature.HAS_TOUCH ?
goog.events.EventType.TOUCHSTART : goog.events.EventType.MOUSEDOWN goog.events.EventType.TOUCHSTART : goog.events.EventType.MOUSEDOWN
], goog.events.Event.stopPropagation); ], goog.events.Event.stopPropagation);
goog.dom.appendChild(this.viewport_, this.overlayContainer_); goog.dom.appendChild(this.viewport_, this.overlayContainerStopEvent_);
var mapBrowserEventHandler = new ol.MapBrowserEventHandler(this); var mapBrowserEventHandler = new ol.MapBrowserEventHandler(this);
goog.events.listen(mapBrowserEventHandler, goog.events.listen(mapBrowserEventHandler,
@@ -591,14 +599,24 @@ ol.Map.prototype.getViewport = function() {
/** /**
* @return {Element} The map's overlay container. Elements added to this * @return {Element} The map's overlay container. Elements added to this
* container won't let mousedown and touchstart events through to the map, so * container will let mousedown and touchstart events through to the map, so
* clicks and gestures on an overlay don't trigger any MapBrowserEvent. * clicks and gestures on an overlay will trigger MapBrowserEvent events.
*/ */
ol.Map.prototype.getOverlayContainer = function() { ol.Map.prototype.getOverlayContainer = function() {
return this.overlayContainer_; return this.overlayContainer_;
}; };
/**
* @return {Element} The map's overlay container. Elements added to this
* container won't let mousedown and touchstart events through to the map, so
* clicks and gestures on an overlay don't trigger any MapBrowserEvent.
*/
ol.Map.prototype.getOverlayContainerStopEvent = function() {
return this.overlayContainerStopEvent_;
};
/** /**
* @param {ol.Tile} tile Tile. * @param {ol.Tile} tile Tile.
* @param {string} tileSourceKey Tile source key. * @param {string} tileSourceKey Tile source key.

View File

@@ -60,6 +60,12 @@ ol.Overlay = function(options) {
goog.base(this); goog.base(this);
/**
* @private
* @type {boolean}
*/
this.stopEvent_ = goog.isDef(options.stopEvent) ? options.stopEvent : false;
/** /**
* @private * @private
* @type {Element} * @type {Element}
@@ -202,8 +208,10 @@ ol.Overlay.prototype.handleMapChanged = function() {
this.mapPostrenderListenerKey_ = goog.events.listen(map, this.mapPostrenderListenerKey_ = goog.events.listen(map,
ol.MapEventType.POSTRENDER, this.handleMapPostrender, false, this); ol.MapEventType.POSTRENDER, this.handleMapPostrender, false, this);
this.updatePixelPosition_(); this.updatePixelPosition_();
goog.dom.append( goog.dom.append(/** @type {!Node} */ (
/** @type {!Node} */ (map.getOverlayContainer()), this.element_); this.stopEvent_ ? map.getOverlayContainerStopEvent() :
map.getOverlayContainer()),
this.element_);
} }
}; };