Stefan: Wenn Seite/Tab geschlossen wird, Funktion ausführen

Hallo HTML-Gemeinde!

Versuche gerade eine kleine HTML-Seite zu erstellen, auf der Daten gespeichert werden, solange man sich auf dieser Seite befindet. Diese Daten sollen jedoch nach schließen der Seite/des Tabs wieder gelöscht werden und genau hier befindet sich mein Problem. Wie kann man realisieren, dass nach schließen der Seite eine Funktion ausgeführt wird?

Meine eigenen Recherchen enden immer wieder im Befehl "onunload". Wurde auch hier auf SelfHTML dazu fündig und hab das Beispiel versucht, jedoch ohne Erfolg.

Das Beispiel sieht wie folg aus:

<html><head><title>Test</title>  
<script type="text/javascript">  
var Start = new Date();  
var Startzeit = Start.getTime();  
  
function Aufenthalt () {  
  var Ende = new Date();  
  var Endzeit = Ende.getTime();  
  var Aufenthalt = Math.floor((Endzeit - Startzeit) / 1000);  
  alert("Sie waren " + Aufenthalt + " Sekunden auf dieser Seite");  
}  
</script>  
</head>  
<body onunload="Aufenthalt()">  
<h1>Einen langen Aufenthalt auf dieser Seite!</h1>  
<p><a href="../../../index.htm">Und dann aber nix wie weg!</a></p>  
</body></html>

Nach verlassen der Seite sollte dies ein Alert ausgeben. Bei mir passiert das aber nicht. Nun die Frage, an was das liegt? Und natürlich die wichtigere Frage, wie kann man das beheben? Oder anders machen?

Getestet unter Google Chrome Version 33 und Mozilla Firefox Version 23.

Vielen Dank schon mal im voraus.

mfg
Stefan

  1. Hallo,

    Versuche gerade eine kleine HTML-Seite zu erstellen, auf der Daten gespeichert werden, solange man sich auf dieser Seite befindet. Diese Daten sollen jedoch nach schließen der Seite/des Tabs wieder gelöscht werden und genau hier befindet sich mein Problem. Wie kann man realisieren, dass nach schließen der Seite eine Funktion ausgeführt wird?

    das ist leider nicht so einfach - siehe:

    https://forum.selfhtml.org/?t=216824&m=1487885

    Grüße Basti

    1. das ist leider nicht so einfach - siehe:

      https://forum.selfhtml.org/?t=216824&m=1487885

      Grüße Basti

      Also wenn ich das richtig verstanden habe, sollte man so ein Problem über ein TimeOut lösen? Mit dieser Lösung kann ich mich jedoch nicht wirklich anfreunden, da das wieder andere Probleme mit sich bringt.

      Verstehe jedoch auch nicht, warum das nicht möglich sein sollte. Bestes Beispiel hierfür ist wohl Facebook. Wenn ich da einen beispielsweise einen Status schreibe, diesen nicht abschicke und dann die Seite verlassen will, kommt auch ein Alert, ob ich die Seite wirklich verlassen will. Nur dass ich halt keinen Alert will, sondern, dass eine Funktion ausgeführt wird.

      mfg

      1. Hallo,

        was und wie speicherst Du denn, solange der User auf der Seite ist?

        Grüße Basti

        1. Hallo,

          was und wie speicherst Du denn, solange der User auf der Seite ist?

          Grüße Basti

          Im Prinzip geht es darum, Daten (Kartenmaterial) von einen anderen Server zu holen, welcher der Nutzer dann auf meiner Seite nach seinen Wünschen filtern und anpassen kann. Die Tools, die das Filtern im Hintergrund möglich machen, erfordern es jedoch, dass die Daten erstmal lokal abgespeichert werden. Am Ende wird dann dem Nutzer die Datei bzw mehrere Dateien, wenn mehrere Abfragen, zum Download angeboten.

          Wenn der Nutzer die Daten downloadet, ist das ganze auch kein Problem. Dann kann ich sie ganz einfach löschen.

          Wenn der Nutzer jedoch die Seite einfach verlässt (also durch schließen des Tabs), bleiben die Daten somit lokal gespeichert, was natürlich nicht sinnvoll ist.

          Wobei mir beim Schreiben dieser Zeilen, doch die Lösung mit dem TimeOut wieder zu gefallen anfängt. Im Prinzip bräuchte ich doch bloß am Ende der ganzen Filtervorgänge die Zeit abfragen und dann zB 5 Minuten warten und wenn nichts passiert, lösche ich die Daten wieder. Sollte eigentlich möglich sein oder? Werde diesen Lösungsweg jetzt mal versuchen...

          Danke!

          mfg

          1. Hallo

            Wenn der Nutzer jedoch die Seite einfach verlässt (also durch schließen des Tabs), bleiben die Daten somit lokal gespeichert, was natürlich nicht sinnvoll ist.

            „Lokal“ heißt hier auf deinem Webserver, oder?

            Wobei mir beim Schreiben dieser Zeilen, doch die Lösung mit dem TimeOut wieder zu gefallen anfängt. Im Prinzip bräuchte ich doch bloß am Ende der ganzen Filtervorgänge die Zeit abfragen und dann zB 5 Minuten warten und wenn nichts passiert, lösche ich die Daten wieder. Sollte eigentlich möglich sein oder? Werde diesen Lösungsweg jetzt mal versuchen...

            Fünf Minuten halte ich für etwas knapp, aber ja, das ist ein gangbarer Weg. Überfällige PHP-Sessiondateien werden auf ähnliche Weise entsorgt. Bedenke aber bitte folgendes: Egal, wie groß du das Timeout wählst, wenn du die Prüfung und das Löschen mit PHP erledigst, bist du darauf angewiesen, dass das zuständige Skript auch angeworfen wird.

            Entweder du verlässt dich darauf, dass du regelmäßig Nutzer hast, die bei bestimmten Aktionen nebenbei dein Aufräumskript starten oder du hast ein von Nutzeraktionen unabhängiges Skript, das zur rechten Zeit durch einen Cronjob (unter Windows entsprechend ein geplanter Task) gestartet wird.

            Tschö, Auge

            --
            Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war.
            Terry Pratchett, "Wachen! Wachen!"
            ie:{ fl:| br:> va:) ls:[ fo:) rl:( ss:| de:> js:| zu:}
            Veranstaltungsdatenbank Vdb 0.3
            1. Hallo

              Wenn der Nutzer jedoch die Seite einfach verlässt (also durch schließen des Tabs), bleiben die Daten somit lokal gespeichert, was natürlich nicht sinnvoll ist.

              „Lokal“ heißt hier auf deinem Webserver, oder?

              Ja genau. Die unglückliche Wortwahl stammt daher, dass ich noch auf keinen Server arbeite sondern bloß auf einen Testrechner.

              Wobei mir beim Schreiben dieser Zeilen, doch die Lösung mit dem TimeOut wieder zu gefallen anfängt. Im Prinzip bräuchte ich doch bloß am Ende der ganzen Filtervorgänge die Zeit abfragen und dann zB 5 Minuten warten und wenn nichts passiert, lösche ich die Daten wieder. Sollte eigentlich möglich sein oder? Werde diesen Lösungsweg jetzt mal versuchen...

              Fünf Minuten halte ich für etwas knapp, aber ja, das ist ein gangbarer Weg. Überfällige PHP-Sessiondateien werden auf ähnliche Weise entsorgt. Bedenke aber bitte folgendes: Egal, wie groß du das Timeout wählst, wenn du die Prüfung und das Löschen mit PHP erledigst, bist du darauf angewiesen, dass das zuständige Skript auch angeworfen wird.

              Entweder du verlässt dich darauf, dass du regelmäßig Nutzer hast, die bei bestimmten Aktionen nebenbei dein Aufräumskript starten oder du hast ein von Nutzeraktionen unabhängiges Skript, das zur rechten Zeit durch einen Cronjob (unter Windows entsprechend ein geplanter Task) gestartet wird.

              Tschö, Auge

              Ob jetzt 5 Minuten reichen, sei mal dahingestellt. Das ist ja nur ein Wert, der sich schnell ändern lässt.

              Wobei ich das Problem jetzt eigentlich ganz primitiv gelöst habe. Die gewünschten Daten werden auf der HTML Seite ausgewählt. Erst mit Klick auf "OK" wird im Hintergrund auf den externen Server zugegriffen und die Filteroptionen ausgeführt. Danach wird die Datei direkt runtergeladen und auf dem Server (bzw bei mir lokal) wieder gelöscht.

              Eigentlich wollte ich das ganze ja benutzerfreundlicher machen, so dass sich der Nutzer die Daten vorher nochmals ansehen kann und auch mehrere Daten mit einer .zip downloaden kann. Da sich dieses Unterfangen, wie ich die Daten dann löschen soll, falls sie nicht runtergeladen werden, jedoch als schwieriger als gedacht herausgestellt hat, belasse ich es bei der einfacheren Variante.

              Für mich hat sich das Thema somit erledigt. Vielen Dank an dich und alle anderen, die mir versucht haben zu helfen :)

              mfg und noch einen schönen Abend
              Stefan

  2. Hallo,

    im Handler des unload-Event lassen sich keine Fenster oder Dialoge öffnen. Der Browser ignoriert das alert(). Siehe MDN.

    Das Einblenden eines Hinweises, der dem Nutzer auffordert, das Verlassen der Seite zu bestätigen, ist mit dem Event beforeunload möglich. Es erscheint dann ein Fenster mit Okay- und Abbrechen-Buttons. Über den returnValue lässt sich die Nachricht im Fenster bestimmen.

    Welchen Code willst du genau beim Schließen ausführen?

    Mathias

    1. Hallo,

      im Handler des unload-Event lassen sich keine Fenster oder Dialoge öffnen. Der Browser ignoriert das alert(). Siehe MDN.

      Das Einblenden eines Hinweises, der dem Nutzer auffordert, das Verlassen der Seite zu bestätigen, ist mit dem Event beforeunload möglich. Es erscheint dann ein Fenster mit Okay- und Abbrechen-Buttons. Über den returnValue lässt sich die Nachricht im Fenster bestimmen.

      Welchen Code willst du genau beim Schließen ausführen?

      Mathias

      Es geht eigentlich nur darum, eine PHP-Funktion aufzurufen, welche die Daten, die der Nutzer bis dahin generiert hat, wieder zu löschen.

      Also mit "beforeunload" erhalte ich zumindest schonmal das Fenster. Jetzt muss ich nur noch lernen, wie ich in JS eine PHP-Funktion aufrufen kann (JS sind leider nur minimalst-Kenntnisse vorhanden). Sollte doch funktionieren oder?

      mfg

      1. Hallo

        Es geht eigentlich nur darum, eine PHP-Funktion aufzurufen, welche die Daten, die der Nutzer bis dahin generiert hat, wieder zu löschen.

        Also mit "beforeunload" erhalte ich zumindest schonmal das Fenster. Jetzt muss ich nur noch lernen, wie ich in JS eine PHP-Funktion aufrufen kann (JS sind leider nur minimalst-Kenntnisse vorhanden). Sollte doch funktionieren oder?

        Ja, du kannst mit Ajax ein PHP-Skript auf dem Server aufrufen, welches die Daten löscht und die Durchführung an das JS-Skript zurückmeldet, womit sich dieses beendet.

        Tschö, Auge

        --
        Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war.
        Terry Pratchett, "Wachen! Wachen!"
        ie:{ fl:| br:> va:) ls:[ fo:) rl:( ss:| de:> js:| zu:}
        Veranstaltungsdatenbank Vdb 0.3
        1. Hello,

          Ja, du kannst mit Ajax ein PHP-Skript auf dem Server aufrufen, welches die Daten löscht und die Durchführung an das JS-Skript zurückmeldet, womit sich dieses beendet.

          aber nur aufrufen im Sinne von "anstoßen".

          Wenn die Client-Server-Verbindung bricht, weil das Browser-Fenster geschlossen wird, bricht auch die AJAX-Verbinung.

          Siehe PHP http://de3.php.net/manual/en/function.ignore-user-abort.php

          Dagegen musst Du frühzeitig etwas tun, sonst ist auch AJAX "for ashole".

          Liebe Grüße aus dem schönen Oberharz

          Tom vom Berg

          --
           ☻_
          /▌
          / \ Nur selber lernen macht schlau
          http://bikers-lodge.com
          1. Hallo

            Ja, du kannst mit Ajax ein PHP-Skript auf dem Server aufrufen, welches die Daten löscht und die Durchführung an das JS-Skript zurückmeldet, womit sich dieses beendet.

            aber nur aufrufen im Sinne von "anstoßen".

            Wenn die Client-Server-Verbindung bricht, weil das Browser-Fenster geschlossen wird, bricht auch die AJAX-Verbinung.

            Schon klar, aber war es nicht so, dass das JS-Skript auf eine Rückantwort auf die Anfrage wartet [1]? Damit sollte erreichbar sein, dass das Browserfenster bis dahin (oder einem festgelegten Timeout?) wartet, bis es schließt.

            [1] Ich muss jetzt mal mit hoffentlich gesundem Menschenverstand argumentieren, da ich mit Ajax bisher nix gemacht habe, als irgendwann (vor längerer Zeit) ein wenig rumzuspielen.

            Tschö, Auge

            --
            Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war.
            Terry Pratchett, "Wachen! Wachen!"
            ie:{ fl:| br:> va:) ls:[ fo:) rl:( ss:| de:> js:| zu:}
            Veranstaltungsdatenbank Vdb 0.3
          2. Hello,

            Ja, du kannst mit Ajax ein PHP-Skript auf dem Server aufrufen, welches die Daten löscht und die Durchführung an das JS-Skript zurückmeldet, womit sich dieses beendet.

            aber nur aufrufen im Sinne von "anstoßen".

            Wenn die Client-Server-Verbindung bricht, weil das Browser-Fenster geschlossen wird, bricht auch die AJAX-Verbinung.

            Siehe PHP http://de3.php.net/manual/en/function.ignore-user-abort.php

            Dagegen musst Du frühzeitig etwas tun, sonst ist auch AJAX "for ashole".

            Liebe Grüße aus dem schönen Oberharz

            Tom vom Berg

            Ok, da tritt dann schon das nächste Problem auf. Habe mit Ajax noch nie etwas zu tun gehabt. Aber versteh das auch nicht so ganz. Ich muss doch zuerst mit JS "prüfen", ob die Seite geschlossen wird oder? Wofür brauche ich da Ajax und was soll das machen?

            Und eine andere Idee, auf der ich durch den Link oben gestoßen bin:
            if(connection_status() != CONNECTION_NORMAL)

            Damit überprüfe ich ja, ob die Verbindung zum Nutzer abgebrochen ist. Sollte ich nicht damit auch irgendwie ans Ziel kommen. Müsste doch bloß zB alle 5 Sekunden überprüfen, ob die Verbindung noch besteht oder? Hab damit jetzt auch ein wenig rumgespielt, jedoch bisher leider ohne Erfolg.

            Aber auf jedenfall schonmal danke an alle :)

            mfg

            1. Hallo

              … mit Ajax ein PHP-Skript auf dem Server aufrufen, welches die Daten löscht und die Durchführung an das JS-Skript zurückmeldet, womit sich dieses beendet.

              Ok, da tritt dann schon das nächste Problem auf. Habe mit Ajax noch nie etwas zu tun gehabt. Aber versteh das auch nicht so ganz. Ich muss doch zuerst mit JS "prüfen", ob die Seite geschlossen wird oder? Wofür brauche ich da Ajax und was soll das machen?

              Ok, von vorne: Es war einmal …

              JavaScript ist eine Programmiersprache, mit der man Programme schreibt, die (unter anderem) lokal im Browser laufen. Um auf dem Webserver Aktionen auszulösen, gibt es in JavaScript die Möglichkeit, Requests an den Server zu schicken (z.B. auf ein bestimmtes PHP-Skript). Dabei kann man Daten an den Server senden und/oder vom dort aufgerufenen Skript zurückerhalten, um mit ihnen direkt im Browser etwas anzustellen. *Das* ist als Ajax bekannt.

              Und eine andere Idee, auf der ich durch den Link oben gestoßen bin:
              if(connection_status() != CONNECTION_NORMAL)

              Damit überprüfe ich ja, ob die Verbindung zum Nutzer abgebrochen ist. Sollte ich nicht damit auch irgendwie ans Ziel kommen. Müsste doch bloß zB alle 5 Sekunden überprüfen, ob die Verbindung noch besteht oder? Hab damit jetzt auch ein wenig rumgespielt, jedoch bisher leider ohne Erfolg.

              Ich finde zwar das Ansinnen der Funktion etwas komisch. Sie prüft, ob der das Skript aufgerufen habende Klient noch erreichbar ist (bitte User Comments beachten). Für deinen Fall hieße das aber, dass das PHP-Skript, mit dem du die Seite ausgeliefert hat, permanent weiterläuft, um zu prüfen, ob der Browser noch auf der Seite verweilt, bis das nicht mehr der Fall ist. Dann würde die Löschroutine anlaufen Ich bezweifle, dass das funktioniert.

              Tschö, Auge

              --
              Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war.
              Terry Pratchett, "Wachen! Wachen!"
              ie:{ fl:| br:> va:) ls:[ fo:) rl:( ss:| de:> js:| zu:}
              Veranstaltungsdatenbank Vdb 0.3