Antworten auf deine Fragen:
Neues Thema erstellen

Javascript Variable außerhalb einer Funktion

Philipp88

Nicht mehr ganz neu hier

Hallo,

ich habe eine Javascript- Funktion geschrieben, welches die lat lon Werte ermittelt.
Leider sind aber die Variablen die ich innerhalb von geocode setze, außerhalb von dieser Funktion für die Weitervereibung sichtbar (beispielt wo mein alert steht)

Mein Code:

Code:
function address() {
   
    var zip = $("#inputZip").val();
      var geocoder = new google.maps.Geocoder();
      geocoder.geocode({'address': zip}, function(results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
          var lat = results[0].geometry.location.lat();
          lon = results[0].geometry.location.lng();
        } else {
          alert("Something got wrong " + status);
        }
       
      });
      alert(lat +" x "+lon);
    }

Wäre für jede Hilfe sehr dankbar :)

vg.
Philipp
 

lachender_engel

Aktives Mitglied

Da Du keine Frage stellst, kann ich nur raten und verstehe Dein Problem nicht.
Du gibst per alert die ermittelten Datren doch INNERHALB Deiner Funktion address aus. Und das ist falsch?
 

Pixelaner

Der Pixelaner

Dürfte eigentlich aber nicht passieren dank des Scopes. Dieses besagt, dass in der Funktion deklarierte Variablen lokale Variablen sind und diese nur für diese Funktion verwendet werden.
 

Philipp88

Nicht mehr ganz neu hier

außerhalb von dieser Funktion für die Weitervereibung sichtbar (beispielt wo mein alert steht)
Sorry ich mein natürlich nicht sichtbar.

Die Variablen in alert sind "undefiniert" , obwohl ich die Variablen in der Funktion oberhalb definiert habe.
Wie kann ich wie Pixelaner andeutet die Variablen global setzen?
 

mindraper

me[code].Java(Script)

moinsen,

einfach alle variablen im gültigkeitsbereich von address() deklarieren, nicht erst innerhalb des callbacks von geocoder.geocode().

Also statt
Code:
function address() {

    var zip = $("#inputZip").val();
      var geocoder = new google.maps.Geocoder();
      geocoder.geocode({'address': zip}, function(results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
          var lat = results[0].geometry.location.lat();
          lon = results[0].geometry.location.lng();
        } else {
          alert("Something got wrong " + status);
        }
   
      });
      alert(lat +" x "+lon);
    }

einfach so
Code:
function address() {
    var zip = $("#inputZip").val(),
        geocoder = new google.maps.Geocoder(),
        lat,
        lon;
 
    geocoder.geocode({'address': zip}, function(results, status) {
        if (status === google.maps.GeocoderStatus.OK) {
            lat = results[0].geometry.location.lat();
            lon = results[0].geometry.location.lng();
        } else {
            alert("Something got wrong " + status);
        }
    });
    alert(lat +" x "+lon);
}

die callback funktion, die als zweites argument an geocoder.geocode() übergeben wird eröffnet natürlich einen neuen gültigkeitsbereich, der darin deklarierte variablen nach außen hin wieder abschirmt. daher kann dein äußeres alert() die inneren variablen natürlich nicht sehen.

ein weiterer fehlergrund kann sein (vermutung, hab gerade nicht im kopf ob der geocoder asynchron arbeitet – ich gehe aufgrund des API aber mal schwer davon aus) bzw. ist mit relativ hoher sicherheit, dass dein äußeres alert() ausgeführt wird, bevor der geocoder eine antwort gesendet hat. damit sind die variablen "lat" und "lon" natürlich undefined zur zeit des aufrufs vom äußeren alert(). in diesem fall als test bitte das äußere alert() ebenfalls innerhalb der callback funktion aufrufen.

übrigens erzeugst du in deinem code eine neue globale variable namens "lon", da diese nicht mit einem var-statement deklariert wird. ist in meinem beispiel bereinigt. du solltest generell das erzeugen von globalen variablen so weit wie irgend möglich (also im ernstfall bis auf maximal eine einzige!) vermeiden, da diese den globalen namensraum (window) "zumüllen" und es extrem leicht passieren kann, dass sie unabsichtlich überschrieben werden. das führt ab einer gewissen menge von globalen variablen i. d. r. zu fehlern, die extrem schwer zu debuggen sind.

hoffe das hilft
 
Zuletzt bearbeitet:

Philipp88

Nicht mehr ganz neu hier

Ich habe es jetzt so abgeändert wie du gesagt hast. Sie sind leider immer noch undefiniert :(

Code:
    function address() {
      var zip = $("#inputZip").val(),
      geocoder = new google.maps.Geocoder(),
      lat,
      lon;
   
      geocoder.geocode({'address': zip}, function(results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
          lat = results[0].geometry.location.lat();
          lon = results[0].geometry.location.lng();
        } else {
          //alert("Something got wrong " + status);
        }
        $("#geo").val(lat + "x" + lon);
      });
   
      alert(lat +" x "+lon);
    }
 
Zuletzt bearbeitet:

mindraper

me[code].Java(Script)

moinsen,

aufgrund deiner antwort muss ich davon ausgehen, dass du meinen post nicht gelesen hast oder dass noch etwas anderes an deinem code nicht so läuft wie es soll.

wo stellst du denn fest, dass die variablen undefined sind? falls durch das letzte alert() => siehe meinen letzten post, vorletzter absatz.
falls im element mit der id "geo" die werte nicht exakt ankommen, kann das daran liegen, dass
  1. du die werte falsch abgreifst (via results[0].geometry. etc)
  2. das element mit der id "geo" kein input-element ist und val() daher nicht funktioniert
  3. der geocoder nicht den status "OK" liefert und du es nicht erfährst, weil das innere alert() auskommentiert ist
übrigens ist alert() ein sehr sehr eingeschränktes werkzeug zum "debuggen" (sofern man das überhaupt so nennen kann). besser du benutzt die konsole oder das debugger keyword.
 

afr0kalypse

Allwissendes Karmameerschweinchen!

Das Script funktioniert, allerdings wird die Funktion geocode oder der GeocoderStatus etwas Zeitversetzt (asynchron? ajax?) versendet.
Wenn zip ein korrekter String ist gibt
Code:
if (status == google.maps.GeocoderStatus.OK) {
       lat = results[0].geometry.location.lat();
       console.log(lat);
       lon = results[0].geometry.location.lng();
       console.log(lon);
...
auf der Konsole auch Werte aus.
 

Philipp88

Nicht mehr ganz neu hier

Ja stimmt die Variable wird zeitverzögert ausgeliefert und deswegen war es undefiniert.
Ich habe jetzt einfach ein Timeout gesetzt bis alert ausgegeben wird.
 
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Statistik des Forums

Themen
118.614
Beiträge
1.538.351
Mitglieder
67.525
Neuestes Mitglied
mgtaucher
Oben