AJAX funktioniert nicht richtig, readysate funktion wird nicht ausgeführt

Biergamasda

Erfahrenes Mitglied
Hi Leute, hab ein kleines Problem.

Ich mach mir einen HTTPRequest, konfiguriere ihn und setze ihn ab, so weit, so gut.

Das Problem ist jezt nur, dass die auszuführende Funktiion nie ausgeführt wird, ich aber keine Ahnung habe wieso, habe es bisher immer so gemacht und hatte eigentlich keine Probleme damit.

So, der Code:

Javascript:
function makeRequest(url, action) {  
    var httpRequest;    
    //Beginn anlegen des XMLHTTPREquest objektes (FINGER WEG)   
    if (window.XMLHttpRequest) { // Mozilla, Safari, ...
        httpRequest = new XMLHttpRequest();
        if (httpRequest.overrideMimeType) {
            httpRequest.overrideMimeType('text/xml');
        }
    } else if (window.ActiveXObject) { // IE
        try {
            httpRequest = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (e) {
            try {
                httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
            } catch (e) {
            }
        }
    }

    if (!httpRequest) {
        alert('Giving up :(  Cannot create an XMLHTTP instance');
        return false;
    }

    switch(action) {
    case SHOW_CONTENT:
        httpRequest.onreadystatechange = function() { printContent(httpRequest); };
        httpRequest.open('GET', url, false);
        httpRequest.send('');
        break;
    case SHOW_NEWS:
        httpRequest.onreadystatechange = function() { printNews(httpRequest); };
        httpRequest.open('GET', url, false);
        httpRequest.send('');
        break;
    case ADD_GB_ENTRY:
        //ersetzen des buttons duch "einen Moment bitte..."
        elem = document.getElementById("addGbEntryCont");
        tn = document.createTextNode("einen Moment bitte...")
        el = document.getElementById("addGbEntryBut");
        elem.replaceChild(tn,el);
        //button ersetzt
        
        author = document.getElementById('gbEntryName').value;
        msg = formatMessage(document.getElementById('gbEntryMsg').value);
        httpRequest.onreadystatechange = function() { entryAdded(httpRequest); };
        httpRequest.open('GET', url + "?author=" + author + "&msg=" + msg, true);
        httpRequest.send('');
        break;
    case ADJUST:
        httpRequest.onreadystatechange = function() { adjusted(httpRequest); };
        url=url.split('?');
        httpRequest.open('POST', url[0], false);
        httpRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        httpRequest.setRequestHeader("Content-length", url[1].length);
        httpRequest.setRequestHeader("Connection", "close");
        httpRequest.send(url[1]);
        break;
    }
return true;
}

und eine der funktionen:
Javascript:
function printContent(httpRequest) {
    if (httpRequest.readyState == 4) {
        if (httpRequest.status == 200) {
            document.getElementById("content").innerHTML = httpRequest.responseText;
        } else {
            alert('There was a problem with the request.');
        }
    }        
}

Es müsste nicht die ganze makeRequest funktion sein, aber ich denke mir is besser zum Verständnis :)

Vielen Dank schon mal für die Hilfe und... frohe Weihnachten ;)

mfg me
 
Moin,

deine switch-Fälle, du beziehst dich da auf action, aber was übergibst du da als action?

Sind das Variablen(namen), weil falls sie das nicht sind sondern Strings, müsstest du die Fälle in Anführungszeichen setzen.
 
Sind ganz normale int werte, also 1, 2, 3

//edit: und ja, sind Variablennamen :)

//edit2

vl sollte ich noch dazusagen, dass die Case fälle funktionieren, er geht rein, führt den Darin enthaltenen Code aus (mitm Netbeans javascript debugger geprüft) und schließt die Fkt wie gewünscht ab.

Das Problem ist nur, dass die auszuführende Funktion, im ersten case Fall printContent(..) einfach nicht ausgeführt wird.

Hab schon geprüft ob ich vl einen error Code zurückbekomme, aber gar nichts.
 
Zuletzt bearbeitet:
Ich habe dies jetzt mal nachgestellt, und es funktioniert alles einwandfrei.

Ist das Beispiel von dir irgendwo online, um den Fehler dort suchen zu Können?
 
Hmm... bei mir geht auf der Seite nix das mit AJAX zu tun hat....

Wird dann wohl eine andere Ursache haben. Wenn ich draufkomme gebe ich Bescheid woran es gelegen hat ;)

Danke für deine Mühen

mfg
 
Sorry fürn Doppelpost ;)

Hab jetz noch ein wenig rumprobiert, und bin auf einige Kleinigkeiten draufgekommen.

1. Rechts sollten news drin sein, die wurden nicht angezeigt, weil ich hier (Zeile 4):

Javascript:
function printNews(httpRequest) {
    if (httpRequest.readyState == 4) {
        if (httpRequest.status == 200) {
            var news = httpRequest.responseText.split(';');
            for (i = 0; i < news.length - 1; i++) {
                div = document.createElement("div");
                div.className = "newsTeaser";
                div.appendChild(document.createTextNode(news[i].split(".")[0]));
                div.onclick = new Function('makeRequest("./news/' + news[i]+ '",SHOW_CONTENT)');
                document.getElementById("news").appendChild(div);                
            }
        } else {
            alert('There was a problem with the request.');
        }
    }    
}

auf das "var" vergessen habe :)

Naja, so weit so gut...

Das blöde daran ist nur, dass das mein Problem immer noch nicht behebt. Hab im Windows ein wenig rumexperimentiert, und kann mir mitm IE (6 und 7) alles (bis auf ein paar kleinigkeiten) problemlos ansehen, und die AJAX routinen funktionieren auch.

Wenn ich das Ganze jetzt im Firefox (3.0.5) anschaue, geht das AJAX zeug nicht mehr. Weder im Windows (XP), noch im Linux (Ubuntu 8.1)

Jetzt meine Frage(n):
1. Kann es sein, dass der Firefox 3.0.5 irgendetwas anders interpretiert?

2. Könnte es sein, dass es daran liegt, dass die Files auf einem Linux server liegen? (wobei ich mir das eher nicht vorstellen kann, da es übern IE ja Funktioniert

3. Welchen Browser verwendest du?

Danke nochmal ;)
 
Zuletzt bearbeitet:
Ui, ich hab jetzt glatt an mir gezweifelt, die Lösung ist recht simpel :)

Ums kurz zu machen, dein AJAX funktioniert nicht, weil in deinem Code nicht ein Schnipsel AJAX ist :eek:

Was bedeutet AJAX?
Asynchronous Javascript and XML

Deine Requests erfolgen jedoch alle synchron.

Was bedeutet synchron?
Das Standardverhalten von JS ist ja, dass es eine Anweisung nach der anderen erledigt.
Also bei dir in der Theorie: Request senden, und wenn das erledigt ist, geht es weiter.
Nur: es scheint so zu sein, dass FF3 währendessen die Vorgänge während des Sendens des Requests ignoriert...die Funktion für den onreadystatechange-Event wird anscheinend nicht aufgerufen, und wenn das Senden erledigt ist, ändert sich ja der readystate nicht mehr.

Die synchrone Vorgehensweise sollte also jene sein:
Code:
httpRequest.open('GET', url, false);
httpRequest.send('');
printContent(httpRequest);

allerdings sind synchrone Sendevorgänge kaum empfehlenswert, denn bis zum Abschluss des Vorgangs ist der Browser auf Eis gelegt.

Lösung: verwende wie üblich asynchrone Request. Du musst dafür nur überall den 3.Parameter bei httpRequest.open() auf true setzen(oder ihn weglassen, denn true ist der Standardwert).

Ansonsten: Hatte es mit allem möglichen getestet, nur nicht mit FF3, weswegen es mir zuerst nicht als Problem begegnete.
 

Neue Beiträge

Zurück