Google Maps infowindow.setContent как элемент DOM с jQuery, кажется, работает только один раз? - PullRequest
8 голосов
/ 14 марта 2012

Я очень расстроен и надеюсь, что кто-то здесь может помочь. У меня есть приложение для карт, где на картах есть несколько маркеров с информационными окнами, содержание которых регулярно обновляется. Мое решение состояло в том, чтобы поместить элементы div, которые войдут в информационное окно в DOM, в скрытый контейнер, который может обновляться моим кодом обновления в фоновом режиме. Затем я использую одно информационное окно и просто устанавливаю содержимое для элемента DOM, используя запрос:

google.maps.event.addListener(marker, 'click', function(){
     infoWindow.setContent($(#"+id+"-window-content)[0]);
     infoWindow.open(map, marker);
}

Это прекрасно работает ... один раз. Тогда он не откроется снова для этого производителя. Я заметил, что если я открою окно на одном маркере (Маркер A), а затем закрою его, а затем открою на другом маркере (Маркер B), а затем вернусь к Маркеру A, окно появится рядом с Маркер A , но с содержанием маркера B.

Почему мой сценарий не устанавливает содержимое элемента DOM во второй раз ... Это почти как использование селектора jQuery для удаления элемента из DOM.

Приветствия

whiteatom


Привет еще раз,

Оказывается, я мог ответить на свой вопрос, когда пытался объяснить его здесь.

Передача элемента DOM в функцию setContent (), кажется, фактически удаляет его из DOM и помещает в infoWindow, поэтому в следующий раз, когда я попытаюсь его схватить, его больше нет. Я решил добавить clone () к вызову jQuery, и теперь он работает.

google.maps.event.addListener(marker, 'click', function(){
     infoWindow.setContent($(#"+id+"-window-content).clone()[0]);
     infoWindow.open(map, marker);
}

Может ли кто-нибудь подтвердить, что это поведение setContent, когда ему передается элемент DOM? это лучший способ справиться с этим?

Приветствия

whiteatom

Ответы [ 2 ]

6 голосов
/ 14 марта 2012

При изменении родительского элемента в DOM элемент перемещается, а не копируется.

Так что я бы взял эту строку ...

infoWindow.setContent($(#"+id+"-window-content)[0]);

Удалит элемент "# id-window-content" из исходного расположения.

Когда окно infoWindow закрыто, элемент DOM в нем отбрасывается.

Поэтому, когда вы нажимаете маркер второй раз, элемент больше не существует.

Попробуйте клонировать элемент или предоставить строку HTML в информационное окно.

Надеюсь, это поможет

2 голосов
/ 15 марта 2012

Это на самом деле стало более сложным, потому что у меня были вкладки (с jQuery Tools) в infoWindows, и клон (даже с глубокой копией событий и данных - клон (правда, правда)), казалось, не хотел переносить их... вкладки в окне infoWindow были неактивны.

Итак ... Я перемещаю div в том виде, в котором он был изначально, а затем возвращаю его обратно, прежде чем добавить новое содержимое infoWindow:

google.maps.event.addListener(marker, 'click', function(){
     infoWindow.close();
     if(typeof infoWindow.content == "object")
         $("#info-window-container").append(infoWindow.getContent());
     infoWindow.setContent($(#"+id+"-window-content)[0]);
     infoWindow.open(map, marker);
}

Я думаю, что это также имеет то преимущество, что мой скрипт обновлений может просто обновить # "+ id +" - div window-content, и он даже обновит информационное окно при открытом:)

Спасибо за вашу помощь...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...