Мне нужно, чтобы на моей карте Google было открыто только одно окно InfoWindow. Мне нужно закрыть все остальные информационные окна, прежде чем открывать новое.
Может кто-нибудь показать мне, как это сделать?
Мне нужно, чтобы на моей карте Google было открыто только одно окно InfoWindow. Мне нужно закрыть все остальные информационные окна, прежде чем открывать новое.
Может кто-нибудь показать мне, как это сделать?
Ответы:
Вам нужно создать только один
InfoWindow
объект, сохранить ссылку на него и повторно использовать его для всех маркеров. Цитата из Документов Google Maps API :Следовательно, вы можете просто создать
InfoWindow
объект сразу после инициализации карты, а затем обработатьclick
обработчики событий ваших маркеров следующим образом. Допустим, у вас есть маркер под названиемsomeMarker
:google.maps.event.addListener(someMarker, 'click', function() { infowindow.setContent('Hello World'); infowindow.open(map, this); });
Затем он
InfoWindow
должен автоматически закрываться, когда вы нажимаете на новый маркер, без необходимости вызыватьclose()
метод.источник
Создайте свое информационное окно вне области видимости, чтобы вы могли поделиться им.
Вот простой пример:
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); }); }
источник
У меня была та же проблема, но лучший ответ не решил ее полностью, что мне нужно было сделать в моем операторе for, так это использовать this, относящийся к моему текущему маркеру. Может это кому-то поможет.
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); }
источник
Немного поздно, но мне удалось открыть только одно информационное окно, сделав infowindow глобальной переменной.
var infowindow = new google.maps.InfoWindow({});
затем внутри списка
infowindow.close(); infowindow = new google.maps.InfoWindow({ content: '<h1>'+arrondissement+'</h1>'+ gemeentesFiltered }); infowindow.open(map, this);
источник
Объявите глобар
var selectedInfoWindow;
и используйте его для удержания открытого информационного окна: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); });
источник
Вам необходимо отслеживать ваш предыдущий объект InfoWindow
и вызывать для него метод close при обработке события щелчка на новом маркере.NB Нет необходимости вызывать close для объекта общего информационного окна, вызов open с другим маркером автоматически закроет оригинал. Подробнее см . Ответ Даниила .
источник
close()
метод, если используется одинInfoWindow
объект. Он закроется автоматически, еслиopen()
метод снова будет вызван для того же объекта.По сути, вам нужна одна функция, которая хранит ссылку на one
new InfoBox()
=> делегирует событие onclick. При создании маркеров (в цикле) используйтеbindInfoBox(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
назначается асинхронно и сохраняется в памяти. Каждый раз, когда вы вызываетеbindInfoBox()
функцию возврата, будет вызываться вместо нее. Также удобно пройтиinfoBoxOptions
только один раз!В моем примере мне пришлось добавить дополнительный параметр в,
map
поскольку моя инициализация задерживается событиями вкладки.InfoBoxOptions
источник
Вот решение, которому не нужно создавать только одно информационное окно для его повторного использования. Вы можете продолжить создание множества информационных окон, единственное, что вам нужно, это создать функцию closeAllInfoWindows и вызвать ее перед открытием нового информационного окна. Итак, сохраняя свой код, вам просто нужно:
Создайте глобальный массив для хранения всей информации Windows
var infoWindows = [];
Сохраняйте каждое новое окно infoWindow в массиве сразу после infoWindow = new ...
Создайте функцию closeAllInfoWindows
function closeAllInfoWindows() { for (var i=0;i<infoWindows.length;i++) { infoWindows[i].close(); } }
В своем коде вызовите closeAllInfoWindows () непосредственно перед открытием окна infoWindow.
С Уважением,
источник
Решил это так:
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);
источник
Карты Google позволяют открывать только одно информационное окно. Итак, если вы откроете новое окно, другое закроется автоматически.
источник