2012-03-14 12 views
8

Jestem bardzo sfrustrowany i mam nadzieję, że ktoś tu może pomóc. Mam aplikację do map, na której znajduje się kilka znaczników na mapach z systemem InfoWindows, którego zawartość jest regularnie aktualizowana. Moim rozwiązaniem było umieszczenie elementów div, które znajdą się w infoWindow w DOM w ukrytym kontenerze, który może być aktualizowany przez mój kod aktualizatora w tle. Potem użyć pojedynczego infoWindow i po prostu ustawić zawartość do elementu DOM przy użyciu zapytania:Google Maps infowindow.setContent jako element DOM z jQuery wydaje się działać tylko raz?

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

Rzecz działa świetnie ... raz. Wtedy nie otworzy się ponownie dla tego twórcy. Zauważyłem, że jeśli otworzę okno na jednym markerze (Marker A), a następnie go zamknę, a następnie otworzę na innym ekspresie (Marker B), a następnie powrócę do Markera A, pojawi się okno obok Markera A , ale z zawartością Markera B.

Dlaczego mój skrypt nie ustawi treści do elementu DOM po raz drugi ... To prawie tak, jakby użyć selektora jQuery do usunięcia elementu z DOM.

Cheers,

whiteatom


Witam ponownie,

okazuje mogę odpowiedziałeś na moje własne pytanie, kiedy starałem się to wyjaśnić tutaj.

Przekazanie elementu DOM do funkcji setContent() wydaje się faktycznie usunąć go z DOM i umieścić w oknie InfoWindow, więc następnym razem, gdy spróbuję go pobrać, już go nie ma. Moją poprawką było dodanie clone() do wywołania jQuery i wygląda na to, że działa teraz.

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

Czy ktoś może potwierdzić, że jest to zachowanie setContent, gdy element DOM jest przekazywany do niego? czy to najlepszy sposób, aby sobie z tym poradzić?

Cheers,

whiteatom

Odpowiedz

6

Po zmianie rodzica danego elementu w DOM, element zostanie przeniesiony, a nie skopiowany.

Więc chciałbym przyjąć tę linię ...

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

usunie elementu "# id-window-content" z oryginalnego umiejscowienie.

Po zamknięciu okna infoWindow, element DOM w nim jest odrzucany.

Po kliknięciu po raz drugi znacznika element już nie istnieje.

Spróbuj sklonować element lub podać ciąg znaków HTML do usługi infoWindow.

Nadzieja to pomaga

+0

tak :) to jest dokładnie to, co widziałem. Klonuję teraz. Dzięki! – whiteatom

+0

Cieszę się, że to naprawiłeś! Szczęśliwe mapowanie :) –

2

To rzeczywiście dostał bardziej skomplikowana, ponieważ miałem klapki (z jQuery Tools) w infoWindows i klon (nawet z głębokim kopii zdarzeń i danych - klon (true, true)) nie zrobił” wydaje się, że chcą je nosić ... karty były martwe w infoWindow.

So ..Ja ruszam div jak pierwotnie, a następnie przeniesienie go z powrotem, zanim dodam nową zawartość 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); 
} 

myślę, że to ma również tę zaletę, że pozwala mój skrypt updater po prostu zaktualizować # "+ id + „div -window-content i to nawet zaktualizować infoWindow natomiast otwarte :)

Dzięki za pomoc ...

+0

Dzięki za udostępnienie ostatecznego rozwiązania na podstawie mojej odpowiedzi! –

+0

Wow, dziękuję, nie spodziewałem się, że wywołanie 'getContent()' po pracy 'infoWindow.close()' będzie działać. Spodziewałem się, że rzeczy zostaną usunięte z DOM po close(). Ale widocznie to działa! – lulalala

+0

Tak .. infoWindow przechowuje zawartość, dopóki go nie zniszczysz lub nie ustawi nowej zawartości - zorientował się, że jeden z nich z próbą i błędem. – whiteatom

Powiązane problemy