79 votes

Google Maps API v3 infowindow close event/callback ?

J'aime garder la trace de toutes les infofenêtres qui sont ouvertes sur mon interface Google Maps (je stocke leurs noms dans un tableau), mais je n'arrive pas à trouver comment les supprimer de mon tableau lorsqu'elles sont fermées via le "x" dans le coin supérieur droit de chacune d'elles.

Y a-t-il une sorte de rappel que je peux écouter ? Ou peut-être que je peux faire quelque chose comme addListener("close", infowindow1, etc ?

181voto

Jorge Points 6168

Il y a un événement pour l'appel infowindows closeclick qui peuvent vous aider

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

5 votes

Notez que cela ne se déclenche pas lorsqu'un autre marqueur à proximité est cliqué et que ce marqueur est fermé automatiquement... comme lorsqu'un défilement a lieu pour s'assurer que la fenêtre d'information est dans les limites visibles de la carte.

18voto

Ben Guild Points 1828

La seule solution cohérente que j'ai trouvée ici consiste à conserver un pointeur sur le fichier infoWindow et vérifier son .getMap() chaque fois que vous devez valider si elle a été fermée.

La raison en est que le fait de cliquer sur un autre élément peut entraîner le rejet de l'infoWindow pour d'autres raisons... sans que l'élément closeclick le déclenchement de l'événement.

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

... Si vous ne vous souciez littéralement que de savoir si le infoWindow a été fermée à l'aide du bouton "X", puis le contrôle closeclick est bien. Cependant, il existe d'autres raisons pour lesquelles il peut être ou avoir été fermé.

1voto

Tina Chen Points 842

Essayez ça :

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

J'écrase cette fonction de clic parce que le bouton de clic ne fonctionne pas dans safari après que j'ai changé le css/position de celui-ci.

1voto

mohamed El_Nady Points 41
infoWindow.addListener('closeclick', ()=>{
  // Handle focus manually.
});

0voto

Rob Points 151

Simplifier et étendre le solution la plus votée vous pouvez créer le marqueur pendant le traitement de l'événement de clic sur le marqueur, ce qui vous permet d'organiser sa suppression en raison de l'utilisation de l'icône x. closeclick en même temps.

Voici un exemple qui permet d'éviter la création de fenêtres d'information en double en ajoutant un booléen. hasInfoWindow le statut des marqueurs.

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

Ensuite, si vous voulez supprimer toutes les fenêtres d'information ouvertes en raison d'un événement de clic sur une carte, vous pouvez itérer à travers le contenu du fichier mapSet['infoWindowsObj'] pour les retirer complètement.

Je pense que ce comportement vous permet d'utiliser infowindow dans la plupart des cas sans avoir à réimplémenter l'ensemble de l'application comme le préconise Google. exemple de popup personnalisée .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X