madblueshippe: Variablen an Callbackfunktionen weitergeben Maps API

Moin,

ich scheitere gerade an folgendem Problem und sehe einfach den Fehler nicht.
Ist bestimmt ein generelles Verständnis Problem aber ich komm einfach nicht drauf:

Ich habe ein Array von Adressen die ich gerne geocodieren möchte um auf einer Google Maps Karte ein paar Marker zu setzen. Das klappt auch ohne Probleme.
Dann möchte ich, hier scheitert es, jedem Marker eine Click-Funktion zuweisen die einen scrollbaren Div zu einem bestimmten Element scrollen lässt.
Jedes Element hat eine ID über die ich die Scrollfunktion ansprechen möchte.

Hier mal der Code:

  
function placeMarkers(addresses, map, id)  
{  
	geocoder = new google.maps.Geocoder();  
		  
	if (geocoder) {  
		  
		for ( var i = 0; i < addresses.length; i++ )  
		{	  
			geocoder.geocode( { 'address': addresses[i]}, function( results, status, i )  
			{  
			   	if (status == google.maps.GeocoderStatus.OK)  
				{  
					alert(i);  
			      	var position = jQuery("#" + id[i]).position();  
					var marker =  new google.maps.Marker({  
			    		map: map,  
			            position: results[0].geometry.location  
			        });  
			    	google.maps.event.addListener(marker, 'click', function( evt, position )  
					{  
						alert(position);  
						target_top = position.top;  
						jQuery("#suche").scrollTop(target_top);  
					  });	  
			    }  
				else  
				{  
			    	alert("Geocode was not successful for the following reason: " + status);  
			    }  
		    });  
		}  
	  }  
  
}

Die Variable id ist ein Array mit den ID's der Divs. Mein Problem ist nun, dass beim alert(i); lediglich ein undefined ausgegeben wird. Aber ich übergebe doch das i der Callbackfunktion - gleiches dann bei der Variable position, die ja laut meinem Verständnis auch korrekt an die Callbackfunktion übergeben wird.

Offensichtlich ist mein Verständnis da aber vollkommen daneben. :)
Für Denkanstöße in die richtige Richtung wäre ich Euch wirklich sehr dankbar!

Beste Grüße,
madblueshippie

  1. Hallo,

    Aber ich übergebe doch das i der Callbackfunktion - gleiches dann bei der Variable position, die ja laut meinem Verständnis auch korrekt an die Callbackfunktion übergeben wird.

    Mit "function( results, status, i )" definierst du nur eine anonyme Funktion mit den Parametern results, status und i. Du übergibst an der Stelle keine Variablen. Diese müssen beim Aufruf der Funktion erfolgen, was die Google API macht. Ich gehe mal davon aus, dass die API aber nur die beiden Parameter results und status erwartet und somit auch entsprechende Werte übergibt.

    Ich kenne mich aber in der API nicht aus.

    Viele Grüße Novi

    --
    "(...) deshalb mag ich Binärtechnik. Da gibt es nur drei Zustände: High, Low und Kaputt." (Wau Holland)
    1. Mit "function( results, status, i )" definierst du nur eine anonyme Funktion mit den Parametern results, status und i.

      Viele Grüße Novi

      Hallo Novi,

      OK das hilft mir ja jetzt schonmal weiter. Wenn ich eine eigene Funktion schreibe, dann kennt er auf einmal status und result nicht mehr - klappt dann auch nicht. Aber ich sehe doch richtig, dass es keinen anderen gescheiten Weg gibt als irgendwie die Variablen durchzureichen, oder?

      Beste Grüße und vielen Dank!
      madblueshippie.

      1. Hallo,

        ich steige nicht komplett durch deinen Code durch, aber ich habe auch noch nie die API benutzt. Vielleicht könnte folgender Code dir helfen, dein Vorhaben umzusetzen:

          
        // Hier kannst du eigene Parameter definieren,..  
        function createCallback(param1){  
            // Hier kann du die Parameter der API eintragen,...  
            function callback(){  
                // ... die du hier verwenden kannst  
                alert(param1)  
            }  
            return callback;  
        }  
        callback1 = createCallback("test1");  
        callback2 = createCallback("test2");  
          
        // Test  
        callback1();  
        callback2();  
        
        

        Viele Grüße Novi

        --
        "(...) deshalb mag ich Binärtechnik. Da gibt es nur drei Zustände: High, Low und Kaputt." (Wau Holland)
        1. Ergänzung:

          // Hier kannst du eigene Parameter definieren,..  
          function createCallback(param1){  
              // Hier kann du die Parameter der API eintragen,...  
              function callback(apiParam){  
                  // ... die du hier verwenden kannst  
                  alert(apiParam);  
                  alert(param1);  
              }  
              return callback;  
          }  
          callback1 = createCallback("test1");  
          callback2 = createCallback("test2");  
            
          // Test  
          callback1("API1");  
          callback2("API2");
          

          Viele Grüße Novi

          --
          "(...) deshalb mag ich Binärtechnik. Da gibt es nur drei Zustände: High, Low und Kaputt." (Wau Holland)
          1. Ergänzung:

            // Hier kannst du eigene Parameter definieren,..

            function createCallback(param1){
                // Hier kann du die Parameter der API eintragen,...
                function callback(apiParam){
                    // ... die du hier verwenden kannst
                    alert(apiParam);
                    alert(param1);
                }
                return callback;
            }
            callback1 = createCallback("test1");
            callback2 = createCallback("test2");

            // Test
            callback1("API1");
            callback2("API2");

            
            >   
            > Viele Grüße Novi  
              
            Moin Novi,  
              
            vielen Dank! Ich kann's hier gerade nicht ausprobieren - werde aber heute Abend mal Rückmeldung geben.  
              
            Trotzdem schonmal vielen Dank für Deine Mühen :)  
              
            Beste Grüße,  
            madblueshippie.
            
          2. Moin,

            hm es geht immernoch nicht - aber über die Nacht ist mir mein Problem immerhin klar geworden :)

            Das geocoding läuft asynchron, daher kann ich in der Callback Funktion für den Erfolgsfall nicht mehr auf den Zähler i als index zurückgreifen und auf die ids zugreifen.

            Es wird doch aber irgendwie möglich sein zu überprüfen in welcher Reihenfolge die Geocoding Calls gemacht wurden, oder?

            Vielen Dank + beste Grüße,
            madblueshippie