Google Maps API v3 infowindow Ereignis / Rückruf schließen?

76

Ich verfolge gerne alle Infofenster, die auf meiner Google Maps-Oberfläche geöffnet sind (ich speichere ihre Namen in einem Array), kann aber nicht herausfinden, wie ich sie aus meinem Array entfernen kann, wenn sie über das "x" geschlossen werden "in der oberen rechten Ecke von jedem.

Gibt es eine Art Rückruf, auf den ich hören kann? Oder kann ich so etwas machen addListener("close", infowindow1, etc?

Colin
quelle

Antworten:

13

Die einzige konsistente Lösung, die ich hier gefunden habe, besteht darin, einen Zeiger auf die zu behalten infoWindowund ihre .getMap()Methode zu überprüfen , wann immer Sie überprüfen müssen, ob sie geschlossen wurde.

Der Grund dafür ist, dass das Klicken auf ein anderes Element dazu führen kann, dass das infoWindow aus anderen Gründen geschlossen wird ... ohne dass das closeclickEreignis ausgelöst wird .

var infoWindow = new google.maps.InfoWindow({ content: 'Something to put here.' });
infoWindow.open(map, infoWindow);

setInterval(function ()
{
    console.log("infoWindow is bound to map: "+(infoWindow.getMap() ? true : false));

}, 1000);

... Wenn Sie sich buchstäblich nur darum kümmern, ob das infoWindowmit der "X" -Taste geschlossen wurde, ist die Überwachung closeclickin Ordnung. Es gibt jedoch andere Gründe, warum es geschlossen sein könnte oder wurde.

Ben Guild
quelle
Diese Antwort sollte mehr positive Stimmen haben. Es gibt mehr Details und erklärt es klar und prägnant
bermick
171

Es gibt ein Ereignis für den Aufruf von Infowindows closeclick, das Ihnen helfen kann

var currentMark;
var infoWindow = new google.maps.InfoWindow({
            content: 'im an info windows'
        });
google.maps.event.addListener(marker, 'click', function () {
          infoWindow.open(map, this);
          currentMark = this;

});
google.maps.event.addListener(infoWindow,'closeclick',function(){
   currentMark.setMap(null); //removes the marker
   // then, remove the infowindows name from the array
});
Jorge
quelle
3
Beachten Sie, dass dies nicht ausgelöst wird, wenn auf eine andere Markierung in der Nähe geklickt wird und diese Markierung automatisch geschlossen wird, z. B. wenn ein Bildlauf durchgeführt wird, um sicherzustellen, dass sich das Infofenster innerhalb der sichtbaren Grenzen der Karte befindet.
Ben Guild
1

Durch Vereinfachung und Erweiterung der am besten bewerteten Lösung können Sie den Marker während der Behandlung des Marker-Klick-Ereignisses erstellen und gleichzeitig dessen Entfernung aufgrund des closeclickEreignisses des x-Symbols verpacken .

Hier ist ein Beispiel, das die Vermeidung doppelter Infofenster enthält, indem ein boolescher hasInfoWindowStatus für Markierungen festgelegt wird.

  newMarker.addListener('click', function () {
    // If a marker does not yet have an info window, create and show it
    if (newMarker['hasInfoWindow'] !== true) {
      newInfoWindow = new google.maps.InfoWindow({content: infoContent}); 
      mapSet['infoWindowsObj'].push(newInfoWindow);
      newMarker['hasInfoWindow'] = true;
      newInfoWindow.open(mapSet, newMarker);

      // If info window is dismissed individually, fully remove object
      google.maps.event.addListener(newInfoWindow, 'closeclick', function () {
        newInfoWindow.setMap(null);
        newMarker['hasInfoWindow'] = false;
        mapSet['infoWindowsObj'].filter(arrayItem => arrayItem !== newInfoWindow);
      });
    }
  });

Wenn Sie dann alle geöffneten Infofenster aufgrund eines Klickereignisses auf einer Karte entfernen möchten, können Sie den Inhalt von durchlaufen mapSet['infoWindowsObj'], um jedes Fenster vollständig zu entfernen.

Ich glaube, mit diesem Verhalten können Sie in den meisten Fällen mit der Verwendung von Infowindow durchkommen, ohne das Ganze gemäß dem benutzerdefinierten Popup-Beispiel von Google neu implementieren zu müssen .

rauben
quelle
0

Versuche dies:

var closeBtn = $('.gm-style-iw').next();
closeBtn.click(function(){
    //other things you want to do when close btn is click
    that.infowindow.close();
});

Ich habe diese Klickfunktion überschrieben, da die Klickschaltfläche in Safari nicht funktioniert, nachdem ich die CSS / Position geändert habe.

Tina Chen
quelle