Eu preciso ter apenas uma InfoWindow aberta no meu mapa do Google. Preciso fechar todas as outras InfoWindows antes de abrir uma nova.
Alguém pode me mostrar como fazer isso?
Respostas:
Você precisa criar apenas um InfoWindow
objeto, manter uma referência a ele e reutilizá-lo para todos os marcadores. Citação do Google Maps API Docs :
Se você deseja que apenas uma janela de informações seja exibida por vez (como é o comportamento no Google Maps), você só precisa criar uma janela de informações, que pode ser reatribuída a diferentes locais ou marcadores nos eventos do mapa (como cliques do usuário).
Portanto, você pode simplesmente criar o InfoWindow
objeto logo após inicializar seu mapa e, em seguida, manipular os click
manipuladores de eventos de seus marcadores da seguinte maneira. Digamos que você tenha um marcador chamado someMarker
:
google.maps.event.addListener(someMarker, 'click', function() {
infowindow.setContent('Hello World');
infowindow.open(map, this);
});
Então, o InfoWindow
deve fechar automaticamente quando você clica em um novo marcador sem ter que chamar o close()
método.
Crie sua janela de informações fora do escopo para que você possa compartilhá-la.
Aqui está um exemplo simples:
var markers = [AnArrayOfMarkers];
var infowindow = new google.maps.InfoWindow();
for (var i = 0, marker; marker = markers[i]; i++) {
google.maps.event.addListener(marker, 'click', function(e) {
infowindow.setContent('Marker position: ' + this.getPosition());
infowindow.open(map, this);
});
}
Eu tive o mesmo problema, mas a melhor resposta não resolveu completamente, o que eu tive que fazer na minha instrução for foi usar o this relacionado ao meu marcador atual. Talvez isso ajude alguém.
for(var i = 0; i < markers.length; i++){
name = markers[i].getAttribute("name");
address = markers[i].getAttribute("address");
point = new google.maps.LatLng(parseFloat(markers[i].getAttribute("lat")), parseFloat(markers[i].getAttribute("lng")));
contentString = '<div style="font-family: Lucida Grande, Arial, sans-serif;>'+'<div><b>'+ name +'</b></div>'+'<div>'+ address +'</div>';
marker = new google.maps.Marker({
map: map,
position: point,
title: name+" "+address,
buborek: contentString
});
google.maps.event.addListener(marker, 'click', function(){
infowindow.setContent(this.buborek);
infowindow.open(map,this);
});
marker.setMap(map);
}
um pouco tarde, mas consegui ter apenas uma janela de informações aberta por maken infowindow uma variável global.
var infowindow = new google.maps.InfoWindow({});
então dentro do listner
infowindow.close();
infowindow = new google.maps.InfoWindow({
content: '<h1>'+arrondissement+'</h1>'+ gemeentesFiltered
});
infowindow.open(map, this);
Declare um globar var selectedInfoWindow;
e use-o para manter a janela de informações aberta:
var infoWindow = new google.maps.InfoWindow({
content: content
});
// Open the infowindow on marker click
google.maps.event.addListener(marker, "click", function() {
//Check if there some info window selected and if is opened then close it
if (selectedInfoWindow != null && selectedInfoWindow.getMap() != null) {
selectedInfoWindow.close();
//If the clicked window is the selected window, deselect it and return
if (selectedInfoWindow == infoWindow) {
selectedInfoWindow = null;
return;
}
}
//If arrive here, that mean you should open the new info window
//because is different from the selected
selectedInfoWindow = infoWindow;
selectedInfoWindow.open(map, marker);
});
Você precisa manter o controle de seu objeto InfoWindow anterior e chamar o método close nele ao manipular o evento click em um novo marcador .
NB: não é necessário chamar close no objeto da janela de informações compartilhada, chamar open com um marcador diferente fechará automaticamente o original. Veja a resposta de Daniel para detalhes.
close()
método, se um único InfoWindow
objeto for usado. Ele será fechado automaticamente se o open()
método for chamado novamente no mesmo objeto.
Basicamente, você deseja uma função que mantenha referência a um new InfoBox()
=> delegar o evento onclick. Ao criar seus marcadores (em um loop), usebindInfoBox(xhr, map, marker);
// @param(project): xhr : data for infoBox template
// @param(map): object : google.maps.map
// @param(marker): object : google.maps.marker
bindInfoBox: (function () {
var options = $.extend({}, cfg.infoBoxOptions, { pixelOffset: new google.maps.Size(-450, -30) }),
infoBox = new window.InfoBox(options);
return function (project, map, marker) {
var tpl = renderTemplate(project, cfg.infoBoxTpl); // similar to Mustache, Handlebars
google.maps.event.addListener(marker, 'click', function () {
infoBox.setContent(tpl);
infoBox.open(map, marker);
});
};
}())
var infoBox
é atribuído de forma assíncrona e mantido na memória. Cada vez que você chamar, bindInfoBox()
a função de retorno será chamada. Também útil para passar infoBoxOptions
apenas uma vez!
No meu exemplo, tive que adicionar um parâmetro extra ao, map
pois minha inicialização é atrasada por eventos de guia.
Aqui está uma solução que não precisa criar apenas uma infoWindow para reutilizá-la. Você pode continuar criando muitas infoWindows, a única coisa que você precisa é construir uma função closeAllInfoWindows e chamá-la antes de abrir uma nova janela de informações. Portanto, mantendo seu código, você só precisa:
Crie uma matriz global para armazenar todas as infoWindows
var infoWindows = [];
Armazene cada nova infoWindow na matriz, logo após a infoWindow = new ...
infoWindows.push(infoWindow);
Crie a função closeAllInfoWindows
function closeAllInfoWindows() {
for (var i=0;i<infoWindows.length;i++) {
infoWindows[i].close();
}
}
Em seu código, chame para closeAllInfoWindows () antes de abrir o infoWindow.
Saudações,
Resolvido desta forma:
function window(content){
google.maps.event.addListener(marker,'click', (function(){
infowindow.close();
infowindow = new google.maps.InfoWindow({
content: content
});
infowindow.open(map, this);
}))
}
window(contentHtml);
O Google Maps permite que você tenha apenas uma janela de informações aberta. Portanto, se você abrir uma nova janela, a outra será fechada automaticamente.