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?
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 :Portanto, você pode simplesmente criar o
InfoWindow
objeto logo após inicializar seu mapa e, em seguida, manipular osclick
manipuladores de eventos de seus marcadores da seguinte maneira. Digamos que você tenha um marcador chamadosomeMarker
: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 oclose()
método.fonte
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); }); }
fonte
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); }
fonte
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);
fonte
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); });
fonte
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.
fonte
close()
método, se um únicoInfoWindow
objeto for usado. Ele será fechado automaticamente se oopen()
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 passarinfoBoxOptions
apenas uma vez!No meu exemplo, tive que adicionar um parâmetro extra ao,
map
pois minha inicialização é atrasada por eventos de guia.InfoBoxOptions
fonte
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 ...
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,
fonte
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);
fonte
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.
fonte