Aktion beim Beenden der Seite ausführen
Yrdetraxe
- javascript
Hallo,
ich habe eine Seite, bei der bei jeder Art des Beenden eine Aktion ausgelöst wird.
Das ganze funktioniert über die Funktion "onunload" welches ich im HTML-Body-tag <body onunload="quit()"> stehen habe.
Beim beenden der Seite wird eine JS-Funktion aufgerufen, das funktioniert in allen gängigen Browsern wunderbar,
und jetzt kommt das Problem...
ich möchte gerne einen PHP Code ausführen, den ich per window.open() in einer neuen Datei ausführe. Hierbei machen Firefox und IE7 keine Probleme, Opera jedoch blockiert die neu aufgerufene Seite als Popup, aber es ist wichtig das der PHP Code ausgeführt wird.
Der Grund dafür ist, dass ich eine Datenbank abfrage starte, NACHDEM der User auf der ersten Seite fertig ist. Es geht um die Dauer die der User auf der Seite geblieben ist, die dem "popup" per Get mitgeteilt wird.
Und eine andere Lösung als per window.open eine neue Seite mit der Abfrage zu öffnen, hab ich dafür nicht gefunden.
Über Hilfe würde ich mich freuen.
Mahlzeit,
ich möchte gerne einen PHP Code ausführen, den ich per window.open() in einer neuen Datei ausführe.
NÄÄÄCK! Du möchtest keinen PHP-Code ausführen, Du möchtest eine Anforderung an den Server senden.
Hierbei machen Firefox und IE7 keine Probleme, Opera jedoch blockiert die neu aufgerufene Seite als Popup, aber es ist wichtig das der PHP Code ausgeführt wird.
Wenn es wichtig ist, dass irgendein Skript auf dem Server irgendwas macht, verlasse Dich nicht auf Javascript. Das läuft beim Benutzer (oder eben auch nicht, wenn der Benutzer die Ausführung von Javascript verhindert) und entzieht sich Deiner Kontrolle.
Der Grund dafür ist, dass ich eine Datenbank abfrage starte, NACHDEM der User auf der ersten Seite fertig ist. Es geht um die Dauer die der User auf der Seite geblieben ist, die dem "popup" per Get mitgeteilt wird.
Dir ist aber schon klar, dass diese Werte nicht unbedingt stimmen müssen, vom Benutzer einfach manipuliert werden können und das der Benutzer auch generell verhindern kann, dass überhaupt Werte an den Server übergeben werden?
Und eine andere Lösung als per window.open eine neue Seite mit der Abfrage zu öffnen, hab ich dafür nicht gefunden.
Wieso schickst Du "onunload()" nicht ein Formular ab? So könntest Du auch Werte an den Server zurückgeben (wie aussagekräftig diese Werte sind, sei mal dahingestellt - s.o.) ... wichtig ist letztendlich ja für Dich nur, dass eine Anfrage an den Server gestellt wird - eine enventuelle Antwort muss ja eh nicht dargestellt werden, sehe ich das richtig?
MfG,
EKKi
NÄÄÄCK! Du möchtest keinen PHP-Code ausführen, Du möchtest eine Anforderung an den Server senden.
Ja, ich weiß ;) Wahr falsch formuliert.
Wenn es wichtig ist, dass irgendein Skript auf dem Server irgendwas macht, verlasse Dich nicht auf Javascript. Das läuft beim Benutzer (oder eben auch nicht, wenn der Benutzer die Ausführung von Javascript verhindert) und entzieht sich Deiner Kontrolle.
Ich weiß, aber meine ganze Seite funktioniert nur wenn JavaScript aktiviert ist (Joomla mit FacileForms), also ist das eher nicht das Problem.
Dir ist aber schon klar, dass diese Werte nicht unbedingt stimmen müssen, vom Benutzer einfach manipuliert werden können und das der Benutzer auch generell verhindern kann, dass überhaupt Werte an den Server übergeben werden?
Wie meinst du dass jetzt?
Wieso schickst Du "onunload()" nicht ein Formular ab? So könntest Du auch Werte an den Server zurückgeben (wie aussagekräftig diese Werte sind, sei mal dahingestellt - s.o.) ... wichtig ist letztendlich ja für Dich nur, dass eine Anfrage an den Server gestellt wird - eine enventuelle Antwort muss ja eh nicht dargestellt werden, sehe ich das richtig?
wie mach ich das mit dem Formular?
onunload("submit()") ???
Und ja, die Werte sollen "nur" bearbeitet und in eine Datenbank eingetragen werden. Das zu öffnende Fenster schliesst sich nach bearbeitung auch sofort wieder per "this.close();";
Auf den user hat das keine weiteren Auswirkungen.
Mfg Yrde
Hallo yrdetraxe,
Ich weiß, aber meine ganze Seite funktioniert nur wenn JavaScript aktiviert ist (Joomla mit FacileForms), also ist das eher nicht das Problem.
Schade.
Dir ist aber schon klar, dass diese Werte nicht unbedingt stimmen müssen, vom Benutzer einfach manipuliert werden können und das der Benutzer auch generell verhindern kann, dass überhaupt Werte an den Server übergeben werden?
Wie meinst du dass jetzt?
Naja, der Benutzer kann den Server ja senden was er will. Oder auch garnichts. Du kannst ja nicht beeinflussen, was der Browser beim Client alles mit deiner Seite einstellt und was der benutzer mit seinem Client angestellt hat.
wie mach ich das mit dem Formular?
onunload("submit()") ???
Fast.
z.B. onunload="document.namedeinesformulars.submit();"
Wobei ich auch hier nicht weiß, ob das jeder Browser so mitmacht.
Und ja, die Werte sollen "nur" bearbeitet und in eine Datenbank eingetragen werden. Das zu öffnende Fenster schliesst sich nach bearbeitung auch sofort wieder per "this.close();";
Mit dem Forumlar hast du kein neues Fenster.
Jonathan
Naja, der Benutzer kann den Server ja senden was er will. Oder auch garnichts. Du kannst ja nicht beeinflussen, was der Browser beim Client alles mit deiner Seite einstellt und was der benutzer mit seinem Client angestellt hat.
Mag sein, aber ich geh jetzt mal von dem DAU aus. ;) Der normaluser pfuscht ja nicht ständig in seinen Einstellungen rum.
Ausserdem startet beim laden der Seite ein Zähler per "setIntervall()" der die aktuelle Laufzeit des Fensters in ein Textfeld schreibt. Wenn ich jetzt ein Hiddenfeld erstelle in das dieser Wert geschrieben wird und das per Post sende, kann der User doch gar nichts beeinflussen. (Ich reden hier nicht von Hackern, sondern vom normal User. ;))
onunload="document.namedeinesformulars.submit();"
Funzt irgendwie nicht. Da passiert dann gar nüchts. In keinem Browser.
Mit dem Forumlar hast du kein neues Fenster.
Wie jetzt? Es muss doch die php datei auf dem Server trotzdem ausgeführt werden damit der PHP Code ausgeführt wird und die Daten in der Datenbank gespeichert werden???
mfg Yrde
Mahlzeit,
Ausserdem startet beim laden der Seite ein Zähler per "setIntervall()" der die aktuelle Laufzeit des Fensters in ein Textfeld schreibt. Wenn ich jetzt ein Hiddenfeld erstelle in das dieser Wert geschrieben wird und das per Post sende, kann der User doch gar nichts beeinflussen. (Ich reden hier nicht von Hackern, sondern vom normal User. ;))
Ich auch. Wenn ich in meinem Browser Javascript ausschalte, dann wird da nämlich nichts geschrieben.
onunload="document.namedeinesformulars.submit();"
Funzt irgendwie nicht. Da passiert dann gar nüchts. In keinem Browser.
Beweise? Fehlermeldungen? Sollen wir extra deinetwegen unsere Glaskugeln putzen?
Wenn Du natürlich kein Formular auf Deiner Seite hast, kann es auch nicht abgeschickt werden. Etwas Quellcode wäre also ziemlich hilfreich ...
Mit dem Forumlar hast du kein neues Fenster.
Wie jetzt? Es muss doch die php datei auf dem Server trotzdem ausgeführt werden damit der PHP Code ausgeführt wird und die Daten in der Datenbank gespeichert werden???
Ja und? Wird doch auch, wenn Du ein Formular an den Server abschickst? Und da Du ja weiter oben schriebst, dass Du die Zeit sowieso in ein <input>-Feld schreibst, kannst Du das doch auch in ein <form> mit passenden "action="- und "method="-Attributen packen und das Formular dann "onunload()" abschicken. Ich verstehe nicht, wo dabei das Problem liegen soll ...
MfG,
EKKi
Wenn ich in meinem Browser Javascript ausschalte, dann wird da nämlich nichts geschrieben.
Aber wie schon erwähnt, funzt die ganze Seite nur mit aktiviertem JS (Joomla & FacileForms), also mach ich mir darüber weniger Sorgen.
Beweise? Fehlermeldungen? Sollen wir extra deinetwegen unsere Glaskugeln putzen?
Warum nicht? :P
Fehlermeldungen und Beweise kann ich nicht bieten, da ich keine Fehler bekomme (selbst Firebug meldet nix) und zeigen kann ich es nicht, da alles zur Zeit noch nur lokal über Xampp läuft.
Hier aber der alte Quellcode:
<html>
<script type='text/javascript'> <!--
//====================================================================
function time()
{
s++;
<!-- Beendet die Sitzung mit Erreichen der Maximalen Laufzeit. -->
if (m == maxdauer)
{
this.close();
}
<!-- Berechnet die Zeit der session. -->
if (s == 60)
{s="00";m++;}
if (m == 60)
{m="00";h++;}
if (s.toString().length == 1)
{s="0"+s;}
if (m.toString().length == 1)
{m="0"+m;}
if (h.toString().length == 1)
{h="0"+h;}
document.LiveChat.time.value=h+":"+m+":"+s;
}
//====================================================================
function quit()
{
if (m != maxdauer && s != 0)
{
m++;
}
window.open("./dauer.php?dauer="+m,'_blank','menubar=no, resizable=no, scrollbars=no');
}
//====================================================================
var maxdauer = 5;
var s = 0;
var m = 0;
var h = 0;
setInterval('time()',1000);
//-->
</script>
<body onunload="quit();">
<form name="Test" method="post" action="./dauer.php">
<center><input name="time" size="8" readonly="readonly"/>
<input type="button" class="pbsenden" name="ende" value="beenden" onclick="window.close();">
</center>
</form>
</body></html>
Das hat jetzt überall bis auf Opera so wie es da steht funktioniert. Und bei Opera auch nur deshalb nicht, weil er das window.open() als Popup blockt.
Wenn ich jetzt aber statt
<body onunload="quit();">
<body onunload="document.Test.submit();">
schreibe, dann passiert nix. Er macht den Submit nicht, da weder das Testecho noch der Eintrag in die Datenbank aus der php Datei ausgeführt werden die er beim submit öffnen soll.
Hallo,
<body onunload="document.Test.submit();">
Es wäre eine schwerigende Sicherheitslücke, wenn dieser Code wirklich so ausgeführt würde. Wenn ein Benutzer eine Seite verlassen will, kann eine Seite das nicht verhindern und ihn auch nicht einfach auf eine andere Seite verweisen, als die, in dessen Richtung er die Seite gerade verlässt. Jeder halbwegs vernünftige Popup-Blocker dürfte aus demselben Grund auch onunload="window.open()" blocken.
Eine Ausnahme ist onbeforeunload, mit der man ein Dialogfenster anzeigen kann, um den Benutzer am Verlassen zu hindern. Das ist aber streng reguliert und man kann eben nicht sagen, dass einfach woandershin umgeleitet wird.
Mathias
Eine Ausnahme ist onbeforeunload, mit der man ein Dialogfenster anzeigen kann, um den Benutzer am Verlassen zu hindern. Das ist aber streng reguliert und man kann eben nicht sagen, dass einfach woandershin umgeleitet wird.
onbeforeunload wird aber von Opera nicht unterstützt. Ausserdem ruft onbeforeunload im Firefox, wenn ich window.open benütz die zu öffnende Seite gleich 2x auf.
Gibt es da denn keine andere Lösung?
Hallo,
Vergiss Popups, Formular usw., das ist alles extrem unzuverlässig. Nicht dass du das zuverlässig hinbekommst, aber zumindest weniger unzuverlässig. Ich würde versuchen, mit new Image einen Request zu starten:
window.onbeforeunload = window.onunload = function () {
(new Image).src = "/benutzer-ausloggen";
};
Du kannst dir nicht sicher sein, ob ein Browser das aufruft, aber die Chance ist relativ hoch, dass der Request beim Server ankommt.
Ob zwei Event-Handler nötig sind oder onunload reicht, müsstest du probieren.
Mathias
window.onbeforeunload = window.onunload = function () {
(new Image).src = "/benutzer-ausloggen";
};
Ich versteh nicht ganz warum ich jetzt ein neues Bild erstellen soll?
Das hat doch nix mit meinem Problem zu tun?
Und wenn ich testweise nen Alert nehme, dann bekomme ich den Alert beim Beenden der Seite gleich 3x hintereinander (2x vom onbeforeunload und 1x vom onunload). Das ist auch nicht sinn der Sache.
Ausserdem kommt Opera leider komplett nicht mit onbeforeunload zurecht. :(
Mfg Yrde
Hallo Yrdetraxe,
Ich würde das vorhaben eigentlich gleich vergessen. Dass es nicht Sinn der Sache ist, dass eine Seite, die geschlossen werden soll, noch Code aufruft oder popup-Fenster öffnet, sollte eigentlich klar sein.
So kannst du nicht die dauer ermitteln, die ein user auf der Seite geblieben ist. Besser du nimmst die Zeit vom ersten bis zum letzten request einer session oder ähnliches und/oder du bietest einen loguut-button an, wobei natürlich auch hier nicht sichergestellt ist, dass der benutzer den drückt.
Jonathan
wobei natürlich auch hier nicht sichergestellt ist, dass der benutzer den drückt.
Eben, genau dass ist das Problem. Die Zeit soll auch genommen werden, wenn der User das Fenster einfach schliesst. :(
Mfg Yrde
Hallo Yrdetraxe,
wobei natürlich auch hier nicht sichergestellt ist, dass der benutzer den drückt.
Eben, genau dass ist das Problem. Die Zeit soll auch genommen werden, wenn der User das Fenster einfach schliesst. :(
Du kannst dir auch nicht sicher sein, dass das javascript-Popup angezeigt wird. Stell dir alleine mal vor, dass der Computer abstürzt oder einen Stromausfall hat (wobei das noch relativ weit hergeholte Beispiele sind).
Es geht nicht zuverlässig! Und was nicht ordentlich geht, sollte man einfach sein lassen. Unzuverlässige Frickelsoftware ist grauenvoll.
Jonathan
Mahlzeit,
Es geht nicht zuverlässig! Und was nicht ordentlich geht, sollte man einfach sein lassen. Unzuverlässige Frickelsoftware ist grauenvoll.
!
MfG,
EKKi
Es geht nicht zuverlässig! Und was nicht ordentlich geht, sollte man einfach sein lassen. Unzuverlässige Frickelsoftware ist grauenvoll.
ich weiß, und dass hab ich auch nicht vor. Mein Ziel ist es ja die Seite auf möglichst allen Browsern gleichermassen darzustellen.
Gibts denn evtl. noch andere Lösungswege für mein Problem?
Trotzdem danke für eure Hilfe
Yrde
Mahlzeit,
Es geht nicht zuverlässig! Und was nicht ordentlich geht, sollte man einfach sein lassen. Unzuverlässige Frickelsoftware ist grauenvoll.
ich weiß, und dass hab ich auch nicht vor. Mein Ziel ist es ja die Seite auf möglichst allen Browsern gleichermassen darzustellen.
Darstellen? Es geht Dir doch gar nicht um Darstellung ... sondern darum, bei einem bestimmten Ereignis eine Anfrage an den Server zu schicken - mehr nicht. Es soll doch eh nichts dargestellt werden, oder? Was also ist Dein Problem?
Gibts denn evtl. noch andere Lösungswege für mein Problem?
Es wurden Dir mehrere genannt. Warum probierst Du nicht mal wenigstens einen wirklich aus?
MfG,
EKKi
Auch auf die Gefahr hin, dass die Frage dämlich ist:
Was bringt mir der Fakt dass ich einen Request an den Server stelle?
Ich kann zwar halbwegs programmieren, aber gerade die Kommunikation zwischen Client & Server ist teilweise noch ein wenig unklar für mich. Wenn ich einen Request an den Server stelle, wie kann ich dann einen PHP Code ausführen ohne dafür die Datei zu öffnen???
Ausserdem kommt Opera leider komplett nicht mit onbeforeunload zurecht. :(
Das ist doch egal!
Warum, es soll doch auch mit Opera richtig funktionieren.
@EKKI:
Ich probier doch aus was ihr hier vorschlagt, aber zum einen hat davon nichts so funktioniert wie ich es brauche, und bisher lief eigentlich alles auf onunload oder onbeforeunload hinaus, und dass ist, laut euch (und ich stimme ja zu), unzuverlässig.
Mfg Yrde
Mahlzeit,
Auch auf die Gefahr hin, dass die Frage dämlich ist:
Was bringt mir der Fakt dass ich einen Request an den Server stelle?
Ja, die Frage ist dämlich.
Bitte beantworte folgende Frage: Was genau möchtest Du beim Verlassen der Seite erreichen?
[_] Der Benutzer soll irgendwas sehen.
[_] Es sollen irgendwelche Daten in irgendeine Datenbank eingetragen werden.
Wenn letzteres der Fall ist, beantworte bitte folgende Frage:
[_] Um irgendwelche Daten in irgendeine Datenbank einzutragen, muss der Benutzer irgenwas sehen.
[_] Um irgendwelche Daten in irgendeine Datenbank einzutragen, müssen diese Daten auf irgendeine Weise an den Server übertragen werden.
Wenn letzteres der Fall ist, beantworte bitte folgende Frage:
[_] Wenn ich Daten an den Server übertragen will, muss der Benutzer irgendwas sehen.
[_] Wenn ich Daten an den Server übertragen will, muss ich nur diese Daten an den Server SCHICKEN (per Anfrage mittels GET oder POST), sonst nichts. Der Server hat die Daten dann bekommen und kann sie verarbeiten.
Wenn letzteres der Fall ist ... wieso jammerst Du dann immer rum, dass irgendwelche Popups nicht aufgehen oder der Benutzer dieses oder jenes nicht sieht? Es interessiert Dich schlicht einfach nicht - Hauptsache, der Server hat bekommen, was er bekommen soll.
Wenn Du jetzt immer noch nicht verstanden hast, was ich meine, lies Dich bitte nochmal intensivst in die Client-Server-Kommunikation bei HTTP ein ... wenn Du die Grundlagen nicht kennst, hat es keinen Sinn, Dir etwas erklären zu wollen.
Ich kann zwar halbwegs programmieren, aber gerade die Kommunikation zwischen Client & Server ist teilweise noch ein wenig unklar für mich. Wenn ich einen Request an den Server stelle, wie kann ich dann einen PHP Code ausführen ohne dafür die Datei zu öffnen???
Indem Du diesen Request an das entsprechende PHP-Skript stellst und diesem entsprechende Werte (per GET oder POST) übergibst? PHP wird auf dem Server ausgeführt, nicht auf dem Client. Und es ist für die Verarbeitung auch vollkommen unerheblich, ob Output generiert wird oder nicht, ob dieser an den Client geschickt wird oder nicht und ob der Client diesen überhaupt empfängt und darstellt oder nicht.
Dir fehlen anscheinend wirklich die Grundlagen. Bitte informiere Dich darüber, wie die Kommunikation zwischen Server und Client funktioniert und welche Art von Skript wo ausgeführt wird.
Ausserdem kommt Opera leider komplett nicht mit onbeforeunload zurecht. :(
Das ist doch egal!
Warum, es soll doch auch mit Opera richtig funktionieren.
Dann nimm "onunload()". Jonathan hat Dir im Übrigen deutlich gemacht, dass Du Dich eben NICHT darauf verlassen kannst, dass Dein Verfahren ÜBERHAUPT funktioniert ... egal mit welchem Browser. Wenn Du diese Tatsache nicht akzeptieren willst, sag Bescheid.
@EKKI:
Ich probier doch aus was ihr hier vorschlagt, aber zum einen hat davon nichts so funktioniert wie ich es brauche, und bisher lief eigentlich alles auf onunload oder onbeforeunload hinaus, und dass ist, laut euch (und ich stimme ja zu), unzuverlässig.
Das ist nicht wahr. Du hast mit alerts herumprobiert. Das hat nichts mit Deiner eigentlichen Problemstellung zu tun - Du wolltest einen Request an den Server absenden ... hast Du das versucht?
MfG,
EKKi
Tut mir leid dass ich nicht alles weiß.
Wenn Du jetzt immer noch nicht verstanden hast, was ich meine, lies Dich bitte nochmal intensivst in die Client-Server-Kommunikation bei HTTP ein
Das einzige zu dem Thema was ich spontan finde ist per AJAX, CGI oder PERL. Und da kann ich mich momentan zeitlich leider nicht auch noch einarbeiten. Und Ahnung hab ich davon keine, hab ich das letzte Jahr aber auch nicht gebraucht.
Wenn ich jetzt immer noch an dir vorbeireden sollte, dann gib mir doch bitte einen passenden Link. :)
Indem Du diesen Request an das entsprechende PHP-Skript stellst und diesem entsprechende Werte (per GET oder POST) übergibst? PHP wird auf dem Server ausgeführt, nicht auf dem Client. Und es ist für die Verarbeitung auch vollkommen unerheblich, ob Output generiert wird oder nicht, ob dieser an den Client geschickt wird oder nicht und ob der Client diesen überhaupt empfängt und darstellt oder nicht.
Dann nimm "onunload()". Jonathan hat Dir im Übrigen deutlich gemacht, dass Du Dich eben NICHT darauf verlassen kannst, dass Dein Verfahren ÜBERHAUPT funktioniert ... egal mit welchem Browser. Wenn Du diese Tatsache nicht akzeptieren willst, sag Bescheid.
Genau das ist es ja, auf der einen Seite sagt ihr das ONUNLOAD und ONBEFOREUNLOAD nicht zuverlässig funktionieren, ich aber bisher keine andere Möglichkeit gefunden habe die Daten beim BEENDEN Der Seite gescheit an den Server zu übermitteln.
Mir geht es auch nicht um die Popups oder irgendwelche Alerts, ich möchte gerne einfach dass beim BEENDEN der Seite irgendwie eine php skript auf dem Server angestoßen wird, dass die Daten die es bekommt verarbeitet und in der Datenbank speichert.
Aber das mit submit() hat nicht funktioniert und aus dem Hinweis von Molily mit dem new Image werd ich leider auch nicht schlau. :(
Was bringt es mir den Server anzustoßen, ohne dass er weiß was ich von ihm will.
Vielleicht steh ich auch einfach nur nach über 8 stunden an der Problematik ein wenig auf dem Schlauch.
Mfg Yrde
Ja, ich stand auf dem Schlauch.
Habs jetz doch, dank Molily's Hilfe.
Hallo,
Ich kann zwar halbwegs programmieren, aber gerade die Kommunikation zwischen Client & Server ist teilweise noch ein wenig unklar für mich. Wenn ich einen Request an den Server stelle, wie kann ich dann einen PHP Code ausführen ohne dafür die Datei zu öffnen???
Die Ausführung von serverseitigen Programmen hat nichts damit zu tun, ob ein Browser ein HTML-Dokument darstellt, das z.B. ein PHP-Script generiert hat (was du als »Datei öffnen« bezeichnest).
Eine kleine Erklärung, wie das dynamische Web so funktioniert:
1. Der Webbrowser auf dem Client-Rechner verbindet sich mit dem Webserver einen HTTP-Request.
2. Der Webserver empfängt ihn und verarbeitet ihn.
3. Der Webserver schaut, ob der Anfrage eine Datei entspricht. Wenn das eine .php-Datei ist, führt er dieses Script aus.
4. Das Script kann nun alle möglichen serverseitigen Operationen durchführen (z.B. Datenbankabfragen) und erzeugt die Antwort an den Browser. Das Script kann alle möglichen Antworten erzeugen. In erster Linie erzeugt es HTML-Dokumente (Inhaltstyp text/html), es kann aber prinzipiell alle möglichen Daten zurücksenden (Bilder, PDF, Flash usw.). Es muss übrigens keine Antwort erzeugen. Es kann auch ablaufen und das tun, was es tun soll, ohne eine Ausgabe zu erzielen.
5. Die Scriptausführung wird beendet und der Webserver überträgt das Ergebnis, d.h. die Ausgaben des PHP-Scriptes, an den Webbrowser.
6. Der Webbrowser entscheidet nun, je nach Inhaltstyp der Antwort, was mit den empfangenen Daten zu tun ist. Wenn es ein HTML-Dokument ist, kann er es selbst darstellt, wenn es eine Grafik ist, meistens auch, ansonsten wird ein Plugin aufgerufen oder ein Download-Dialog angezeigt.
Nur die Schritte 1 und 6 sind die, wo der Browser eine aktive Rolle spielt.
Die restlichen sind serverseitige Prozesse, die automatisch ablaufen, sobald der Webserver den Request entgegengenommen hat.
Was du jetzt machen willst (soweit ich dich verstehe), ist im Hintergrund Daten an den Server zu übermitteln, indem du einen Request auslöst. Deinem Beispiel entnehme ich, dass du ./dauer.php mit dem Parameter dauer=irgendwas aufrufen willst.
Gut, mit
(new Image).src = "./dauer.php?dauer=" + param;
kannst du einen Request auslösen und den Wert der JavaScript-Variablen »param« als Wert für den Parameter »dauer« übermitteln. Es wird dann die obige Schritte durchlaufen: 1., 2., 3., 4. und wahrscheinlich 5.
Der Witz ist halt, dass dieser Request im Hintergrund passiert: Der Browser macht nichts mit der Serverantwort, er speichert sie lediglich. Wenn es ein Bild ist, kann man es dann ins Dokument einbauen und erst dann wäre es sichtbar.
Wenn du nun bei onunload diesen Request auslöst, dann wird höchstwahrscheinlich zumindest der Schritt 1 durchgeführt. Sprich, der Browser sendet den Request ab.
Wie gesagt sind damit Prozesse auf der Serverseite und die gewünschte Scriptausführung angestoßen. Was danach auf der Browserseite passiert, ist völlig egal! Schritt 6 muss nicht eintreten. Und er findet auch nicht statt, denn meist hat der Browser zu dem Zeitpunkt schon längst die Verbindung zum Server gekappt oder der gesamte JavaScript-Kontext, in dem du new Image aufgerufen hast, wurde schon verworfen. Oder der Browser ist insgesamt schon längst geschlossen. Wenn dann eine Antwort kommt, läuft sie ins Leere.
Hauptsache ist, dass das Script dauer.php mit dem Parameter angestoßen wird. Das Script soll, soweit ich dich verstehe, ja sowieso nichts anderes tun, als die übergebenen Daten speichern - es muss eh keine Antwort zurücksenden.
Warum, es soll doch auch mit Opera richtig funktionieren.
Lies. bitte. mein. Posting. Danke.
Mathias
Danke, jetzt versteh ich was du meinst.
Wie gesagt, nach 8 Stunden ist die Konzentration ein wenig gedämpft und ich sitz auf dem Schlauch.
Muss ich gleich ma testen.
Wunderbar,
jetzt funktioniert es so wie es soll.
Ich entschuldige mich nochma für meine lange Leitung
und danke für eure Geduld. ;)
Mfg Yrde
Hallo,
Ich versteh nicht ganz warum ich jetzt ein neues Bild erstellen soll?
Das hat doch nix mit meinem Problem zu tun?
Lies doch nochmal mein Posting.
Es wird damit kein Bild erstellt, sondern ein HTTP-Request angestoßen. Der Browser will die angegebene Ressource vom Server holen.
WAS der Server zurücksendet, ist dir aber egal, schließlich willst du ihm nur Bescheid geben und ein paar Daten übermitteln.
Deswegen ist es auch egal, dass der Server nicht mit einem Bild antwortet. Schließlich interessiert dich die Serverantwort gar nicht. Hauptsache, der Request ist angekommen.
DAFÜR ist new Image m.M.n. ideal.
Und wenn ich testweise nen Alert nehme, dann bekomme ich den Alert beim Beenden der Seite gleich 3x hintereinander (2x vom onbeforeunload und 1x vom onunload). Das ist auch nicht sinn der Sache.
Warum solltest du auch einen alert nehmen?
Die doppelte Schreibweise soll dafür sorgen, dass auf jeden Fall ein Server-Request gestartet wird.
Wenn das mehrere sind, ist das erstmal egal, Hauptsache, die Daten kommen an (wenn sie mehrfach ankommen, ist es nicht schlimm, du müsstest dann nur damit rechnen in deinen Serverscripten). Der Browser cacht im übrigen.
Natürlich könntest du auch einfach eine Variable setzen, die abfragt, ob schon ein Image erzeugt wurde, dann werden die Daten nicht mehrfach gesendet.
Ausserdem kommt Opera leider komplett nicht mit onbeforeunload zurecht. :(
Das ist doch egal!
Mathias