Закрытие любых открытых информационных окон в Google Maps api v3
Как указано в заголовке, на данном событии (для меня это происходит при открытии нового google.maps.InfoWindow
, который я хочу, чтобы закрыть любые другие открытые в настоящее время информационные окна. Сейчас я могу открывать множество одновременно.. но я хочу только 1 открытую за раз.
Я создаю информационные окна динамически (т.е. заранее не знаю, сколько будет сгенерировано), поэтому в событии click текущего информационного окна (где я хочу, чтобы все остальные открытые закрывались) У меня нет ссылки на другие открытые информационные окна, на которые вызывается close()
. Мне интересно, как я могу это достичь. Я не опытный программист JavaScript, поэтому я не знаю, нужно ли мне использовать отражение или что-то подобное здесь.
Будет ли лучший способ просто сохранить все ссылки в какой-то коллекции, а затем просмотреть список, закрывающий их все?
Спасибо.
Ответы
Ответ 1
Я столкнулся с той же проблемой и исправил ее, создав глобальное информационное окно.
var infowindow = new google.maps.InfoWindow();
Тогда у меня есть функция, чтобы сделать следующее в прослушивателе кликов:
function getInfoWindowEvent(marker) {
infowindow.close()
infowindow.setContent("This is where my HTML content goes.");
infowindow.open(map, marker);
}
Это обеспечивает то, что я думаю, что вы ищете b/c, теперь на карте есть только одно информационное окно, и я просто закрываю его, перезагружаю содержимое и снова открываю его для данного маркера.
Ответ 2
Достаточно иметь глобальное значение, а затем изменить положение и содержимое этого информационного окна.
var infowindow = new google.maps.InfoWindow();
// Call this function to open an infowindow i.e. on click.
function respondToClick(latlng) {
infowindow.setOptions({
position: latlng,
content" "Hello, world"
});
}
Поскольку каждый раз используется одно и то же значение, вы гарантируете, что только когда-либо открываете его, и он использует меньше ресурсов/памяти, чем создание, а затем уничтожает несколько infowindows.
Ответ 3
infowindow - это локальная переменная, и окно недоступно в момент закрыть()
var latlng = new google.maps.LatLng(-34.397, 150.644); var infowindow
= null;
...
google.maps.event.addListener(marker, 'click', function() {
if (infowindow) {
infowindow.close();
}
infowindow = new google.maps.InfoWindow();
... });
...
REF: Закрыть все инфо-окна в API Карт Google v3
Ответ 4
Я решил создать массив всех динамически созданных Infobox. Когда вы нажимаете на любое первое перемещение массива, а затем вы закрываете все открытые только те, в которых вы нажали.
var allInfos = [];
function closeInfos() {
for (i = 0; i < allInfos.length; i++) {
allInfos[i].close();
}
}
После создания инфобокса динамически добавьте его в массив следующим образом:
allInfos.push(infowindow);
Ответ 5
Вам нужна только одна строка:
$(".gm-style-iw").next().click();
Там находится div с этим классом, 'gm-style-iw', внутри infowindow. После этого есть div кнопки закрытия. Таким образом, этот код щелкнет каждую кнопку закрытия инфо-окна, существующую на карте
Ответ 6
Лучший способ сделать это, я думаю... имеет объект с открытыми вами инфо-окнами
У меня есть два объекта,
infos имеют все созданные инфо-окна, а маркеры содержат все маркеры с инфо-окнами
поэтому я просто выполняю эти функции, которые зацикливают объект infowindow и закрывают все infowindows
function CloseInfowindows() {
for (var mkey in infos) {
var mobj = markers[mkey];
mobj.infowindow.close();
}
}