113 votes

Google Maps : Fermer automatiquement les InfoWindows ouvertes ?

Sur mon site J'utilise l'API v3 de Google Maps pour placer des marqueurs de maison sur la carte.

Les fenêtres d'information restent ouvertes sauf si vous cliquez explicitement sur l'icône de fermeture. Autrement dit, vous pouvez avoir plus de deux fenêtres d'information ouvertes en même temps si vous passez la souris sur le marqueur de carte.

Question : Comment faire en sorte que seule la fenêtre d'information active soit ouverte et que toutes les autres fenêtres d'information soient fermées ? Autrement dit, il n'y a pas plus d'une fenêtre d'information ouverte à la fois ?

1 votes

En ce qui me concerne, il est préférable de créer seulement un et la mettre à jour (son contenu, etc.), l'ouvrir, la fermer et tout le reste. Mais je suis sûr que cette approche n'est pas toujours applicable.

157voto

Chris B Points 7476

Il existe un fermer() pour les InfoWindows. Il suffit de garder la trace de la dernière fenêtre ouverte et d'appeler la fonction de fermeture de celle-ci lorsqu'une nouvelle fenêtre est créée.

4 votes

Upvoted pour la suggestion de garder la trace de la dernière fenêtre ouverte seulement. Cela semble être une évidence, mais les gens oublient ces choses...

1 votes

Je viens d'utiliser exactement la même technique. Merci Chris. C'était nécessaire pour moi, parce que j'utilise un tableau d'objets InfoWindow au lieu d'un seul qui parcourt et saisit les informations pertinentes. Chaque InfoWindow possède ses propres informations mises à jour séparément, j'ai donc trouvé cette technique très utile.

68voto

mike Points 71

Solution alternative pour l'utilisation de plusieurs infofenêtres : sauvegarder l'infofenêtre ouverte précédemment dans une variable, puis la fermer à l'ouverture de la nouvelle fenêtre.

var prev_infowindow =false; 
...
base.attachInfo = function(marker, i){
    var infowindow = new google.maps.InfoWindow({
        content: 'yourmarkerinfocontent'
    });

    google.maps.event.addListener(marker, 'click', function(){
        if( prev_infowindow ) {
           prev_infowindow.close();
        }

        prev_infowindow = infowindow;
        infowindow.open(base.map, marker);
    });
}

4 votes

Comme celui-là. Simple à comprendre et à mettre en œuvre

8 votes

Pardonnez ma naïveté, mais qu'est-ce que la base ?

1 votes

Je ne comprends pas pourquoi ce n'est pas le comportement par défaut dans Google Maps V3 ...

27voto

sudopeople Points 903
//assuming you have a map called 'map'
var infowindow = new google.maps.InfoWindow();

var latlng1 = new google.maps.LatLng(0,0);
var marker1 = new google.maps.Marker({position:latlng1, map:map});
google.maps.event.addListener(marker1, 'click',
    function(){
        infowindow.close();//hide the infowindow
        infowindow.setContent('Marker #1');//update the content for this marker
        infowindow.open(map, marker1);//"move" the info window to the clicked marker and open it
    }
);
var latlng2 = new google.maps.LatLng(10,10);
var marker2 = new google.maps.Marker({position:latlng2, map:map});
google.maps.event.addListener(marker2, 'click',
    function(){
        infowindow.close();//hide the infowindow
        infowindow.setContent('Marker #2');//update the content for this marker
        infowindow.open(map, marker2);//"move" the info window to the clicked marker and open it
    }
);

Cela va "déplacer" la fenêtre d'information autour de chaque marqueur cliqué, en se fermant elle-même, puis en la rouvrant (et en l'adaptant à la fenêtre d'affichage) à son nouvel emplacement. Elle modifie son contenu avant l'ouverture pour donner l'effet désiré. Fonctionne pour n marqueurs.

1 votes

Remarque rapide : des appels répétés à infowindow.open() sont suffisants ; il n'est pas nécessaire de fermer la fenêtre au préalable.

3 votes

@Eric, bien que vous ayez techniquement raison, j'ai remarqué un bug qui fait que les fenêtres d'information s'affichent parfois dans leur dernière position. Le fait de forcer la fermeture en premier permet d'éviter ce bug.

9voto

Cat Man Do Points 11771

À partir de ce lien http://www.svennerberg.com/2009/09/google-maps-api-3-infowindows/ :

Teo : La façon la plus simple de faire ça est de d'avoir une seule instance de l'objet InfoWindow que vous réutilisez encore et encore encore et encore. Ainsi, lorsque vous cliquez sur un nouveau marqueur, la fenêtre d'information est "déplacée" de l'endroit où elle se trouve actuellement, pour pointer sur le nouveau marqueur.

Utilisez sa méthode setContent pour le charger avec le contenu correct.

0 votes

Je ne pense pas que cela s'applique puisque j'utilise l'API v3 de Google Maps.

0 votes

De plus, l'article que vous avez cité ne démontre pas plus d'un marqueur.

0 votes

J'ai utilisé une seule fenêtre d'information de la même manière pour plusieurs sites. Cliquez sur l'une d'elles, la fenêtre ouverte se ferme automatiquement.

4voto

MelloG Points 314

Il existe un moyen plus simple que d'utiliser la fonction close(). Si vous créez une variable avec la propriété InfoWindow, elle se ferme automatiquement lorsque vous en ouvrez une autre.

var info_window;
var map;
var chicago = new google.maps.LatLng(33.84659, -84.35686);

function initialize() {
    var mapOptions = {
        center: chicago,
        zoom: 14,
        mapTypeId: google.maps.MapTypeId.ROADMAP
    };
    map = new google.maps.Map(document.getElementById("map_canvas"), mapOptions);

    info_window = new google.maps.InfoWindow({
        content: 'loading'
    )};

createLocationOnMap('Location Name 1', new google.maps.LatLng(33.84659, -84.35686), '<p><strong>Location Name 1</strong><br/>Address 1</p>');
createLocationOnMap('Location Name 2', new google.maps.LatLng(33.84625, -84.36212), '<p><strong>Location Name 1</strong><br/>Address 2</p>');

}

function createLocationOnMap(titulo, posicao, conteudo) {            
    var m = new google.maps.Marker({
        map: map,
        animation: google.maps.Animation.DROP,
        title: titulo,
        position: posicao,
        html: conteudo
    });            

    google.maps.event.addListener(m, 'click', function () {                
        info_window.setContent(this.html);
        info_window.open(map, this);
    });
}

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