Firefox 5 AJAX tut nicht
Don P
- javascript
0 hotti0 Don P0 Don P
Hallo,
Meine AJAX-Abfrage, die mit den Feuerfüchsen bis jetzt anstandslos funktioniert, klappt nicht mehr im FireFox 5 (Beta?): Mit Status 4 (DONE) des Request-Objekts wird der HTTP-Statuscode 0 zurückgegeben, was auf einen Fehler hindeutet.
Aber wieso? Intensives Googeln hat leider nicht geholfen. Kennt jemand das Phänomen? Muss man AJAX-Requests neuerdings irgendwie anders machen? Mein Code geht so:
var ax = { // ajax functions
reqObj: new XMLHttpRequest(),
request: function(url, responseFunction) {
try{ netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); } // enable cross-domain AJAX request
catch(e) {return ax[responseFunction]( null, {readyState:4, status:0, responseText:"\nCross-Domain AJAX Anfragen sind nicht erlaubt."} );}
var ro = ax.reqObj;
ro.open("GET", url, true);
ro.onreadystatechange = ax[responseFunction];
ro.send(null);
return undefined; // prevents strict warning
},
permResponse: function(e,ro) {
var ajaxErrorText = 'Unbekannter AJAX-Fehler! ',
noTRNGtext = '\nEchte Zufallszahlen sind nicht verfügbar.',
prngText = '\nErsatzweise werden Pseudo-Zufallszahlen benutzt.',
responseText = 'Antwort von random.org:\n',
httpStatusText = '\nHTTP status: ';
ro = ro||ax.reqObj;
if (ro.readyState === 4) { // DONE state
switch (ro.status) { // HTTP status code
case 0: alert((ro.responseText?ro.responseText:ajaxErrorText)+ noTRNGtext + prngText); break;
case 200:
(tbl.p0 = ro.responseText.split('\n')).pop();
tbl.p0.rng='TRNG'; if (tbl.sim.running) {tbl.dispatchEvent('onSimStart'); return; }
default:
alert(noTRNGtext + (ro.responseText ? responseText+ro.responseText : httpStatusText+ro.status+' '+ro.statusText) + prngText);
}
if (tbl.sim.running) { tbl.sim.TRNG=false; ef.fire('NoTRNG'); tbl.dispatchEvent('onSimStart'); }
}
},
getPerms: function(count){
// http://www.random.org/integers/?num=10000&min=0&max=36&col=1&base=10&format=plain&rnd=new
return ax.request( encodeURI('http://www.random.org/integers/?num='+count+'&min=0&max=36&col=1&base=10&format=plain&rnd=new'), 'permResponse' );
//return ax.request( 'http://www.random.org/integers/?num='+count+'&min=0&max=36&col=1&base=10&format=plain&rnd=new', 'permResponse' );
}
};
Zur Erklärung:
ax ist ist mein Container für AJAX-Funktionen.
Durch Aufruf der Methode ax.getPerms(count)
soll eine Anzahl (count) echter Zufallszahlen von random.org geladen werden.
tbl.p0
ist ein Array, worin die Zahlen dann landen.
Mit tbl.dispatchEvent('onSimStart')
wird schließlich die Verarbeitung der Zufallszahlen gestartet.
Wie gesagt klappt es einwandfrei bis einschließlich FireFox 4. Cross-Domain-AJAX funktioniert halt nur, wenn die aufrufende Seite ein lokaler file://-URI ist und nachdem man die obligatorische Sicherheitsabfrage von FireFox entsprechend bentwortet hat.
Vielleicht ist es nur ein bis jetzt undokumentierter Bug in Firefox 5. Aber falls ich etwas Wichtiges übersehen habe, frage ich hier lieber mal nach.
Hat jemand eine Idee, was da los sein könnte, oder was man besser machen könnte?
Danke, Don P
Mahlzeit,
Hat jemand eine Idee, was da los sein könnte, oder was man besser machen könnte?
Kommt der Request am Server an?
Hotti
Hallo,
Mahlzeit,
Ja. Die Zeit stimmt :)
Kommt der Request am Server an?
Hmm, Wie kann ich das überprüfen?
Gruß, Don P
Hi,
Mahlzeit,
Ja. Die Zeit stimmt :)
nö, etwa zwei Stunden zu früh ...
Ciao,
Martin
Hi,
Kommt der Request am Server an?
Hmm, Wie kann ich das überprüfen?
D'oh - Logfiles ...?
Falls darauf kein Zugriff - im Script selber eins schreiben. error_log().
MfG ChrisB
Hallo,
Hi,
Kommt der Request am Server an?
Hmm, Wie kann ich das überprüfen?
D'oh - Logfiles ...?
Falls darauf kein Zugriff - im Script selber eins schreiben. error_log().
Es ist ein fremder Server. Habe natürlich keinerlei Zugriff.
Gruß, Don P
Hi there,
Falls darauf kein Zugriff - im Script selber eins schreiben. error_log().
Es ist ein fremder Server. Habe natürlich keinerlei Zugriff.
Aber in eine Textdatei mit Fehlermeldungen wird er Dich wohl schreiben lassen, oder? Am Besten Du schreibst Dir eine Funktion, die an bestimmten Stellen definierte Nachrichten in eine Textdatei schreibt, damit erkennst Du den Status den Skripts auch wenn kein PHP-Fehler im eigentlichen Sinne vorliegt. Ist ein bisschen wie das Setzen von Breakpoints.
Eine weitere Idee ist, das PHP-Skript, daß den für Ajax relevanten Code ausführen soll, einfach einmal über den Browser aufzurufen. Dann erkennst Du zumindest sofort, ob Du im PHP-Skript einen Syntaxerror hast...
Hallo,
Falls darauf kein Zugriff - im Script selber eins schreiben. error_log().
Es ist ein fremder Server. Habe natürlich keinerlei Zugriff.
Aber in eine Textdatei mit Fehlermeldungen wird er Dich wohl schreiben lassen, oder?
Nein, wirklich nicht. Mit dem Server habe ich rein gar nichts zu tun, hole mir dort nur Zufallszahlen ab und weiß nicht mal, welche Software läuft, ob PHP oder sonst was, k.A. ^^
Es ist quasi ein Webservice, den ich halt nutze und der normalerweise auch problemlos funktioniert (bis zu ca. 100'000 Zufallszahlen pro Tag und Client-IP, dann macht er dicht).
Das Problem ist ein rein clientseitiges. Der Server antwortet mit HTTP-Statuscode 200 und schickt anscheinend auch Daten, aber mein XMLHttpRequest-Objekt nimmt davon keine Kenntnis, hat einen Leerstring im responseText statt Daten) und 0 im status (=Fehler) statt 200 (=ok).
Ich glaube inzwischen es ist wirklich ein Bug im Firefox 5. Die jüngste offizielle Version ist ja 4, oder? Und damit klappt's auch. Also was soll's... ist vorerst nicht weiter tragisch.
Gruß, Don P
Hi there,
Ich glaube inzwischen es ist wirklich ein Bug im Firefox 5. Die jüngste offizielle Version ist ja 4, oder?
Leider nein, FF 5 ist seit ein paar Tagen die letzte offizielle Version...
Hallo,
Ich glaube inzwischen es ist wirklich ein Bug im Firefox 5. Die jüngste offizielle Version ist ja 4, oder?
Leider nein, FF 5 ist seit ein paar Tagen die letzte offizielle Version...
Oha, das ist keine gute Nachricht. Dann werde ich wohl doch etwas unternehmen müssen. Aber es geht wohl nur, wenn auch der Server etwas ändert. Ob ich die Betreiber dazu übererden kann, ist fraglich...
Gruß, Don P
Hi,
Ob ich die Betreiber dazu übererden kann, ist fraglich...
^^^^^
Mit dem Gegenteil zu drohen, dürfte effektiver sein.
MfG ChrisB
Hallo,
Kommt der Request am Server an?
Ja, anscheinend er kommt er an. Habe Fiddler installiert, und der meldet:
Result Protocol Host URL
200 HTTP www.random.org /integers/?num=1000&min=0&max=36&col=1&base=10&format=plain&rnd=new
Body Caching
1'021 no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Expires: Thu, 19 Nov 1981 08:52:00 GMT
Content-Type
text/plain; charset=UTF-8
Process Comments Custom
firefox:7384
Aber was das genau bedeutet?
post-check=0, pre-check=0 kommt mir verdächtig vor, und nur 1021 Bytes für 1000 Zufallszahlen scheint mir auch zu wenig, zumal die Zahlen zweistellig sein können (0-36) und jeder Zahl ein \n folgt.
Result 200 ist doch aber ok. Trotzdem bekomme ich Statuscode 0 im readystatechange-Handler.
Gruß, Don P
Hi,
Body Caching
1'021 no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Expires: Thu, 19 Nov 1981 08:52:00 GMT
post-check=0, pre-check=0 kommt mir verdächtig vor,
Caching-Angaben, hauptsächlich für den IE interessant AFAIK.
und nur 1021 Bytes für 1000 Zufallszahlen scheint mir auch zu wenig, zumal die Zahlen zweistellig sein können (0-36) und jeder Zahl ein \n folgt.
Und woraus besteht der body, wenn du ihm mal etwas mehr debuggerisches Interesse widmest, als nur bezüglich seiner Länge?
MfG ChrisB
Hallo,
und nur 1021 Bytes für 1000 Zufallszahlen scheint mir auch zu wenig, zumal die Zahlen zweistellig sein können (0-36) und jeder Zahl ein \n folgt.
Und woraus besteht der body, wenn du ihm mal etwas mehr debuggerisches Interesse widmest, als nur bezüglich seiner Länge?
Das wüsste ich auch gern, aber ich komme ja nicht ran. Der responseText im XMLHttpRequest-Objekt ist ein Leerstring und der Status ist 0, statt 200, wie von Fiddler gemeldet. Anscheinend wird der body gar nicht an das Objekt weitergereicht.
Gruß, Don P
Hi,
Das wüsste ich auch gern, aber ich komme ja nicht ran. Der responseText im XMLHttpRequest-Objekt ist ein Leerstring und der Status ist 0, statt 200, wie von Fiddler gemeldet. Anscheinend wird der body gar nicht an das Objekt weitergereicht.
Dann wird es vermutlich wirklich ein Security-Problem sein.
Also mal recherchieren, ob sich bzgl. cross-domain-Requests im FF 5 was geändert hat.
MfG ChrisB