XMLHttp.onreadystatechange: ich verstehe es einfach nicht :(
Paul
- javascript
0 ChrisB0 Paul
1 Tim Tepaße0 paul
Hi Leute,
ich möchte prüfen ob eine Webseite erreichbar ist, bevor ich sie scriptseitig versuche zu laden. Dazu verwende ich das untenstehende Script, das ich "geklaut" und angepasst habe - oder zumindest versuche :)
Eigentlich habe ich erwartet, dass das Script entweder online ODER offline per alert() anzeigt, das ist bei mir aber nicht der Fall. Das offline wird unverständlicherweise IMMER ausgegeben, aber immer erst nach dem online alerted wurde - gut, das kann natürlich eine optische täuschung sein - aber was zählt ist eben, dass es entweder vorher ausgegeben wird, obwohl es weiter unten im Code steht oder, dass das offline=false nicht greift (wobei ich eher die erste Variante vermute).
Mir ist im Grunde schleierhaft, wieso die Klammerung nicht greift.
Sprich das "xmlhttp.onreadystatechange" nicht komplett abgearbeitet wird (was auch immer das heißen mag). Und insbesondere wie ich mir das vorstellen muss: Das onreadystatechange ist ja wie ein Event zu verstehen oder? Wie wird der Code dann abgearbeitet? Also wann das send(null) ausgeführt? Ich hätte vermutet, dass die anonyme Funktion, die bei onreadystatechange deklariert wird solange/sooft aufgerufen wird, bis keine changes mehr möglich sind - geht das überhaupt?
Naja wie auch immer. Vielleicht gehe ich völlig falsch an die Sache ran und es gibt eine viel sinvollere Möglichkeit die Verfügbarkeit einer Webseite zu prüfen. Meine Fkt. soll natürlich später entweder per return oder durch setzen einer globalen Variable, oder durch direktes aufrufen einer anderen Fkt. agieren. Die alerts sind nur zu Debug- und Verständniszwecken eingebaut.
Danke allen, die sich hiermit beschäftigen,
Paul
var xmlhttp=false;
var offline=true;
try{
xmlhttp = new XMLHttpRequest();
}catch (e){
xmlhttp=false;
}
[...]
function webseiteErreichbar(){
xmlhttp.open("HEAD", window.location.href,true);
xmlhttp.onreadystatechange=function() {
if(xmlhttp.readyState==4) {
if (xmlhttp.status==200){
alert("online");
offline=false;
return;
}
}
}
xmlhttp.send(null)
if(offline){
alert("offline");
}
}
Hi,
Mir ist im Grunde schleierhaft, wieso die Klammerung nicht greift.
Sprich das "xmlhttp.onreadystatechange" nicht komplett abgearbeitet wird (was auch immer das heißen mag).
Wird es.
Und insbesondere wie ich mir das vorstellen muss: Das onreadystatechange ist ja wie ein Event zu verstehen oder? Wie wird der Code dann abgearbeitet? Also wann das send(null) ausgeführt?
send wird zu dem Zeitpunkt ausgefuehrt, wo du es aufrufst.
Aber die Verarbeitung des synchronen Requests wird erst dann aufgerufen, wenn die Aenderung des per onchange "ueberwachten" Events eintritt - wenn sich der readyState des Requestobjektes aendert. *Asynchron* eben, wie das A in AJAX ...
Ich hätte vermutet, dass die anonyme Funktion, die bei onreadystatechange deklariert wird solange/sooft aufgerufen wird, bis keine changes mehr möglich sind - geht das überhaupt?
Ja, genau das passiert. Der readyState durchlaeuft verschiedene Stati.
Aber deine Ausgabe des Wertes am Ende wird einfach so nach dem send aufgerufen, und zu diesem Zeitpunkt steht der Wert natuerlich noch nicht zur Verfuegung, weil der Request noch gar nicht fertig ist.
onreadystatechange ist das, was beim asynchronen AJAX-Request zu "warten" auf die Abarbeitung des Requests genutzt wird.
MfG ChrisB
Auch dir ChrisB nochmal vielen Dank.
Jetzt verstehe ich die Sache endlich!
Gruß,
Paul
Hallo,
xmlhttp.onreadystatechange=function() {
Hier hängs Du an das XMLHttpRequest-Objekt eine Funktion an, die immer ausgeführt wird, wenn sich der Zustand im Objekt ändert.
xmlhttp.send(null)
Hier „aktivierst“ Du das XHR-Objekt (Die Angabe von null ist übrigens nicht unbedingt notwendig). Das Objekt lebt nun und arbeitet und macht im Hintergrund den Request. Bzw. wird so ausgeführt, dass es sich wie Hintergrund anfühlt. Am besten vergleichst Du das mit verzögert ausgeführten Funktionen, die mit setTimeout() oder setInterval() gesetzt werden. Das XHR-Objekt lebt nun sozusagen getrennt von dem Skriptablauf, der hier direkt folgt:
if(offline){
Hier wird nämlich sofort gefragt ob offline bool'sches Falsch ist. Direkt. Das XHR-Objekt hat zu diesem Zeitpunkt noch keine Änderung an der Variable offline durchgeführt. Die Pizzabäckerin, noch beim Anrühren der Tomatensauce, hat ihren Lehrling mit dem Ausrollen des Teiges beauftragt, wundert sich aber eine Millisekunde später, weswegen da noch kein flacher Teigfladen liegt (da der Lehrling noch am Kneten ist). Die Ausführung der Funktion wartet also nicht auf das XHR-Objekt.
Du willst Deine offline-Abfrage zeitlich erst dann haben, wenn das XHR-Objekt fertig ist. Dann solltest Du diese in der onreadystate-Methode nach dem Zustand 4 abfragen oder von dort eine andere Funktion aufrufen:
~~~javascript
xmlhttp.onreadystatechange = function () {
if (this.readyState == 4) {
if (this.status == 200) {
alert("online");
return;
} else {
alert("offline");
return;
}
}
Tim
Du willst Deine offline-Abfrage zeitlich erst dann haben, wenn das XHR-Objekt fertig ist. Dann solltest Du diese in der onreadystate-Methode nach dem Zustand 4 abfragen oder von dort eine andere Funktion aufrufen:
Logo. Ich Esel habe angenommen, dass der readystate 4 nur angenommen werden kann, wenn auch eine Verbindung besteht...total unsinnig. Jetzt habe ichs kapiert :)
Danke für die Hilfe,
Paul