1. Übersicht der Kartenereignisse
  2. Ereignis-Listener
  3. Closures in Ereignis-Listenern verwenden
  4. Übergebene Argumente in Ereignissen verwenden
  5. Ereignisse an Objekte binden
  6. DOM-Ereignisse überwachen
  7. Ereignis-Listener entfernen


Übersicht der Kartenereignisse

JavaScript im Browser ist ereignisgesteuert, d. h., dass JavaScript auf Interaktionen mit der Erzeugung von Ereignissen reagiert und erwartet, dass ein Programm interessante Ereignisse überwacht. Beispielsweise erstellen Maus- und Tastaturinteraktionen des Nutzers im Browser Ereignisse, die innerhalb des DOM weitergeleitet werden. Programme, die bestimmte Ereignisse benötigen, registrieren JavaScript-Ereignis-Listener für diese Ereignisse und führen Code aus, wenn diese Ereignisse empfangen werden. Das Google Maps-API ergänzt dieses Ereignismodell um benutzerdefinierte Ereignisse für Maps-API-Objekte, die definiert werden können. Es ist wichtig zu beachten, dass die Maps-API-Ereignisse deutlich von den Standard-DOM-Ereignissen abgegrenzt werden. Da unterschiedliche Browser jedoch unterschiedliche DOM-Ereignismodelle implementieren, bietet die Maps-API auch Mechanismen, mit deren Hilfe diese DOM-Ereignisse überwacht und auf sie reagiert werden kann, ohne mit den verschiedenen browserübergreifenden Besonderheiten umgehen zu müssen.

Ereignis-Listener

zurück zum Start

Ereignisse in der Google Maps-API werden mithilfe von Dienstfunktionen im GEvent-Namespace zum Registrieren von Ereignis-Listenern verwendet. Jedes Maps-API-Objekt exportiert eine Anzahl benannter Ereignisse. Beispielsweise exportiert unter anderem das GMap2-Objekt click-, dblclick- und move-Ereignisse. Jedes Ereignis findet in einem angegebenen Kontext statt und kann Argumente übergeben, die diesen Kontext identifizieren. Beispielsweise startet das mousemove-Ereignis, wenn der Nutzer die Maus in einem Kartenobjekt bewegt, und übergibt GLatLng der geografischen Position, an der sich die Maus befindet.

Eine vollständige Liste der GMap2-Ereignisse und der Argumente, die sie generieren, finden Sie unter GMap2.Events.

Verwenden Sie zum Registrieren für eine Benachrichtigung über diese Ereignisse die statische Methode GEvent.addListener(). Diese Methode verwendet ein Objekt, ein zu überwachendes Ereignis und eine Funktion, die aufgerufen wird, wenn das angegebene Ereignis eintritt. Dieser Codeschnipsel beispielsweise zeigt jedesmal ein Alert an, wenn der Nutzer auf die Karte klickt:

var map = new GMap2(document.getElementById("map"));
map.setCenter(new GLatLng(37.4419, -122.1419), 13);
GEvent.addListener(map, "click", function() {
  alert("You clicked the map.");
});


Beispiel anzeigen (event-simple.html)

Listener können auch den Kontext des Ereignisses erfassen. Im folgenden Beispielcode werden die geografische Breite und Länge der Kartenmitte angezeigt, nachdem der Nutzer die Karte verschoben hat.

var map = new GMap2(document.getElementById("map"));
GEvent.addListener(map, "moveend", function() {
  var center = map.getCenter();
  document.getElementById("message").innerHTML = center.toString();
});
map.setCenter(new GLatLng(37.4419, -122.1419), 13);


Closures in Ereignis-Listenern verwenden

zurück zum Start

Wenn ein Ereignis-Listener ausgeführt wird, ist es meistens von Vorteil, sowohl vertrauliche als auch dauerhafte Daten einem Objekt zuzuordnen. JavaScript unterstützt keine "vertraulichen" Instanzdaten, doch es unterstützt Closures. Dadurch wird inneren Funktionen erlaubt, auf äußere Variablen zuzugreifen. Closures sind nützlich innerhalb von Ereignis-Listenern, um auf Variablen zuzugreifen, die normalerweise nicht den Objekten zugeordnet sind, bei denen Ereignisse auftreten. Das folgende Beispiel verwendet eine Funktions-Closure im Ereignis-Listener, um mehreren Markierungen eine geheime Meldung zuzuordnen. Das Klicken auf eine Markierung zeigt einen Teil der geheimen Meldung an, die nicht in der Markierung selbst enthalten ist.

var map = new GMap2(document.getElementById("map_canvas"));
map.setCenter(new GLatLng(37.4419, -122.1419), 13);

// Creates a marker at the given point
// The five markers show a secret message when clicked
// but that message is not within the marker's instance data

function createMarker(point, number) {
  var marker = new GMarker(point);
  var message = ["This","is","the","secret","message"];
  marker.value = number;
  GEvent.addListener(marker, "click", function() {
    var myHtml = "<b>#" + number + "</b><br/>" + message[number -1];
    map.openInfoWindowHtml(point, myHtml);
  });
  return marker;
}

// Add 5 markers to the map at random locations
var bounds = map.getBounds();
var southWest = bounds.getSouthWest();
var northEast = bounds.getNorthEast();
var lngSpan = northEast.lng() - southWest.lng();
var latSpan = northEast.lat() - southWest.lat();
for (var i = 0; i < 5; i++) {
  var point = new GLatLng(southWest.lat() + latSpan * Math.random(),
    southWest.lng() + lngSpan * Math.random());
  map.addOverlay(createMarker(point, i + 1));
}


Beispiel anzeigen (event-closure.html)

Übergebene Argumente in Ereignissen verwenden

zurück zum Start

Viele Ereignisse im Maps-API-Ereignissystem übergeben Argumente, wenn das Ereignis ausgelöst wird. Das GMap2-"click"-Ereignis beispielsweise übergibt overlay und overlaylatlng, wenn der Kartenklick auf einem Overlay erfolgt. Andernfalls übergibt es ein latlng-Objekt der Kartenkoordinate. Sie können auf diese Argumente zugreifen, indem Sie die angegebenen Symbole direkt an die Funktionen in den Ereignis-Listenern übergeben.

Im nachfolgenden Beispiel wird zunächst getestet, ob der Klick auf einer Kartenkachel erfolgt ist. Dazu wird überprüft, ob das latlng-Argument definiert ist. Falls ja, kann über der angeklickten Koordinate ein Infofenster geöffnet und die in einen Pixelbereich konvertierte Koordinate zusammen mit der Zoomstufe angezeigt werden.

var map = new GMap2(document.getElementById("map_canvas"));
map.setCenter(new GLatLng(37.4419, -122.1419), 13);

GEvent.addListener(map,"click", function(overlay, latlng) {
  if (latlng) {
    var myHtml = "The GPoint value is: " + map.fromLatLngToDivPixel(latlng) + " at zoom level " + map.getZoom();
    map.openInfoWindow(latlng, myHtml);
  }
});
map.addControl(new GSmallMapControl());
map.addControl(new GMapTypeControl());