(AJAX) Statuscode manchmal 0, wieso?
*Markus
- javascript
Hallo,
ich habe ein Problem mit einem Ajax-Script. Das Script sendet den Request an ein PHP-Script, dass den Wert speichert.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<meta name="robots" content="follow" />
<script type="text/javascript">
var request = false;
try {
request = new XMLHttpRequest();
} catch (trymicrosoft) {
try {
request = new ActiveXObject("Msxml2.XMLHTTP");
} catch (othermicrosoft) {
try {
request = new ActiveXObject("Microsoft.XMLHTTP");
} catch (failed) {
request = false;
}
}
}
if (!request)
alert("Error initializing XMLHttpRequest!");
function getCustomerInfo() {
var phone = document.getElementById("phone").value;
var url = "writephone.php?phone=" + escape(phone);
request.open("GET", url, true); //true bedeutet asynchron
request.onreadystatechange = updatePage; //onreadystatechange = callback
request.send(null);
}
function updatePage() {
if (request.readyState == 4)
if (request.status == 200)
alert("Server is done!");
else if (request.status == 404)
alert("Request URL does not exist");
else
alert("Error: status code is " + request.status);
}
</script>
<title>Ajax-Test</title>
</head>
<body>
<form method="post">
<p>Enter your phone number:
<input type="text" size="14" name="phone" id="phone"
onChange="getCustomerInfo();" />
</p>
<p>Your order will be delivered to:</p>
<p>Type your order in here:</p>
<p><textarea name="order" rows="6" cols="50" id="order"></textarea></p>
<p><input type="submit" value="Order Pizza" id="submit" /></p>
</form>
</body>
</html>
Das ist das PHP-Script, dass die Daten verarbeitet:
<?php
if (isset($_REQUEST['phone'])) {
$phone = $_REQUEST['phone'];
$myFile = "testFile.txt";
$fh = fopen($myFile, 'w') or die("can't open file");
fwrite($fh, "$phone\n");
fclose($fh);
}
?>
Wenn ich das Script für einige Zeit in Ruhe lasse, und dann eine Eingabe senden will, antwortet der Server mit Request-Status 0. Wieso ist das so?
Wenn ich es gleich darauf wieder ausprobiere, funktioniert es wieder. Woran liegt das?
Markus
Nachtrag:
Der Status-Code 0 scheint doch willkürlich aufzutreten. Wenn ich ein paar mal hintereinander das Script benutze, ist der Status Code manchmal 0 und manchmal funktioniert es wieder, seltsam.
Hi,
Der Status-Code 0 scheint doch willkürlich aufzutreten. Wenn ich ein paar mal hintereinander das Script benutze, ist der Status Code manchmal 0 und manchmal funktioniert es wieder, seltsam.
Ich vermute mal, dass es Probleme gibt, weil du eine globale Variable request nutzt.
Wenn ein Request noch gar nicht abgeschlossen ist, und du schon den naechsten ausloest, dann wird der andere mitendrin "ueberschrieben". Dass dabei unerwartetes Verhalten herauskommt, ist recht wahrscheinlich.
MfG ChrisB
Hallo,
Wenn ich die folgende Funktion analysiere..
if (request.readyState == 4) {
if (request.status == 200)
alert("Server is done!");
if (request.status == 404)
alert("Request URL does not exist");
else
alert("Error: status code is " + request.status);
}
...ist request.readyState immer 4, d.h. das Speichern wird immer ausgeführt.
Wie kann ich dieses Überschreiben verhindern, denn wenn ich in jeder Funktion ein Request-Objekt anlegen würde, würde die Situation noch mehr zugespitzt werden, da das Objekt ja eigentlich "noch später" erzeugt wird, und die Chance dabei doch noch größer ist, dass es zu Konflikten kommt.
Markus
Hi,
Wenn ich die folgende Funktion analysiere..
...ist request.readyState immer 4, d.h. das Speichern wird immer ausgeführt.
Wie kommst du denn darauf?
Das sagt nur, dass der Server den Request beantwortet hat - nicht wie.
Wie kann ich dieses Überschreiben verhindern, denn wenn ich in jeder Funktion ein Request-Objekt anlegen würde, würde die Situation noch mehr zugespitzt werden, da das Objekt ja eigentlich "noch später" erzeugt wird, und die Chance dabei doch noch größer ist, dass es zu Konflikten kommt.
Wieso das denn?
Wenn du mehrere unabhaengige Requestobjekte verwendest, haben die doch alle ihren eigenen Status.
MfG ChrisB
Hallo,
ehrlich gesagt verstehe ich nicht, wie ich da jetzt vorgehen soll. Ich brauche doch das selbe request-Objekt, denn wie soll ich sonst den Status etc abrufen, wenn ich irgendwie neue request-Objekte anlege?
Markus
Yerf!
Ich brauche doch das selbe request-Objekt, denn wie soll ich sonst den Status etc abrufen, wenn ich irgendwie neue request-Objekte anlege?
Du kannst im onReadyStateChange-Handler per "this" auf das aktuelle Objekt zugreifen.
Gruß,
Harlequin
Hallo,
Du kannst im onReadyStateChange-Handler per "this" auf das aktuelle Objekt zugreifen.
Ich fand jetzt heraus, dass dieses Beispiel so zu verstehen ist, dass man einfach nur im Formular wo anders hinzuklicken hat, um das Formular abzuschicken, wodurch der Ajax-Request ausgelöst wird.
Dann entsteht auch nie ein Status 0.
Wie es allerdings mit einem Submit-Button funktionieren soll, weiß ich nicht, denn das Problem kann ich trotzdem nicht lösen.
Ich bin in Ajax noch nicht so bewandert, um zu erkennen, welchen Bezug das request-Objekt auf das aktuelle Objekt mit this hat, d.h. wie ich es verwenden soll.
Markus
Yerf!
Ich bin in Ajax noch nicht so bewandert, um zu erkennen, welchen Bezug das request-Objekt auf das aktuelle Objekt mit this hat, d.h. wie ich es verwenden soll.
Du weist doch dem Request-Objekt per >request.onreadystatechange = updatePage;< einen Event-Handler zu. In dieser Funtion benutzt du die Globale Variable >request.readyState == 4< um auf das request-Objekt zuzugreifen und den Status abzufragen.
Stattdessen kannst du aber auch >this.readyState == 4< benutzen, da bei Event-Handlern this üblicherweise auf das betreffende Objekt zeigt (in deinem Beispiel wäre damit >this< und >request< identisch).
Die Variante über >this< hat nun den Vorteil, dass die globale Variable entfallen kann und jeder Eventhandler automatisch "sein" Objekt abfrägt, egal wiviele Instanzen des Request-Objektes du nun erzeugt hast.
Somit kannst du nun für jeden Request ein neues Objekt erzeugen und gehst Problemen mit noch nicht abgeschlossenen Requests aus dem Weg.
Gruß,
Harlequin
Hallo,
ok, danke. Ich weiß jetzt, was du meinst. Dennoch besteht das Problem trotzdem. Was ich eigentlich erreichen will:
Ich will auf einer Seite zwei oder mehr Formulare haben, die unabhängig voneinander abgeschickt werden können, ohne, dass die komplette Seite neu geladen wird, und somit die anderen Formularfelder der anderen Formulare wieder gelöscht sind.
Hier nochmal das Script.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<meta name="robots" content="follow" />
<script type="text/javascript">
var request = false;
try {
request = new XMLHttpRequest();
} catch (trymicrosoft) {
try {
request = new ActiveXObject("Msxml2.XMLHTTP");
} catch (othermicrosoft) {
try {
request = new ActiveXObject("Microsoft.XMLHTTP");
} catch (failed) {
request = false;
}
}
}
if (!request)
alert("Error initializing XMLHttpRequest!");
function getCustomerInfo(field) {
var field = document.getElementById(field).value;
var url = "writephone.php?phone=" + escape(field);
request.open("GET", url, true); //true bedeutet asynchron
request.onreadystatechange = updatePage; //onreadystatechange = callback
request.send(null);
}
function updatePage() {
if (this.readyState == 4) {
if (this.status == 200)
alert("Server is done!");
else if (this.status == 404)
alert("Request URL does not exist");
else
alert("Error: status code is " + this.status);
}
}
</script>
<title>Ajax-Test</title>
</head>
<body>
<form method="post" action="">
<p>Enter your phone number:
<input type="text" size="14" name="phone" id="phone"
onchange="getCustomerInfo(this.id);" />
</p>
<p>Your order will be delivered to:</p>
<p>Type your order in here:</p>
<p><textarea name="order" rows="6" cols="50" id="order" onchange="getCustomerInfo(this.id);"></textarea></p>
<p><input type="submit" value="Order Pizza" id="submit" /></p>
</form>
<form method="post" action="">
<input type="text" name="testfeld" value="" />
<input type="submit" name="submit" value="Testfeld absenden" />
</form>
</body>
</html>
Markus
Yerf!
ok, danke. Ich weiß jetzt, was du meinst. Dennoch besteht das Problem trotzdem.
Allerdings benutzt du noch immer request als globales Objekt. Pack mal den Anfang des Scripts mit der Objekt-Erzeugung (inklusve der Variablendeklaration von request) in deine Funktion "getCustomerInfo". Damit erstellst du dann für jeden Aufruf ein neues lokales Request-Objekt.
Gruß,
Harlequin
Hallo,
ja, so merkt man einen Unterschied. Der Fehler entsteht nicht mehr, und das Popup fühlt sich schneller an.
Danke. So klappt es.
Markus