tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
3
ZUGRIFFE
469
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    automatix1311 automatix1311 ist offline Mitglied Bronze
    Registriert seit
    Nov 2007
    Beiträge
    26
    Hallo zusammen!

    Vor paar Tagen habe ich von der Google Maps API Doku Seite, hier, ein Beispiel-Skript geklaut. Dann habe ich den Code auseinandergenommen und umgeschrieben, v.a. um einzelne Teil besser zu verstehen.

    HTML-Code:
    		var address = 'TU-Sportzentrum Dovestraße Berlin';
    		var geocoder = new google.maps.Geocoder();
    		var geoLocation = generateLatLng(address);
    		
    		function createMap() {
    			var mapOptions = {
    				zoom: 15,
    				center: generateLatLng(address),
    				mapTypeId: google.maps.MapTypeId.ROADMAP
    			}
    			map = new google.maps.Map(document.getElementById('mapCanvas'), mapOptions);
    			addMarker();
    		}
    		function addMarker() {
    			var marker = new google.maps.Marker({
    				map: map,
    				position: generateLatLng(address)
    			});
    		}
    		function createGoogleMapsLink() {
    			return 'http://maps.google.de/maps?' +
    				'q=' + address +
    				'&ll=' + generateLatLng(address).lat() + ',' + generateLatLng(address).lng();
    		}
    		function generateLatLng(address) {
    			geocoder.geocode({'address': address}, function(results, status) {
    				if (status == google.maps.GeocoderStatus.OK) {
    					geoLocation = results[0].geometry.location;
    					// alert(geoLocation.lat() + ' / ' + geoLocation.lng() + ' ' + status);
    				} else {
    					// alert('Geocode was not successful for the following reason: ' + status);
    				}
    			});
    			return geoLocation;
    		}
    		function showMap() {
    			var address = jQuery('#address').val();
    			createMap();
    			jQuery('#link').attr('href', createGoogleMapsLink());
    		}
    		jQuery('document').ready(function() {
    			alert('Mit alert geht\'s. Ohne nicht...');
    			jQuery('#address').val(address);
    			showMap();
    		});
    		jQuery('document').ready(function() {
    			jQuery('#address').change(function() {
    				address = jQuery('#address').val();
    				createMap();
    				jQuery('#link').attr('href', createGoogleMapsLink());
    			});
    		});
    Die komplette Date mit HTML hänge ich an.

    Problem: Es funktionert nur, wenn ein Alert geworfen wird. Sonst erscheint im FireBug eni Fehler:

    generateLatLng(address) is undefined

    '&ll=' + generateLatLng(address).lat() + ',' + generateLatLng(address).lng();
    Meine Vermutung ist, dass es ein AJAX-Problem ist, sprich, mit der Asynchronität der Aufrufe zusammenhängt. Kann bitte jemand bei der Lösung helfen? Danke!

    Grüße,
    Ilya
    Angehängte Dateien Angehängte Dateien
     

  2. #2
    Avatar von Anna Bolika
    Anna Bolika Anna Bolika ist offline Mitglied Silber
    Registriert seit
    Jan 2011
    Beiträge
    75
    1. Du solltest wissen, dass nicht alle Skripte, die Google da auf seiner API-Seite aufführt, lauffähig sind. Als ich mich eingearbeitet habe, hab ich mir nen Wolf gesucht und dann alles ganz von vorn selbst zusammengebaut. Hatte den Vorteil, dass ich es danach verstanden hatte

    2. Diese Zeile hier:
    center: generateLatLng(address),
    Bei mir ist es Zeile 8.

    Nach meinem Verständnis von JavaScript kommt die Variable "address" hier nicht an. Du bist innerhalb einer Funktion.
     

  3. #3
    automatix1311 automatix1311 ist offline Mitglied Bronze
    Registriert seit
    Nov 2007
    Beiträge
    26
    Danke für Deine Antwort! Nichts ist perfekt und die Google API sind wohl keine Ausnahme, aber diesmal war es mein Fehler. Das Hauptproblem meines Skripts liegt darin, dass es eine Funktion gibt, die von einer asynchronen abhängig ist, jedoch früher ausgeführt wird, als diese asynchrone Funktion ein Ergebnis zurückgegeben hat.

    Hier ein vereinfachtes Beispiel mit einer Log-Funktion:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    
            <script type="text/javascript">
            /**
            Creates an element with id = $elementId, if this has not yet existed.
            */
            function createElement(elementId) {
                var returnElement;
                var defaultElementId = 'log';
                elementId = elementId != null ? elementId : defaultElementId;
                var foundElement = jQuery('body').find('#' + elementId);
                if (foundElement.length != 0) {
                    // alert(foundElement.attr('id') + '***');
                    returnElement = foundElement;
                } else {
                    // alert('nothing found');
                    returnElement = jQuery('<div id="' + elementId +'"><h4>Log</h4></div>');
                    jQuery('body').prepend(returnElement);
                }
                // jQuery('#' + elementId).css({'background' : '#00aa00', 'height' : '100'});
                return returnElement;
            }
            /**
            Logs the message $message ind the element with id $elementId.
            */
            function log(message, elementId) {
                var logElement = createElement(elementId);
                logElement.append('<div class="logMessage">' + message + '</div>');
            }
            /*
            Generates a geo location object from an address string $address.
            */
            function generateLatLng(address) {
                log('start generateLatLng()');
                var geocoder = new google.maps.Geocoder();
                geocoder.geocode({'address': address}, function(results, status) {
                    if (status == google.maps.GeocoderStatus.OK) {
                        geoLocation = results[0].geometry.location;
                        //log((geoLocation.lat() + ' / ' + geoLocation.lng() + ' ' + status));
                    } else {
                        //log('Geocode was not successful for the following reason: ' + status);
                    }
                });
                log('stop generateLatLng()');
                return geoLocation;
            }
            jQuery('document').ready(function() {
                var address = 'TU-Sportzentrum Dovestraße Berlin';
                var geoLocation = generateLatLng(address);
                log(geoLocation);
            });
            </script>

    Ausgabe:
    start generateLatLng()
    stop generateLatLng()
    undefined
    Anstatt von:
    start generateLatLng()
    stop generateLatLng()
    (52.52030999999999, 13.319799999999987)
    ...was eben der Fall ist, wenn ich in der generateLatLng() ein Alert ausführe, wodurch sie ein paar Sekunden Zeit gewinnt, um die Antwort des Services abzuwarten und der log() ein sinnvolles Ergebnis zu übergeben.

    Wie kann man nun diesen Code complett synchron ausführen?
    Geändert von automatix1311 (15.01.12 um 13:07 Uhr)
     

  4. #4
    automatix1311 automatix1311 ist offline Mitglied Bronze
    Registriert seit
    Nov 2007
    Beiträge
    26
    GMap! Yes! Fine and clean realized! Yeah!
    Ja, das steht in meinem GIT Commit Kommentar von eben. Also, ich hab's!

    Zusammengerechnet fast vier volle Tage vorm Schirm gesessen, aber am Ende exakt das erreicht, was ich wollte, und eine ganze Menge dazugelernt!

    Im Anhang nun die komplette funktionierde Version. Viel Spaß!
    Angehängte Dateien Angehängte Dateien
     

Ähnliche Themen

  1. Antworten: 6
    Letzter Beitrag: 05.09.11, 20:22
  2. Bildwechsel Skript funktioniert nicht
    Von tester33 im Forum Javascript & Ajax
    Antworten: 6
    Letzter Beitrag: 16.06.11, 21:41
  3. Antworten: 2
    Letzter Beitrag: 19.06.07, 15:21
  4. Thumbnail Skript funktioniert nicht
    Von metno im Forum PHP
    Antworten: 7
    Letzter Beitrag: 14.12.06, 15:16
  5. Wie funktioniert dieses kurze Datums-Skript?
    Von Don Stefano im Forum PHP
    Antworten: 7
    Letzter Beitrag: 07.03.06, 22:11

Stichworte