Карты Google: автоматическое закрытие InfoWindows?

На моем сайте я использую API Карт Google v3 для размещения маркеров дома на карте.

InfoWindows остается открытым, если вы явно не щелкните значок закрытия. Значит, вы можете открыть 2+ InfoWindows за раз, если вы наведете курсор на маркер карты.

Вопрос. Как сделать так, чтобы только текущий активный InfoWindow был открыт и все остальные InfoWindows были закрыты? Значит, не более 1 InfoWindow будет открыто одновременно?

Ответ 1

Существует функция close() для InfoWindows. Просто отследите последнее открытое окно и вызовите функцию закрытия на нем при создании нового окна.

В этом демо есть функциональность, которую вы ищете. Я нашел его в галерее Maps API V3.

Ответ 2

альтернативное решение для этого с использованием многих инфо-окон: save prev открыл infowindow в переменной, а затем закроет ее при открытии нового окна.

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

Ответ 3

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

Это "перемещает" информационное окно вокруг каждого щелкнутого маркера, фактически закрывая себя, а затем вновь открывая (и панорамируя, чтобы соответствовать окну просмотра) в новом месте. Он меняет свое содержимое перед открытием, чтобы дать желаемый эффект. Работает для n маркеров.

Ответ 4

Мое решение.

var map;
var infowindow = new google.maps.InfoWindow();
...
function createMarker(...) {
var marker = new google.maps.Marker({
     ...,
     descrip: infowindowHtmlContent  
});
google.maps.event.addListener(marker, 'click', function() {
    infowindow.setOptions({
        content: this.descrip,
        maxWidth:300
    });
    infowindow.open(map, marker);
}

Ответ 5

С этой ссылкой http://www.svennerberg.com/2009/09/google-maps-api-3-infowindows/:

Тео: Самый простой способ сделать это: просто один экземпляр Объект InfoWindow, который вы повторно используете и снова. Таким образом, когда вы щелкните по новому маркеру infoWindow. "переместился" с того места, где он находится, чтобы указать на новый маркер.

Используйте метод setContent для его загрузки с правильным содержанием.

Ответ 6

Существует более простой способ, кроме использования функции close(). если вы создаете переменную с свойством InfoWindow, она автоматически закрывается при открытии другого.

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

Ответ 7

Как насчет -

google.maps.event.addListener(yourMarker, 'mouseover', function () {
        yourInfoWindow.open(yourMap, yourMarker);

    });

google.maps.event.addListener(yourMarker, 'mouseout', function () {
        yourInfoWindow.open(yourMap, yourMarker);

    });

Тогда вы можете просто нависнуть над ним, и он закроется.

Ответ 8

var map;
var infowindow;
...
function createMarker(...) {
    var marker = new google.maps.Marker({...});
    google.maps.event.addListener(marker, 'click', function() {
        ...
        if (infowindow) {
            infowindow.close();
        };
        infowindow = new google.maps.InfoWindow({
            content: contentString,
            maxWidth: 300
        });
        infowindow.open(map, marker);
    }
...
function initialize() {
    ...
    map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
    ...
    google.maps.event.addListener(map, 'click', function(event) {
        if (infowindow) {
            infowindow.close();
        };
        ...
    }
}

Ответ 9

Я сохранил переменную наверху, чтобы отслеживать, какое информационное окно открыто, см. ниже.

var currentInfoWin = null;
google.maps.event.addListener(markers[counter], 'click', function() {      
    if (currentInfoWin !== null) {
        currentInfoWin.close(map, this); 
    }
    this.infoWin.open(map, this); 
    currentInfoWin = this.infoWin;  
}); 

Ответ 10

var contentString = "Location: " + results[1].formatted_address;    
google.maps.event.addListener(marker,'click', (function(){ 
    infowindow.close();
    infowindow = new google.maps.InfoWindow({
        content: contentString
    });
    infowindow.open(map, marker);
}));