2010-07-29 11 views
26

Ich habe eine benutzerdefinierte Overlay-Klasse (ImageOverlay), die von google.maps.OverlayView erbt. Ich möchte, dass es auf Google Maps-Klickereignisse reagiert (nicht nur auf DOM-Klickereignisse), aber die Verwendung von addListener scheint den Trick nicht zu erfüllen.Benutzerdefiniertes Overlay anklickbar machen (Google Maps API v3)

z.B. Ich habe einen shapes-Array, das eine Mischung aus google.maps.Polygon und ImageOverlay Objekten enthält:

for (var i in shapes) { 
    google.maps.event.addListener(shapes[i], 'click', function(){alert('hi')}); 
} 

auf der Polygone Klicken auf einen Alarm auslöst, aber nichts tut, auf dem benutzerdefinierten Overlays klicken.

Wie kann ich Google Maps API so behandeln, dass die Overlays als anklickbar behandelt werden?

Antwort

54

Update für v3: overlayLayer akzeptiert keine Mausereignisse mehr. Fügen Sie Ihr Overlay stattdessen zu overlayMouseTarget hinzu, fügen Sie den Listener hinzu, und es sollte Mausereignisse normalerweise erhalten.

//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

+1

Danke dafür! Unterdokumentiert. Meinen Tag gerettet. Nur hinzufügen, das ist notwendig mit Berührungsereignissen auch (d. H. Nicht nur "Maus" Eingabe), vor allem auf iOS. – brennanyoung

+0

Nachdem ich viele Blogposts gelesen und viel Code probiert hatte, war dies die Lösung, die ich brauchte! Vielen Dank! – Dreamdealer

+0

Seltsam.Sie haben dieses Feature für eine Weile "repariert", aber es scheint, als hätten sie den Fix entfernt! – marksyzm

12

Die Google Maps-API kann nicht automatisch bestimmen, welche Teile Ihres Overlays anklickbar sein sollen (dh wenn Sie ein Bild mit einem transparenten Hintergrund rendern, würde Ihre Overlay-Klasse bestimmen, ob Klicks im transparenten Bereich als zählen) gültige Klicks oder nicht).

Sie sollten DOM-Listener zu den von Ihnen gezeichneten Overlays hinzufügen und dann Ihr eigenes Google Maps-API-Klickereignis auslösen, wenn es sich um einen gültigen Klick handelt.

Beispiel:

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. 
} 
</code> 
+1

Süße. Tatsächlich führt das rekursiv Klicks auf das Div, so dass Sie den zweiten Klick auf das Overlay selbst auslösen müssen: var that = this; google.maps.event.addDomListener (this.div, 'click', function() { \t google.maps.event.trigger (das 'Klicken'); }); – Tamlyn

+0

Ah ja, ich habe mich geschlossen. Ich beabsichtigte, dass dies intern ein Verweis darauf im äußeren Bereich ist :) Danke – plexer

+0

Ich musste deine Antwort mit @ Tims Antwort kombinieren, damit es in API v3 funktioniert. – Pwner

0

Sie können auch Ereignispropagierung stoppen, so dass die Klicks auf der Overlay nicht auf die Elemente unten ausbreitet (zB Polygone, Marker, etc, hängt von Ihrem 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'); 
    } 
}); 
0

für GoogleAPI v3. Wie Jungs gesagt unten, aber mit einigen Korrekturen:

In LocalityCustomOverlay.prototype.onAdd Funktion:

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); 
}); 

Draußen direkt auf Ihrem benutzerdefinierten Overlay:

google.maps.event.addListener(CUSTOM_OVERLAY_OBJECT, 'click', function(event) { 
    console.log('event:', event); 
});