API Google, geocoder location poza funkcją

0

Witam serdecznie !
Zerknijcie na kod:

var locations = [];
function codeAddress() {
	
	tab[0]="Aleksandrów Kujawski, słowackiego 12";
	tab[1]="Aleksandrów Kujawski, spółdzielcza 2a";
	tab[2]="Aleksandrów Kujawski, fredry 17";
	
	for(i=0;i<3;i++){
		geocoder.geocode( { 'address': tab[i]}, function(results, status) 
		{
			  if (status == google.maps.GeocoderStatus.OK) 
			  {
				  map.setCenter(results[0].geometry.location);
				  locations.push(results[0].geometry.location);
			  } 
			  else 
			  {
			    alert('Geocode was not successful for the following reason: ' + status);
			  }
		});
	}
    addMarkersToMap();
}
  
function addMarkersToMap(){
	 
	  
	var dymek = new google.maps.InfoWindow();  
	var tab_text = [];
	
	tab_text[0] = "Przykładowy tekst";
	tab_text[1] = "Przykładowy tekst 2";
        tab_text[2] = "Przykładowy tekst 3";

  for(a=0;a<locations.length;a++)
  {
	  var marker = new google.maps.Marker({
	      map: map,
	      position: locations[a]
	  });
  
	  marker.txt=tab_text[a];
	  google.maps.event.addListener(marker,"click",function()
	  	    {
	  	        dymek.setContent(marker.txt);
	  	        dymek.open(map,marker);
	  	    });
	  
	  google.maps.event.trigger(marker,'click');
  }
}

Pytanie brzmi czy mogę zobaczyć tablicę locations w funkcji addMarkerToMap() ? ? Jeśli tak to jak??
Wcześniej dodawanie markerów na mapę wyglądało tak:

function codeAddress() {
	
	tab[0]="Aleksandrów Kujawski, słowackiego 12";
	tab[1]="Aleksandrów Kujawski, spółdzielcza 2a";
	tab[2]="Aleksandrów Kujawski, fredry 17";
	
	var dymek = new google.maps.InfoWindow();  
	var tab_text = [];
	
	tab_text[0] = "Przykładowy tekst";
	tab_text[1] = "Przykładowy tekst 2";
        tab_text[2] = "Przykładowy tekst 3";
	
	for(i=0;i<3;i++){
		geocoder.geocode( { 'address': tab[i]}, function(results, status) 
		{
			  if (status == google.maps.GeocoderStatus.OK) 
			  {
				  map.setCenter(results[0].geometry.location);
				  
				  var marker = new google.maps.Marker({
				      map: map,
				      position: results[0].geometry.location
				  });
			  
				  marker.txt=tab_text[i];
				  google.maps.event.addListener(marker,"click",function()
				  	    {
				  	        dymek.setContent(marker.txt);
				  	        dymek.open(map,marker);
				  	    });
				  
				  google.maps.event.trigger(marker,'click');
			  } 
			  else 
			  {
			    alert('Geocode was not successful for the following reason: ' + status);
			  }
		});
	}
    addMarkersToMap();
}

Markery dodaje prawidłowo, ale nie mogę dodawać do nich etykiety w postaci chmurki, która jest w tablicy tab_text, ponieważ wewnątrz geocoder function nie widzi " i " i nie mogę chodzić po tablicy tab_text.

Widzicie jakieś inne rozwiązanie problemu lub wiecie jak poprawić mój kod?
Pozdrawiam Nieznasz

1

"zobaczyć" zmienną możesz przy pomocy console.log (więcej w Google, ja tylko naprowadzam).

"niedziałające i" opisałem dzisiaj tutaj: http://4programmers.net/Forum/Newbie/158252-wytlumaczenie_gdzie_jest_blad_w_petli

0

Działa :D ! kurde niesamowita sprawa :P dzięki nauczyłeś mnie czegoś

A wracając do tablicy locations, jak mogę stworzyć do niej dostęp z zewnątrz funkcji? Dodaje mi chmurkę tylko do ostatniego markera, jeszcze nie wiem czemu

0

@nieznasz: wyjaśnienie:

var stare_i = 666;

dupa = function(nowe_i) {
  alert(nowe_i);
};

dupa(stare_i);

W mojej funkcji dupa pierwszy parametr nazywa się nowe_i. ale w wywołaniu tej funkcji używam sobie innej zmiennej - stare_i. I to jest normalne.

W moim przykładzie tworzę funkcje anonimową I OD RAZU JĄ WYKONUJĘ.

(function(){ alert('test'); }) // funkcja anonimowa otoczona nawiasem

(function(){ alert('test'); })() // wywołanie tej funkcji bez parametrów

(function(nowe_i){ alert(nowe_i); })(stare_i); // przekazuję TAK JAK NORMALNEJ FUNKCJI `stare_i`, ale ta funkcja definiuje sobie parametr jako `nowe_i`

Czy mogę mieć dostęp do tablicy locations w funkcji AddMarkerToMap()

Tak. Zdefinowałeś ją na zewnątrz, więc powinna być normalnie widoczna. Z tym, że geocoder.geocode działa asynchronicznie zapewne. (szukaj w Google "asynchroniczność" - jak miałeś do czynienia z ajaxem to wiesz o co chodzi). a więc dodajesz do kolejki sprawdzenie adresów, to się robi "w tle", ale funkcja codeAddress WYKONUJE SIĘ DALEJ. A więc wykonuje ona addMarkersToMap, które czyta locations, ale tam jest pusto, ponieważ nie ma jeszcze odpowiedzi na geolokalizację!

0

Mam problem z wyświetleniem wszystkich chmurek. Za każdym razem wyświetla tylko ostatnią. Problem polega na tym, że dymek.open(map,maker); otwiera dymek dla ostatniego stworzonego markera. Napisałem takie rozwiązanie (zdaje sobie sprawę z niepoprawności logicznej kodu) chciałem sprawdzić czy wyświetli wszystkie dymki, jednak nadal wyświetla tylko jeden. Pomimo tego, że skoro leci po tablicy Makers to powinien dodawać dymek.open(map,makers[z]), do każdego markera pokolei to tego nie robi. Nie mogę znaleźć rozwiązania na internecie, nie chcę zakładać nowego tematu(jeśli powinienem to przepraszam).
O to kod:

function codeAddress() {
	 
	var dymek = new google.maps.InfoWindow();  
	
	var tab_text = [];
	tab_text[0] = "aaaa";
	tab_text[1] = "avvvva";
	tab_text[2] = "avvvvaaa";
	var markers = [];
	
    tab[0]="Aleksandrów Kujawski, słowackiego 12";
    tab[1]="Aleksandrów Kujawski, spółdzielcza 2a";
    tab[2]="Aleksandrów Kujawski, fredry 17";
    
    for(i=0;i<3;i++){
    	 (function(moje_i){
    	geocoder.geocode( { 'address': tab[moje_i]}, function(results, status) {
    	 if (status == google.maps.GeocoderStatus.OK) 
         {
             map.setCenter(results[0].geometry.location);

             var marker = new google.maps.Marker({
                 map: map,
                 position: results[0].geometry.location
             });
             
             marker.txt=tab_text[moje_i];
             
             markers.push(marker);
             for(z=0;z<3;z++)
             {
             	dymek.setContent("aa");
                dymek.open(map,markers[z]);
             }
             
         } 
    	else {
        alert('Geocode was not successful for the following reason: ' + status);
      }
    });
    	 })(i);
    }  
}
1

Ale ty sam tworzysz JEDEN dymek, potem, ustawiasz mu zawartość, pokazujesz ten dymek, zmieniasz mu zawartość, próbujesz pokazać ten sam dymek, znowu zmieniasz zawartość i ostatecznie po raz kolejny próbujesz pokazać ten sam dymek. Chcesz mieć 3 dymki to sobie 3 dymki utwórz ;)

Druga rzecz: Twoje IDE nie ma jakiegoś formatowania kodu? Uporządkuj ten bałagan PRZED wklejaniem na forum następnym razem. Patrz jak ładnie i czytelnie:

function codeAddress() {

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

    var tab_text = [];
    tab_text[0] = "aaaa";
    tab_text[1] = "avvvva";
    tab_text[2] = "avvvvaaa";
    var markers = [];

    tab[0]="Aleksandrów Kujawski, słowackiego 12";
    tab[1]="Aleksandrów Kujawski, spółdzielcza 2a";
    tab[2]="Aleksandrów Kujawski, fredry 17";

    for(i=0;i<3;i++){
        (function(moje_i){
            geocoder.geocode( { 'address': tab[moje_i]}, function(results, status) {
                if (status == google.maps.GeocoderStatus.OK)
                {
                    map.setCenter(results[0].geometry.location);

                    var marker = new google.maps.Marker({
                        map: map,
                        position: results[0].geometry.location
                    });

                    marker.txt=tab_text[moje_i];

                    markers.push(marker);
                    for(z=0;z<3;z++)
                    {
                        dymek.setContent("aa");
                        dymek.open(map,markers[z]);
                    }

                }
                else {
                    alert('Geocode was not successful for the following reason: ' + status);
                }
            });
        })(i);
    }
}
0

Ahhh racja źle to przeanalizowałem. Co do kodu też racja trochę burdel już to ogarniam :P
Poprawiłem działa, wyświetla wszystkie chmurki.
Dzięki Dzek !

1 użytkowników online, w tym zalogowanych: 0, gości: 1