问题
I have a custom overlay class (ImageOverlay
) which inherits from google.maps.OverlayView
. I want it to respond to Google Maps click events (not just DOM click events) but simply using addListener
doesn't seem to do the trick.
e.g. I have a shapes
array which contains a mixture of google.maps.Polygon
and ImageOverlay
objects:
for (var i in shapes) {
google.maps.event.addListener(shapes[i], 'click', function(){alert('hi')});
}
Clicking on the polygons triggers an alert but clicking on the custom overlays does nothing.
How do I make Google Maps API treat the overlays as clickable?
回答1:
Update for v3: overlayLayer
doesn't accept mouse events anymore. Add your overlay to overlayMouseTarget
instead, add the listener, and it should receive mouse events normally.
//add element to clickable layer
this.getPanes().overlayMouseTarget.appendChild(div);
// set this as locally scoped var so event does not get confused
var me = this;
// Add a listener - we'll accept clicks anywhere on this div, but you may want
// to validate the click i.e. verify it occurred in some portion of your overlay.
google.maps.event.addDomListener(div, 'click', function() {
google.maps.event.trigger(me, 'click');
});
See: http://code.google.com/apis/maps/documentation/javascript/reference.html#MapPanes
回答2:
The Maps API can't automatically determine which portions of your overlay should be clickable (i.e. if you render an image with a transparent background, if would be up to your overlay class to determine whether clicks in the transparent region count as valid clicks or not).
You should add DOM listeners to the overlays you draw, and then trigger your own Maps API click event if this is a valid click.
Example:
FooBar.prototype.onAdd = function() {
// Create a div and append it to a map pane.
var div = document.createElement('div');
div.style = "height: 100px; width: 100px";
this.getPanes().overlayLayer.appendChild(div);
// set this as locally scoped var so event does not get confused
var me = this;
// Add a listener - we'll accept clicks anywhere on this div, but you may want
// to validate the click i.e. verify it occurred in some portion of your overlay.
google.maps.event.addDomListener(div, 'click', function() {
google.maps.event.trigger(me, 'click');
});
// Position your overlay etc.
}
回答3:
for GoogleAPI v3. As guys said below, but with some corrections:
In LocalityCustomOverlay.prototype.onAdd function:
var self = this;
google.maps.event.addDomListener(this._div, 'click', function(event) {
// stop click reaction on another layers
event.stopPropagation();
// add also event to 3rd parameter for catching
google.maps.event.trigger(self, 'click', event);
});
Outside, directly to your custom overlay:
google.maps.event.addListener(CUSTOM_OVERLAY_OBJECT, 'click', function(event) {
console.log('event:', event);
});
回答4:
You may also want stop event propagation, so that clicks on the Overlay will not propagate to elements below (e.g. polygons, markers, etc, depends on your Pane)
//add element to clickable layer
this.getPanes().overlayMouseTarget.appendChild(div); // or floatPane
// set this as locally scoped var so event does not get confused
var me = this;
// Add a listener - we'll accept clicks anywhere on this div, but you may want
// to validate the click i.e. verify it occurred in some portion of your overlay.
google.maps.event.addDomListener(div, 'click', function(events) {
if (/*handling event*/) {
event.preventDefault(); // The important part
}
else {
google.maps.event.trigger(me, 'click');
}
});
来源:https://stackoverflow.com/questions/3361823/make-custom-overlay-clickable-google-maps-api-v3