[OpenLayers-Dev] feature events
Roald de Wit
roald.dewit at lisasoft.com
Sun Oct 18 00:59:55 EDT 2009
Tim,
This is great stuff! Does this also pave the way for other layers (like
WMS) to receive mouse events? I had a chat with someone on IRC a number
weeks ago. He needed to have mouse-over and out events for tiles. This
worked until a vector layer was placed 'above' his WMS layer and blocked
all mouse events.
Regards, Roald
Regards, Roald
Tim Schaub wrote:
> Hey-
>
> We've wrestled for some time with browser events being blocked by
> svg/vml elements. This originally meant that you could only use a
> select feature control with one layer at a time. Andreas contributed a
> nice solution for selecting features on multiple layers for the last
> release.
>
> I got a number of things wrong in the select feature control (layer gets
> selectedFeatures array [ack] and control maintains it [ug], control has
> select method but layer doesn't, you can't easily deal with
> feature/mouse interaction without getting all the select feature control
> behavior, etc.) I've long wanted to just have vector layers trigger
> feature related events.
>
> I put together what seems like a potential solution:
> http://dev.openlayers.org/sandbox/tschaub/select/examples/feature-events.html
>
> This introduces a "FeatureAgent" constructor. If a map has the
> "featureEvents" property set to true, it gets a feature agent that
> manages feature related events (from click and mousemove). This gives
> us featureclick, nofeatureclick, featureover, and featureout event on
> vector layers.
>
> As described in the example, these events are fired for visible vector
> layers. The over/out events are similar to mouseover/mouseout for other
> doc elements - except that all features on all layers are essentially
> treated as if they share the same z-index. This means you get over/out
> for every feature on every layer as you pass over and out. Similarly,
> the featureclick event "drills" through all features on all layers. You
> get the event once for each of multiple overlapping features on a single
> layer or the same on multiple layers. Listeners are triggered for
> features in reverse draw order (top first). Any listener can return
> false to stop remaining listeners from getting called.
>
> The whole thing relies on document.elementFromPoint [1]. This is a
> handy method that accounts for the currently computed style of all
> elements. The trick is to set the display style to none for each target
> and call the method again, until all targets on all layers have been
> accounted for. All this happens in a single browser event listener
> sequence. Since style display is getting set and reset for all targets
> during the same sequence, we don't trigger a reflow with each display
> change. It appears that there also isn't a reflow at the end of the
> listener sequence either (though I need some heavier examples to test with).
>
> I've played with the example on Firefox 3.5 and IE 6. Haven't tested
> other browsers yet.
>
> There are a number of ways this could be implemented:
>
> a) As a control. Traditional, but we don't need the dom element or
> events object - and this may be a more awkward way in practice.
>
> b) As it is now. The agent is added/activated if a map property is set.
> Could also be added/activated after map construction.
>
> c) Crammed into Map.js. I'd rather not do this.
>
> d) Other (handler, plugin, more).
>
> Thanks for any feedback.
> Tim
>
> [1] https://developer.mozilla.org/en/DOM/document.elementFromPoint
>
>
More information about the Dev
mailing list