Ta strona używa ciasteczek (cookies), dzięki którym nasz serwis może działać lepiej. Dowiedz się więcej OK, rozumiem

[js] problem z google maps i funkcjami anonimowymi

Tworzenie dynamicznych stron internetowych z zastosowaniem JavaScript, jQuery, Ajax. Dowiedz się jak to zrobić, znajdź rozwiązania swoich problemów.

[js] problem z google maps i funkcjami anonimowymi

Post 01.08.2009, 23:10:20

Problem wygląda tak.

Pobieram sobie jakiś plik z danymi w XML i przetwarzam go następującym skryptem.

Kod: Zaznacz cały
var xml = GXml.parse(dane); 
   var markery = xml.documentElement.getElementsByTagName('marker'); 
   for(var i=0; i<markery.length; i++) 
   { 
      var GX = parseFloat(markery[i].getAttribute("GX")); 
      var GY = parseFloat(markery[i].getAttribute("GY")); 
      var name = markery[i].getAttribute("name"); 
      var punkt = new GLatLng(GY,GX);
      var marker = new GMarker(punkt);
      map.addOverlay(marker);
      GEvent.addListener(marker,"click", function() {  map.openInfoWindowHtml(punkt,message);});

    }


Ten kawałek kodu robi to co do niego należy czyli wyświetla wszystkie markery:

Kod: Zaznacz cały
 var marker = new GMarker(punkt);
      map.addOverlay(marker);


Poniżej jest linijka, która korzystając z tych samych danych, powinna spowodować wyświetlenie dymka z nazwą dla klikniętego dymka.

Kod: Zaznacz cały
      GEvent.addListener(marker,"click", function() {  map.openInfoWindowHtml(punkt,message);});


Tyle tylko, że niezależnie od tego, który znacznik zostanie zostanie kliknięty, dymek pojawia się nad ostatnim dodanym i pokazuje jego nazwę.

Jak rozwiązać taki problem?

pozdrawiam
silgar
Posty: 62
Dołączył(a): 25.05.2008

Post 01.08.2009, 23:47:44

Zamień linię
Kod: Zaznacz cały
GEvent.addListener(marker,"click", function() {  map.openInfoWindowHtml(punkt,message);});

na
Kod: Zaznacz cały
GEvent.addListener(marker,"click", (function(p, m){return function() {  map.openInfoWindowHtml(p,m);}})(punkt, message));
Avatar użytkownikakuku
Rafał Kukawski

+∞
+∞

Posty: 19767
Dołączył(a): 14.04.2002

Post 02.08.2009, 00:20:55

<wow> zrozumienie co tam się dzieje zajmie mi chyba trochę czasu ale bez wątpienia działa.

Dziękuję bardzo.
silgar
Posty: 62
Dołączył(a): 25.05.2008

Post 02.08.2009, 09:00:22

Cały Twój błąd polegał na tym, że odwoływałeś się do zmiennych punkt i message, których wartość zmieniałeś w pętli. Zdarzenia wykonywane są "gdzieś tam w przyszłości", więc odwołają się do zmiennej, której ostateczną wartość ustalił ostatni przebieg pętli for. Co ja zrobiłem, to zadeklarowałem i od razu wykonałem anonimową funkcję, do której przekazałem aktualne wartości tych zmiennych. Z tych właśnie zmiennych korzysta funkcja zwrócona przez tę anonimową funkcję (a zwrócona zostaje funkcja function(){ map.openInfoWindowHtml(p,m)}). Teraz powinno być jasne. Ogólnie, wystarczy poszukać w sieci info o scope i closures.
Avatar użytkownikakuku
Rafał Kukawski

+∞
+∞

Posty: 19767
Dołączył(a): 14.04.2002


Powrót do JavaScript


 


  • Podobne wątki
    Odpowiedzi
    Wyświetlone
    Ostatni post

Kto przegląda forum

Użytkownicy przeglądający ten dział: Yandex [Bot] i 1 gość

Hosting, Domeny, SSL

Subskrypcja

Mamy 51441 zarejestrowanych użytkowników.
Najnowszy użytkownik: jonman65


Nasi użytkownicy napisali:

  • 937731 wiadomości
  • w 247447 tematach

Najnowsze wpisy na blogu

Najnowsze artykuły

Najaktywniejsi (ostatnie 30 dni)