Подтвердить что ты не робот

Закрытие любых открытых информационных окон в Google Maps api v3

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

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

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

Спасибо.

4b9b3361

Ответ 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();
  }
}