Funktion von außen abbrechen
Rosali
- javascript
Salut,
ich habe ein Frage:
Angenommen ich rufe eine Javascript-Funktion auf. Diese ruft php-Funktionen usw. auf. Zum Beispiel so:
document.getElementById("showForm").action = "index.php?option=test";
document.getElementById("showForm").method = "post";
document.getElementById("showForm").submit();
Die php-Funktion läuft "im Hintergrund" (hat zunächst keine sichtbaren Auswirkungen) und am Ende der Funktion wird dann die neue Seite geladen.
Unter Umständen kann es sehr lange dauern, bis die php-Funktion beendet wird.
Nun würde ich gerne dem User die Möglichkeit geben über einen Abbrechen-Button (also eine zweite Javascript-Funktion) die php-Funktion (bzw. die erste Javascript-Funktion ?!) abzubrechen.
Geht das? Hat man überhaupt die Möglichkeit den Button zu bedienen, wenn im Hintergrund noch die php-Funktion läuft?
Ich weiß, das ist ziemlich theoretisch. Aber ich plane gerade, bevor ich implementiere...
Rosali
Ahoi,
du weißt, was clientseitig und serverseitig bedeutet und auch, was ein Request an den Server ist, den der Client (Browser) sendet?
Dank und Gruß,
Clientseitig ist Javascript und serverseitig ist php.
Und Request ist der Code, den ich oben geschrieben habe?!
Rosali
Hi,
Clientseitig ist Javascript und serverseitig ist php.
Und Request ist der Code, den ich oben geschrieben habe?!
Nein, der stellt lediglich das Absenden eines Formulars per JavaScript dar.
Daraus *macht* der Browser dann einen Request - er stellt über HTTP eine Anfrage an den Server. Zu dem Zeitpunkt ist dein gezeigter JavaScript-Code aber schon längst "fertig", abgearbeitet, done, finito, gestorben. Diesen jetzt also noch "abbrechen" zu wollen, ist unsinnig.
MfG ChrisB
er stellt über HTTP eine Anfrage an den Server. Zu dem Zeitpunkt ist dein gezeigter JavaScript-Code aber schon längst "fertig", abgearbeitet, done, finito, gestorben. Diesen jetzt also noch "abbrechen" zu wollen, ist unsinnig.
Wieso, wenn ich ein Formular absende und der Browser auf die Serverantwort wartet, wird das aktuelle Dokument doch weiterhin dargestellt und reagiert auf Eingaben, darin kann also auch mittels JavaScript auf Eingaben reagiert werden, und ich kann natürlich auch Sachen wie location.irgendwas, history.irgendwas, window.stop usw. machen
Mathias
Wieso, wenn ich ein Formular absende und der Browser auf die Serverantwort wartet, wird das aktuelle Dokument doch weiterhin dargestellt und reagiert auf Eingaben, darin kann also auch mittels JavaScript auf Eingaben reagiert werden, und ich kann natürlich auch Sachen wie location.irgendwas, history.irgendwas, window.stop usw. machen
Ist das so?
(Mathias hat verstanden, was ich will, glaube ich. Danke. =))
Kann ich der vorhergehenden Diskussion entnehmen, dass man dergleichen eher mit Ajax löst?
Dann folgendes:
(Entschuldigt meine laienhafte und vielleicht missverständliche Ausdrucksweise. Ich kann's nicht besser...)
Ich mache einen Ajax-Request. Der ruft dann die vorhin erwähnte php-Test-Funktion auf, die lange andauern könnte. Wenn der Ajax-Request zurückkommt, geht's weiter, ich rufe die entsprechende Seite auf. Soweit so gut.
Während der Ajax-Request läuft, wird der Abbrechen-Button gedrückt. Jetzt soll also der Ajax-Request (bzw. die php-Funktion dahinter ?!) abgebrochen werden. Wie mache ich das?
Danke euch.
Rosali
Hi,
Kann ich der vorhergehenden Diskussion entnehmen, dass man dergleichen eher mit Ajax löst?
Kommt drauf an.
Mathias schlägt ja Wege vor, auf denen man es auch so wie mit einem "normalen" Request probieren könnte.
Ich mache einen Ajax-Request. Der ruft dann die vorhin erwähnte php-Test-Funktion auf, die lange andauern könnte. Wenn der Ajax-Request zurückkommt, geht's weiter, ich rufe die entsprechende Seite auf. Soweit so gut.
Nein, i.a.R. ruft man dann keine neue Seite auf, sondern gibt die Antwortdaten im bestehenden Dokument aus.
Während der Ajax-Request läuft, wird der Abbrechen-Button gedrückt. Jetzt soll also der Ajax-Request (bzw. die php-Funktion dahinter ?!) abgebrochen werden. Wie mache ich das?
Hinweise dazu wurden dir schon gegeben, u.a. der auf die abort-Methode des XMLHttpRequest-Objektes.
MfG ChrisB
Ahoi,
vielleicht beschreibst du mal, was genau du erreichen willst. Und warum.
Dank und Gruß,
vielleicht beschreibst du mal, was genau du erreichen willst. Und warum.
Der User drückt auf einer Seite den test-Button.
Jetzt soll eine bereits implementierte php-Test-Funktion aufgerufen werden. Die Module dahinter sind sehr langsam, der Test kann also lange dauern. Dann sollen die Ergebnisse des Testes angezeigt werden.
Und nun möchte ich dem User eben die Möglichkeit geben mit Hilfe eines Abbrechen-Buttons den Test abzubrechen.
Ich hoffe, das ist verständlich erklärt...
Rosali
Hi,
Der User drückt auf einer Seite den test-Button.
Jetzt soll eine bereits implementierte php-Test-Funktion aufgerufen werden. Die Module dahinter sind sehr langsam, der Test kann also lange dauern. Dann sollen die Ergebnisse des Testes angezeigt werden.Und nun möchte ich dem User eben die Möglichkeit geben mit Hilfe eines Abbrechen-Buttons den Test abzubrechen.
Also ist das, was da beim "Testen" durchgeführt wird, eher nice-to-have, als obligatorisch?
Du könntest den Test auch einfach in einem Popup/neuen Fenster aufrufen - das kann der Nutzer dann einfach schliessen, wenn seine Geduld auf dem Nullpunkt angekommen ist.
MfG ChrisB
Also ist das, was da beim "Testen" durchgeführt wird, eher nice-to-have, als obligatorisch?
Wenn man sich entscheidet den Test zu machen, dann muss man ihn auch obligatorisch komplett durchlaufen lassen um ein Ergebnis zu haben. Aber man wird nicht zum Testen gezwungen.
Du könntest den Test auch einfach in einem Popup/neuen Fenster aufrufen - das kann der Nutzer dann einfach schliessen, wenn seine Geduld auf dem Nullpunkt angekommen ist.
WAS der test genau macht, hat den User nicht zu interessieren. Am Schluss sollen dann die Fehlerergebnisse eingezeigt werden, und mit diesen wird auch weitergearbeitet.
Da ist ein Pop-up dann nicht so gut, glaube ich.
Hi,
Also ist das, was da beim "Testen" durchgeführt wird, eher nice-to-have, als obligatorisch?
Wenn man sich entscheidet den Test zu machen, dann muss man ihn auch obligatorisch komplett durchlaufen lassen um ein Ergebnis zu haben. Aber man wird nicht zum Testen gezwungen.
Darum geht es hier ja aber nicht - sondern um die Möglichkeit, den gestarteten Test im Zweifelsfalle unter Verzicht auf die Ergebnisse wieder abzubrechen.
WAS der test genau macht, hat den User nicht zu interessieren. Am Schluss sollen dann die Fehlerergebnisse eingezeigt werden, und mit diesen wird auch weitergearbeitet.
Da ist ein Pop-up dann nicht so gut, glaube ich.
AJAX dann vielleicht schon eher.
Damit kann der Nutzer die aktuelle Seite auch zwischendurch, während auf die Ergebnisse gewartet wird, noch in gewissem Rahmen weiter nutzen.
MfG ChrisB
Darum geht es hier ja aber nicht - sondern um die Möglichkeit, den gestarteten Test im Zweifelsfalle unter Verzicht auf die Ergebnisse wieder abzubrechen.
Ja genau, wenn der User den Test abbricht, dann müsste das php-Skript gestoppt werden und die bisherigen Ergebnisse sind dann verloren, das ist ok so.
AJAX dann vielleicht schon eher.
Damit kann der Nutzer die aktuelle Seite auch zwischendurch, während auf die Ergebnisse gewartet wird, noch in gewissem Rahmen weiter nutzen.
Mir ist gerade nicht klar, wie ich über das HTTPRequest Objekt und abort() einen Ajax-Request stoppen kann.
Aufgerufen habe ich ihn bis jetzt immer so in einer Javascript-Funktion:
new Ajax.Request("test.php",
{ method: 'post', onSuccess: follow, on Failure: alert("...") }
);
und dann die Definition von follow:
function follow(x) {
//mache irgendwas mit x.responseText;
}
Ist x dieses Request-Objekt?
Und wie könnte ich außerhalb der Javascript-Funktion in der sich obiges abspielt darauf zugreifen?
Rosali
Hi,
Mir ist gerade nicht klar, wie ich über das HTTPRequest Objekt und abort() einen Ajax-Request stoppen kann.
Aufgerufen habe ich ihn bis jetzt immer so in einer Javascript-Funktion:
new Ajax.Request("test.php",
{ method: 'post', onSuccess: follow, on Failure: alert("...") }
);
Dann nutzt du offenbar irgendein Framework, welches den Aufruf des XMLHttpRequest-Objektes in ein eigenes Objekt kapselt.
Also schau in der Doku dieses Frameworks nach, wie sich da ein solcher AJAX-Request wieder abbrechen lässt.
MfG ChrisB
--
Light travels faster than sound - that's why most people appear bright until you hear them speak.
Und nun möchte ich dem User eben die Möglichkeit geben mit Hilfe eines Abbrechen-Buttons den Test abzubrechen.
Die Frage ist immer noch, ob der Sinn der ganzen Sache ist, das serverseitig laufende PHP-Script zu unterbrechen?
Wenn ja, ist Ajax oder nicht eventuell gar nicht die Frage, sondern du musst clientseitig irgendwie (das wäre zu untersuchen) dafür sorgen, dass der Browser den Request abbricht und serverseitig dafür sorgen, dass in dem Fall der PHP-Prozess, der dein Script abarbeitet, gekillt wird (das wäre separat zu untersuchen).
Mathias
Die Frage ist immer noch, ob der Sinn der ganzen Sache ist, das serverseitig laufende PHP-Script zu unterbrechen?
Ja, im Grunde soll das PHP-Script unterbrochen werden. Und der User bleibt einfach auf der Seite, von der aus er den Test- bzw. Abbrechen-Button gedrückt hat.
Wenn ja, ist Ajax oder nicht eventuell gar nicht die Frage, sondern du musst clientseitig irgendwie (das wäre zu untersuchen) dafür sorgen, dass der Browser den Request abbricht und serverseitig dafür sorgen, dass in dem Fall der PHP-Prozess, der dein Script abarbeitet, gekillt wird (das wäre separat zu untersuchen).
Du meinst, ich muss den Browser-Request UND den PHP-Prozess abbrechen?
Hi,
Ja, im Grunde soll das PHP-Script unterbrochen werden. Und der User bleibt einfach auf der Seite, von der aus er den Test- bzw. Abbrechen-Button gedrückt hat.
[...]
Du meinst, ich muss den Browser-Request UND den PHP-Prozess abbrechen?
Wenn du obiges wirklich willst - ja.
Wenn es dir jedoch nur um den "auf der Seite bleiben"-Part geht, dann nicht unbedingt.
Mach dir die Unterschiede klar - damit du dann auch klar formulieren kannst, was genau jetzt die Anforderung darstellt.
MfG ChrisB
»» Ja, im Grunde soll das PHP-Script unterbrochen werden. Und der User bleibt einfach auf der Seite, von der aus er den Test- bzw. Abbrechen-Button gedrückt hat.
»» [...]
»» Du meinst, ich muss den Browser-Request UND den PHP-Prozess abbrechen?Wenn du obiges wirklich willst - ja.
Ich denke, das PHP-Script muss abgebrochen werden. Sonst läuft das irgendwie noch ne Stunde weiter, verbraucht Ressourcen und führt nur zu weiteren Komplikationen.
Hi,
Ich denke, das PHP-Script muss abgebrochen werden. Sonst läuft das irgendwie noch ne Stunde weiter, verbraucht Ressourcen und führt nur zu weiteren Komplikationen.
Dann ist, neben den bereits diskutierten clientseitigen Aspekten, für die das Kapitel über Connection handling im PHP-Manual von Interesse.
MfG ChrisB
Ahoi,
Und nun möchte ich dem User eben die Möglichkeit geben mit Hilfe eines Abbrechen-Buttons den Test abzubrechen.
Naja, im Grunde würdest Du den Test doch nicht abbrechen, sondern nur den Browser davon abhalten, auf die Antwort zu warten. Das geht doch auch über den Button "laden dieser Seite stoppen".
Dank und Gruß,
Hi,
Wieso, wenn ich ein Formular absende und der Browser auf die Serverantwort wartet, wird das aktuelle Dokument doch weiterhin dargestellt und reagiert auf Eingaben, darin kann also auch mittels JavaScript auf Eingaben reagiert werden, und ich kann natürlich auch Sachen wie location.irgendwas, history.irgendwas, window.stop usw. machen
Ja, window.stop hatte ich ja bereits erwähnt - ist aber nicht browserübergreifend verfügbar.
Klar kannst du location.href wieder auf was anderes setzen - aber vermutlich nicht unbedingt erwarten, dass der Browser da so reagiert, wie du das gerne hättest, selbst wenn es die gleiche Adresse wäre.
MfG ChrisB
window.stop hatte ich ja bereits erwähnt - ist aber nicht browserübergreifend verfügbar.
IE kennt document.execCommand("Stop")
Mathias
Ahoi,
Clientseitig ist Javascript und serverseitig ist php.
Und Request ist der Code, den ich oben geschrieben habe?!
Der Server schickt an dich einen Text. Das ist die Response. Dann ist Pause. Wenn du einen Link klickst oder ein Formular abschickst, die das ein Request. Eine Anfrage an den Server. Da kommt dann die IP noch mit, damit der Server weiß, wo er die nächste Response hinschicken soll. Den Server beim Antworten zu unterbrechen ist dann u.U. nur mit AJAX möglich. Wenn der Server denn bereit ist, darauf zu hören. Wenn er sich die Ohren zuhält, liefert er schlicht die Antwort aus, ob die nun mit PHP grade noch schnell erstellt wurde oder ob es eine html-Datei ist, ist ihm dabei vermutlich eher wurscht.
Dank und Gruß,
Hi,
Ich weiß, das ist ziemlich theoretisch.
Nein, das ist vor allem ziemlich konfus, deinerseits.
Geht das? Hat man überhaupt die Möglichkeit den Button zu bedienen, wenn im Hintergrund noch die php-Funktion läuft?
Von "im Hintergrund" kann da eigentlich kaum die Rede sein - bzw. da müsste man "Hintergrund" erst mal definieren.
Mit dem Abschicken eines Formulars per JavaScript machst du nichts grossartig anderes, als wenn du das Formular manuell abschicken, oder auch über einen Link eine neue Ressource anfordern würdest.
Was soll daran jetzt "hintergründiger" sein?
(Manche Browser kennen zwar eine Methode window.stop - aber das du mit der das gewünschte erreichen wirst, halte ich für unwahrscheinlich.)
"Im Hintergrund" wäre es eher, wenn du AJAX verwenden würdest. Und dabei hättest du bspw. die Möglichkeit, a) zu sagen, was mit der Antwort auf den Request passiert, interessiert mich ab Zeitpunkt X nicht mehr, wenn sie bis dahin noch nicht eingetroffen ist, und b) kennt das XMLHttpRequest-Objekt eine abort-Methode - wenn die aufgerufen wird, dann kann man ggf. auch noch serverseitig darauf reagieren, dass der Request vom Client abgebrochen wurde.
MfG ChrisB
Hallo,
Wenn du clientseitig window.stop() machst, schließt der Browser die Verbindung zum Server. Nun hat der Webserver ja eine PHP-Instanz gestartet, die dein Script ausführt. Jetzt müsste der Webserver merken: Der Client hat die Verbindung geschlossen, ist also nicht mehr an der Antwort interessiert. Üblicherweise wird dann (meines Wissens) der PHP-Prozess beendet: http://de.php.net/features.connection-handling
Informiere dich mal darüber und probiere aus, ob das Script wirklich beendet wird. Andernfalls kannst du das auch im Script prüfen.
Mathias