JS Variable in Ajax unbekannt?

Sprint

Erfahrenes Mitglied
Hallo zusammen,

ich kämpfe gerade mit einer JS Funktion, die an bestimmten Tagen eingegebene Zeitwerte korrigieren soll. Die Zeitangabe kommt immer im Format hh:mm. Bisher wurde nur das Datum berücksichtigt und es funktionierte einwandfrei. Jetzt sollen aber Feiertage und Wochenende mit berücksichtigt werden. Das wird über eine PHP Funktion gemacht.

Das hier ist der betroffene Ausschnitt. in zeit steht z.B. 18:05.
Javascript:
    var rohzeit = $('#sendezeit').val();
    if (rohzeit.length == 4 && !isNaN(rohzeit)){
        var zeit = rohzeit.substr(0, 2)+':'+rohzeit.substr(2);
        var result = regTime(zeit);
    }else if (rohzeit.length == 5 && rohzeit.substr(2,1) == ':'){
        var zeit = rohzeit;
        var result = regTime(rohzeit);
    }else
        return false;

alert(zeit)
    $.ajax({
        type: "POST",
        async: false,
        url: "rechvortag.php",
        success: function(data){
            if (data == "heute") {        // normal / heute
alert(zeit)
                if (zeit.substr(0,2) >= 17 || (zeit.substr(0,2) == 16 && zeit.substr(3,2) >= 30)){
                    var zeit = '16:30';
                    var result = regTime(zeit);
                    $('#sendedatum option:eq(0)').prop('selected', true);
                }
            }
        }
    });
alert(zeit)
Das Problem ist nun, daß in JS die Zeitangabe definitiv vorhanden ist, bevor Ajax aufgerufen wird. Wenn ich diese Funktion anspreche, werden mir die alerts in der richtigen Reihenfolge ausgegeben. In dem Ajax Teil ist zeit dann aber undefined. Danach ist sie aber wieder da.

Warum übersieht Ajax den Wert?
 
Lösung
Das ist jetzt ein etwas verzwicktes Verhalten von Javascript. Ich habe mal einen Testcode gemacht, der auf das Wesentliche für dieses Problem reduziert ist:
Code:
        function doIt() {
            // var rohzeit = $('#sendezeit').val();
            var rohzeit = '1805';
            if (rohzeit.length == 4 && !isNaN(rohzeit)) {
                var zeit = rohzeit.substr(0, 2) + ':' + rohzeit.substr(2);
                // var result = regTime(zeit);
            } else if (rohzeit.length == 5 && rohzeit.substr(2, 1) == ':') {
                var zeit = rohzeit;
                // var result = regTime(rohzeit);
            } else {
                return false;
            }
            console.log('before ajax: ' + zeit)...
sync vs. async?

Was ich durch meine Recherche gefunden habe, is Ajax anscheinend von Haus aus asynchron
 
Das ist richtig. Aber da zeit später noch gebraucht wird, habe ich es hier auf sync gesetzt. Ansonsten sollte das eigentlich keine Rolle spielen, denn zeit ist ja vor dem Ajax aufruf definitiv schon vorhanden. Nur in success vergißt er das plötzlich. Bei einer anderen function würde ich das ja verstehen, aber da?

Ich habe testweise zeit auch mal global definiert, aber auch da ist sie innerhalb des Ajax teils undefined.
 
Das ist jetzt ein etwas verzwicktes Verhalten von Javascript. Ich habe mal einen Testcode gemacht, der auf das Wesentliche für dieses Problem reduziert ist:
Code:
        function doIt() {
            // var rohzeit = $('#sendezeit').val();
            var rohzeit = '1805';
            if (rohzeit.length == 4 && !isNaN(rohzeit)) {
                var zeit = rohzeit.substr(0, 2) + ':' + rohzeit.substr(2);
                // var result = regTime(zeit);
            } else if (rohzeit.length == 5 && rohzeit.substr(2, 1) == ':') {
                var zeit = rohzeit;
                // var result = regTime(rohzeit);
            } else {
                return false;
            }
            console.log('before ajax: ' + zeit)
            $.ajax({
                type: "POST",
                async: false,
                url: "testpost.php",
                success: function (data) {
                    console.log('inside callback: ' + zeit)
                    // if (data == "heute") {        // normal / heute
                    //     console.log(zeit)
                    //     if (zeit.substr(0, 2) >= 17 || (zeit.substr(0, 2) == 16 && zeit.substr(3, 2) >= 30)) {
                    //         var zeit = '16:30'; // So funktioniert es NICHT
                    zeit = '16:30';
                    //         var result = regTime(zeit);
                    //         $('#sendedatum option:eq(0)').prop('selected', true);
                    //     }
                    // }
                }
            });
            console.log('after ajax: ' + zeit);
            // return result;
        }
        doIt();
So funktioniert das Ganze. Aktiviere ich jedoch die auskommentierte Zeile mit dem var davor, ist in den Zeilen darüber die Variable zeit undefiniert. Erklärung: Javascript erkennt, dass im Verlauf des Callback die Variable zeit neu definiert wird und legt sie ganz am Anfang als "undefiniert" an. Lässt man das var weg, wird sie nicht neu definiert sondern lediglich ein neuer Wert zugewiesen.
 
Lösung
Natürlich, jetzt wo du es sagst, fällt es mir auch auf das var darf da natürlich nicht stehen. Ich hab da hundert mal drübergeschaut und nicht bemerkt. Vielen Dank für die Hilfe
 
Zurück