Hello list,<div><br></div><div>I&#39;m trying to set up a vector layer to respond to click events, and also have a map-level click handler that gets fired if the click was not on one of my features. I&#39;m doing this with two controls, one with a OpenLayers.Handler.Feature and one with a OpenLayers.Handler.Click.</div>
<div><br></div><div>This is what puzzles me:</div><div><br></div><div>In my first attempt: The feature click control is added first, and its stopSingle value is true. The map click control is added last, and its stopSingle value is false. When I click on a feature, the handler for the feature click control fires first (this makes sense), and then the map click control fires (this didn&#39;t make sense to me).</div>
<div><br></div><div>Then, I tried setting stopSingle = true on the map click control as well. This stopped the feature click control from firing at all! So, I conclude that--even though the map click control was added last, AND executes last, the stopSingle value on the map click handler is evaluated first?? Why is this? How can I ensure that the feature click handler control is able to stop the propagation to the map click handler, preferably regardless of the order in which they are added to the map?</div>
<div><br></div><div>To eliminate some confusion: yes, I know about the SelectFeature control. So far as I can tell, I can&#39;t use that--my features are points with large, mostly transparent icons that tend to overlap and cover the whole map (in which case SelectFeature intercepts mousedowns on the whole icon and makes drag-panning impossible), therefore I only want to respond to clicks near the center (canceling propagation in that case). If someone can tell me how to make that work with SelectFeature, I&#39;d be glad to use that instead.</div>
<div><br></div><div>Help? Thanks!</div><div><br></div><div>-Matt</div><div><br></div><div>For reference, here is essentially my code (though the feature click control gets added in a completely different place, it happens in this order in my example):</div>
<div><br></div><div>        var vectorLayer = new OpenLayers.Layer.Vector(...);</div><div>        /* ...set up vector layer with features, etc... */</div><div><div>        OpenLayers.Control.ClickFeature = OpenLayers.Class(OpenLayers.Control, {</div>
<div>            defaultHandlerOptions: {</div><div>                &#39;single&#39;: true,</div><div>                &#39;double&#39;: false,</div><div>                &#39;pixelTolerance&#39;: 0,</div><div>                &#39;stopSingle&#39;: true,</div>
<div>                &#39;stopDouble&#39;: false</div><div>            },</div><div><br></div><div>            initialize: function(options) {</div><div>                this.handlerOptions = OpenLayers.Util.extend(</div><div>
                    {}, this.defaultHandlerOptions</div><div>                );</div><div>                OpenLayers.Control.prototype.initialize.apply(</div><div>                    this, arguments</div><div>                );</div>
<div>                this.handler = new OpenLayers.Handler.Feature(</div><div>                    this, vectorLayer, {</div><div>                        &#39;click&#39;: function(feature){</div><div>                            if(true){</div>
<div>                                console.log(&#39;feature clicked.&#39;);</div><div>                                OpenLayers.Event.stop(this.handler.evt); // this shouldn&#39;t even be necessary when stopSingle = true, right?</div>
<div>                            }</div><div>                        }</div><div>                    }, this.handlerOptions</div><div>                );</div><div>            }</div><div>        });</div><div>        var featureClickControl = new OpenLayers.Control.ClickFeature();</div>
<div>        map.addControl(featureClickControl);</div><div>        featureClickControl.activate();</div><div><br></div></div><div><br></div><div>        // Map click handler</div><div><div>        OpenLayers.Control.Click = OpenLayers.Class(OpenLayers.Control, {</div>
<div>            defaultHandlerOptions: {</div><div>                &#39;single&#39;: true,</div><div>                &#39;double&#39;: false,</div><div>                &#39;pixelTolerance&#39;: 0,</div><div>                &#39;stopSingle&#39;: false,</div>
<div>                &#39;stopDouble&#39;: false</div><div>            },</div><div><br></div><div>            initialize: function(options) {</div><div>                this.handlerOptions = OpenLayers.Util.extend(</div><div>
                    {}, this.defaultHandlerOptions</div><div>                );</div><div>                OpenLayers.Control.prototype.initialize.apply(</div><div>                    this, arguments</div><div>                );</div>
<div>                this.handler = new OpenLayers.Handler.Click(</div><div>                    this, {</div><div>                        &#39;click&#39;: function(evt){console.log(&#39;map clicked&#39;);}</div><div>                    }, this.handlerOptions</div>
<div>                );</div><div>            }</div><div>        });</div><div>        var mapClickControl = new OpenLayers.Control.Click();</div><div>        map.addControl(mapClickControl);</div><div>        mapClickControl.activate();</div>
<div><br></div></div><div><br></div>