Закрытие любых открытых информационных окон в 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();
     ... });
...

REF: закрыть все информационные окна в Google Maps API v3

Вам нужна только одна строка:$(".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();
  }
}
Другие вопросы по тегам