AJAX-Request abbrechen.
Markus B.
- javascript
Hallo,
vorweg ich bin was Ajax angeht noch relativ unerfahren. Habe erst eine Umsetzung im Einsatz.
Vorweg worum es geht:
Auf meiner Seite soll das Plugin von Wetter.de eingeblendet werden. Nur um Ladezeit der Seite zu reduzieren habe ich das Plugin als AJAX-Request gebaut, so dass es erst mit einer Verzögerung von 5 Sekunden geladen wird. Das geht auch so wie ich das wollte.
Wenn ich aber über mein php-Script - welches mir den Inhalt von wetter.de holt - keine Verbindung aufbauen kann lädt das Request schier endlos und das ist auch nicht das gelbe vom Ei. Also habe ich mir gedacht - im groben:
var loaded = false;
setTimeout('holeWetter()', 5000);
setTimeout('pruefeWetter()', 15000);
function holeWetter()
{
// hier wird der AjaxRequest gemacht
loaded = true;
}
pruefeWetter()
{
if(!loaded)
{} // mache alternative Ausgabe
}
In holeWetter() setze ich die globale Variable loaded auf true die in pruefeWetter als Bedingung genutzt wird. Wenn die Variable wie default auf false ist, setze ich anstelle des Wetters einen Text "kann nicht geladen werden". Wird das Wetter geladen wird von der holeWetter()-Funktion die Variable auf true gesetzt und die pruefeWetter() tut nix mehr.
Soweit so gut, geht ebenfalls. Das ganze zu sehen unter http://www.spielmannszug-meschede.de für Neugierige.
Nun gehe ich aber mal davon aus, dass der Request trotz meiner Ausgabe weiter läuft und eben nichts bekommt - weder "geht nicht" noch einen erfolgreichen Inhalt. Wie kann ich, wenn das überhaupt geht, diesen Request abschießen? Gibt es da vielleicht eine Funktion die über ein Referenzobjekt den Request beendet?
Danke für die Hilfe.
Gruß
Hi,
Wenn ich aber über mein php-Script - welches mir den Inhalt von wetter.de holt - keine Verbindung aufbauen kann lädt das Request schier endlos und das ist auch nicht das gelbe vom Ei.
Dann lass doch dieses Script entsprechend reagieren - indem du bspw. einen Timeout vorgibst, nachdem der Versuch, wetter.de zu kontaktieren, abgebrochen wird.
Beim herstellen der Verbindung ueber fsockopen kannst du direkt einen Timeout angeben - wenn du die Daten ueber file_get_contents o.ae. einliest, geht das evtl. ueber den context-Parameter (hab ich aber auch noch nicht ausprobiert).
Wie kann ich, wenn das überhaupt geht, diesen Request abschießen? Gibt es da vielleicht eine Funktion die über ein Referenzobjekt den Request beendet?
Selbstverstaendlich kennt das XMLHTTPRequest-Objekt eine Methode abort.
Zusammen mit einem Timeout (und asynchronem Request, natuerlich), sollte sich der Request damit nach vorgegebener Zeit beenden lassen.
MfG ChrisB
Beim herstellen der Verbindung ueber fsockopen kannst du direkt einen Timeout angeben - wenn du die Daten ueber file_get_contents o.ae. einliest, geht das evtl. ueber den context-Parameter (hab ich aber auch noch nicht ausprobiert).
Verstehe ich dich richtig, wenn ich den AJAX-Request abbreche, dass nicht zwangsläufig der php-Datenkanal geschlossen wird? Würde bedeuten, dass ich auch serverseitig einen Abschuss einbauen sollte. Da werde ich mich mal durch php.net lesen, was dazu zu finden ist. Danke für den Denkanstoß. Daran hatte ich noch garnicht gedacht. Hatte bisher nur den endlos laufenden JavaScript im Hinterkopf.
Selbstverstaendlich kennt das XMLHTTPRequest-Objekt eine Methode abort.
Zusammen mit einem Timeout (und asynchronem Request, natuerlich), sollte sich der Request damit nach vorgegebener Zeit beenden lassen.
abord() ... fast schon peinlich das ich darauf nicht selber gekommen bin. Danke sehr! Natürlich ist mein Request asynchron - andernfalls hätte ich ja keinen Ladezeitvorteil. Dann könnte ich es auch ganz stupide (wie von wetter.de vorgesehen) als Quelltext einfügen.
Gruß
Markus
Hi,
Verstehe ich dich richtig, wenn ich den AJAX-Request abbreche, dass nicht zwangsläufig der php-Datenkanal geschlossen wird?
Ich denke, Nein.
Das Manual bzgl. ignore_user_abort besagt,
"PHP will not detect that the user has aborted the connection until an attempt is made to send information to the client."
D.h. also, so lange dein Script noch an der Stelle "haengt", wo es versucht einen Request an den fremden Server aufzubauen, wird ein clientseitiger Abbruch auf keinen Fall eine Auswirkung haben.
MfG ChrisB