Закрытие любых открытых информационных окон в google maps api v3
Как гласит заголовок, на данном событии (для меня это происходит при открытии нового google.maps.InfoWindow
Я хочу иметь возможность закрыть любые другие открытые в настоящее время информационные окна. Прямо сейчас я могу открыть много одновременно... но я хочу только одно открытие одновременно.
Я создаю информационные окна динамически (т.е. я не знаю заранее, сколько будет сгенерировано), поэтому в событии щелчка текущего информационного окна (именно там я хочу закрыть все остальные открытые окна) я не не может иметь ссылку на любое другое открытое информационное окно close()
, Мне интересно, как я могу этого достичь. Я не опытный программист JavaScript, поэтому я не знаю, нужно ли мне использовать рефлексию или что-то подобное здесь.
Будет ли лучший способ просто сохранить все ссылки в какой-то коллекции, а затем перебрать список, закрыв их все?
Благодарю.
6 ответов
Я столкнулся с той же проблемой и исправил ее, создав глобальное информационное окно.
var infowindow = new google.maps.InfoWindow();
Затем у меня есть функция, чтобы сделать следующее на прослушивателе кликов:
function getInfoWindowEvent(marker) {
infowindow.close()
infowindow.setContent("This is where my HTML content goes.");
infowindow.open(map, marker);
}
Это позволяет добиться того, что вы ищете, потому что теперь на карте есть только одно информационное окно, и я просто закрываю его, перезагружаю содержимое и снова открываю для данного маркера.
Достаточно иметь глобальное информационное окно, а затем изменить положение и содержимое этого информационного окна.
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"
});
}
Поскольку одно и то же информационное окно используется каждый раз, вы гарантированно будете иметь только одно открытое окно, и оно использует меньше ресурсов / памяти, чем при создании и последующем уничтожении нескольких информационных окон.
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();
... });
...
Вам нужна только одна строка:$(".gm-style-iw").next().click();
Внутри информационного окна есть div с этим классом gm-style-iw. После, есть div кнопки закрытия. Таким образом, этот код будет нажимать каждую кнопку закрытия информационного окна, существующую на карте
Я решил создать массив всех динамически создаваемых инфобоксов. Когда вы щелкаете по любому первому перемещению массива, а затем закрываете все, открывается только тот, в котором вы щелкнули.
var allInfos = [];
function closeInfos() {
for (i = 0; i < allInfos.length; i++) {
allInfos[i].close();
}
}
Создав инфобокс, вы динамически добавляете его в массив следующим образом:
allInfos.push(infowindow);
Я думаю, что лучший способ сделать это - иметь объект с открытыми вами информационными окнами
У меня есть два объекта, в инфо есть все созданные информационные окна, а маркеры содержат все маркеры вместе с информационными окнами, поэтому я просто выполняю эти функции, которые зацикливают объект информационного окна и закрывают все информационные окна.
function CloseInfowindows() {
for (var mkey in infos) {
var mobj = markers[mkey];
mobj.infowindow.close();
}
}