Закрытие любых открытых информационных окон в google maps api v3 - PullRequest
28 голосов
/ 03 июня 2010

Как гласит заголовок, в данном событии (для меня это происходит при открытии нового google.maps.InfoWindow. Я хочу иметь возможность закрыть любые другие в настоящее время открытые информационные окна. Прямо сейчас я могу открыть много одновременно ..но я хочу только 1 открыть за раз.

Я создаю информационные окна динамически (т.е. я не знаю заранее, сколько будет сгенерировано), поэтому в событии click текущего информационного окна (именно там я хочу, чтобы все остальные открытые окна были закрыты) У меня нет ссылки на другие открытые информационные окна для вызова close(). Мне интересно, как я могу этого достичь. Я не опытный программист JavaScript, поэтому я не знаю, нужно ли мне использовать рефлексию или что-то подобное здесь.

Лучше всего было бы просто сохранить все ссылки в какой-то коллекции, а затем перебрать список, закрыв их все?

Спасибо.

Ответы [ 6 ]

64 голосов
/ 03 июня 2010

Я столкнулся с той же проблемой и исправил ее, создав глобальное информационное окно.

var infowindow = new google.maps.InfoWindow();

Тогда у меня есть функция для выполнения следующих действий при прослушивании щелчка:

function getInfoWindowEvent(marker) {
    infowindow.close()
    infowindow.setContent("This is where my HTML content goes.");
    infowindow.open(map, marker);
}

Это позволяет добиться того, что, как мне кажется, вы ищете, потому что теперь на карте есть только одно информационное окно, и я просто закрываю его, перезагружаю содержимое и снова открываю для данного маркера.

8 голосов
/ 05 августа 2010

Достаточно иметь глобальное информационное окно, а затем изменить положение и содержимое этого информационного окна.

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"
  });
}

Поскольку одно и то же информационное окно используется каждый раз, вы гарантированно имеете только одно открытое окно, и оно использует меньше ресурсов / памяти, чем при создании и последующем уничтожении нескольких информационных окон.

2 голосов
/ 12 сентября 2012

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

1 голос
/ 30 января 2017

Вам нужна всего одна строка: $(".gm-style-iw").next().click();

Внутри информационного окна есть div с этим классом gm-style-iw. После, есть div кнопки закрытия. Таким образом, этот код будет нажимать каждую кнопку закрытия информационного окна, существующую на карте

1 голос
/ 02 июля 2014

Я решил создать массив всех динамически создаваемых инфобоксов. Когда вы щелкаете по любому первому перемещению массива, а затем закрываете все, открывается только тот, в котором вы щелкнули.

var allInfos = [];

function closeInfos() {
        for (i = 0; i < allInfos.length; i++) {
            allInfos[i].close();
        }
}

После создания инфобокса вы динамически добавляете его в массив следующим образом:

allInfos.push(infowindow);
0 голосов
/ 07 сентября 2012

Я думаю, что лучший способ сделать это ... иметь объект с информационными окнами, которые вы открыли

У меня есть два объекта, информация содержит все информационные окна, а маркеры содержат все маркеры с этими окнами так что я просто выполняю эти функции, которые зацикливают объект infowindow и закрывают все информационные окна

function CloseInfowindows() {
  for (var mkey in infos) {
    var mobj = markers[mkey];
    mobj.infowindow.close();
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...