Cyril Belica: Wegklicken eines Fensters verhindern?

Hallo,

kann ich das Wegklicken (über das kleine Kreuz rechts oben) eines mit open()selbsterzeugten Fensters verhindern - oder zumindest in JavaScript abfangen/überwachen?

Der Hintergrund: Beim Öffnen des neuen Fensters wird ein remote Serverprozess gestartet, der beim Schliessen des Fensters benachrichtigt werden sollte, dass es jetzt Aus ist. Dazu gibt es in diesem Fenster einen "Verlassen"-Knopf. Klickt der Benutzer das Fenster einfach weg, läuft der Serverprozess nichtsahnend weiter und wartet und wartet und ... Das Problem ist nicht "lebenswichtig", da ich ohnenhin mit einer TimeOut-Regelung serverseits arbeiten muss, doch ich möchte den Benutzer beim Weggklicken zumindest warnen.

Die Situation ist zu sehen unter http://corpora.ids-mannheim.de/~cosmas

Vielen Dank,

Cyril

  1. hallo,

    onUnload ist der Event-Handler

    aber ich glaub du solltest vorher die selfhtml kontaktieren bevor du hier postest sonst könnten ein paar leute frustriert werden

    gerhard

    1. hallo,

      onUnload ist der Event-Handler

      aber ich glaub du solltest vorher die selfhtml kontaktieren bevor du hier postest sonst könnten ein paar leute frustriert werden

      gerhard

      Mich frustrieren eher solche Antworten wie diese da. Also noch mal und gaaaanz langsam: nur beim Wegklicken, nicht jedes Mal, wenn sich der Inhalt des Fensters ändert.

      Cyril

      1. Hi Cyril!

        Mich frustrieren eher solche Antworten wie diese da. Also noch mal und gaaaanz langsam: nur beim Wegklicken, nicht jedes Mal, wenn sich der Inhalt des Fensters ändert.

        und mich frustriert diese arrogante art, wie du gerhard behandest.

        Was hälst du davon wenn du dir den eventhandler doch nochmal ansiehst du dann vielleicht einmal auf die idee kommst, nicht immer das ganze frameset neu zu laden

        ich weiß zwar nicht was dein serverseiter prozess vollbringen soll - aber das hört sich für mich auch relativ holprig an das ganze - überdenke vielleicht mal das ganze grundkonzept. damit fallen dir die unsicherheitsfaktoren clientseitig weg - wenn man schon serverseitig programmiert - sollte dort auch die ganze logik stecken

        CU roman

        1. Hi Roman&Gerhard,

          es tut mir leid, wenn ihr meine Worte als arrogant empfunden habt. Ich habe nur versucht zu betonen, dass Gerhards Antwort nicht die Antwort auf MEINE FRAGE ist, ohne (unnötig ausführlich) zu begründen, warum. Und das sehe ich nach wie vor genau so. Den onUnload-Handler habe ich oft genug verwendet (auch auf den o.g. URLs), um zu wissen, wie er funktioniert, doch dass ist definitiv nicht das, was ich brauche. Bei dem erwähnten Serverprozess handelt es sich nämlich um ein älteres kommandozeilen- und sitzungsorientiertes Programm (über 90000 C-Quellcodezeilen), das nicht mehr weiterentwickelt wird und aus Konstengründen kaum noch modifiziert werden kann. Über die o.g. Web-Seiten kann das Programm dennoch einigermassen zeitgemäß genutzt werden. Also musste sich in diesem Fall das user interface leider der in diesem alten Programm implementierten bussines logic beugen und nicht umgekehrt. Größere Veränderungen an dem Programm sind einfach nicht drin. In diesem Sinne kann ich mit Ratschlägen wie "nicht immer das ganze Frameset laden" oder gar "das Grundkonzept überdenken" gar nichts anfangen <g>(und die FORMULIERUNGEN - nicht die Ratschläge! - kommen mir ein wenig arrogant vor)</g>.

          Also: kann ich das WEGKLICKEN abfangen oder nicht (eigentlich suche ich ein Pendant zum Java awt WindowEvent "public static final int WINDOW_CLOSING" oder einen Trick mit ähnlicher Auswirkung).

          Prajem vsetkym prijemny den,

          Cyril

          1. ok, lassen wir die wogen glätten

            wenn dus mit unload nicht machen kannst/willst oder es nicht geht, würd ich vorschlagen, du würdest ein java-applet schreiben, dort auf die form ein java-bean zum anzeigen einer webseite kleben, den button zum aufhören mit dem programm aus der website rausnehmen und auf die form kleben und dann kannst du die final methode verwenden. wenn der user auf den button klickt führst du eine relocation auf das browser fenster aus.

            gerhard

      2. paß auf:

        du willst daß deine seite nur mit einem knopf /link verlassen werden kann -> du setzt eine variable (leaving_allowed = 'YES' -> onUnload -> leaving_allowed == 'YES' ?? -> alert oder nix

        bitte entschuldige meine böse art, aber ein bißchen selbst nachdenken würd wohl nicht schaden...

        gerhard

  2. Soweit ich weiss, kann man nur vom oeffnenden Fenster aus das geoeffnete Fenster kontrollieren.

    Im Prinzip begruesse ich es, dass mich JS nicht hinden kann, Seiten zu verlassen... wo kaemen wir denn da hin...

    Nun, ich weiss ja nicht, ob Deine beiden Fenster mit dem Server kommunizieren koennen und wie man das macht, aber wenn, dann kann ja das Hauptfenster die Verbindung zum Server immer auf- und abbauen, wenn man ein Tocherfenster schliesst (das kann man ueberwachen) und das Tochterfenster koennte die Serververbindung abbauen, wenn man das Hauptfenster schliesst und sich selbst schliessen. Das wuerde ein recht dreckiges Polling noetig machen:
    Im Hauptfenster alle paar Millisekunden eine variable im Tochterfenster setzen, die im Tocherfenster dann kontrolliert und zurueckgesetzt wird, ebenfalls alle paar Millisekunden  (halb so oft oder so). Wenn das Hauptfenster dann nicht mehr sendet/pollt/die Variable umsetzt, dass hat man es wohl zugemacht, und der boese Anwender ist wohl gerade dabei, mit der Maus zum Close-Button desTochter-Browserfensters zu fahren...

    Aber vielleicht ist das ja viel zu unsophisticated fuer Dein grosses Problem :-)

    Bio

    1. Habe mir was besseres ausgedacht. Anscheinend kann man die Variable, in der das Hauptfenster gespeichert ist, auch ans Tochterfenster uebergegen... funktioniert erstaunlicherweise, haette nie gedacht, dass das geht. Geht vielleicht auch im IE.

      Hier die 2 Dateien, die den Effekt demonstrieren:
      (Nein, ich uebertreibe nicht... macht euch keine Sorgen, ich hab' die Zeit, ich sehen naemlich nicht mehr fern... wirklich sehr zu empfehlen!)

      Datei 2fenster.html:

      <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
      <html>
        <head>
          <script language="JavaScript">
            nf = window.open("2fenster2.html","fenster2");
            function control()
            {
            nf.test = eval(self);
            if (nf.closed)
              alert ("fenster geschlossen!");
            else
              window.setTimeout("control()",50);
            }
            setTimeout("control()",100);
          </script>

      <title>2fenster</title>
        </head>
        <body>
          <h1>2fenster</h1>
          <hr>
          <address><a href="mailto:aceop@gmx.net">Bio</a></address>
      <!-- Created: Fri Jan 14 13:55:13 CET 2000 -->
      <!-- hhmts start -->
      Last modified: Fri Jan 14 14:37:29 CET 2000
      <!-- hhmts end -->
        </body>
      </html>

      Datei 2fenster2.html:

      <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
      <html>
        <head>
          <script language="JavaScript">
            watchit=1;

      function doit()
            {
              if (test.closed)
                alert ("Hauptfenster geschlossen!");
              else
                window.setTimeout("doit()",50);
              
            }
            setTimeout("doit()",3000);
          </script>

      <title>2fenster</title>
        </head>

      <body>
          <h1>2fenster</h1>

      <hr>
          <address><a href="mailto:aceop@gmx.net">Bio</a></address>
      <!-- Created: Fri Jan 14 13:55:13 CET 2000 -->
      <!-- hhmts start -->
      Last modified: Fri Jan 14 14:02:31 CET 2000
      <!-- hhmts end -->
        </body>
      </html>

    2. Soweit ich weiss, kann man nur vom oeffnenden Fenster aus das geoeffnete Fenster kontrollieren.

      Im Prinzip begruesse ich es, dass mich JS nicht hinden kann, Seiten zu verlassen... wo kaemen wir denn da hin...

      Nun, ich weiss ja nicht, ob Deine beiden Fenster mit dem Server kommunizieren koennen und wie man das macht, aber wenn, dann kann ja das Hauptfenster die Verbindung zum Server immer auf- und abbauen, wenn man ein Tocherfenster schliesst (das kann man ueberwachen) und das Tochterfenster koennte die Serververbindung abbauen, wenn man das Hauptfenster schliesst und sich selbst schliessen. Das wuerde ein recht dreckiges Polling noetig machen:
      Im Hauptfenster alle paar Millisekunden eine variable im Tochterfenster setzen, die im Tocherfenster dann kontrolliert und zurueckgesetzt wird, ebenfalls alle paar Millisekunden  (halb so oft oder so). Wenn das Hauptfenster dann nicht mehr sendet/pollt/die Variable umsetzt, dass hat man es wohl zugemacht, und der boese Anwender ist wohl gerade dabei, mit der Maus zum Close-Button desTochter-Browserfensters zu fahren...

      Aber vielleicht ist das ja viel zu unsophisticated fuer Dein grosses Problem :-)

      Bio

      Hallo Bio,

      besten Dank. In der Tat müsste Deine Lösung IMHO funktionieren, nur - wie Du richtig sagst - würde die damit verbundene Last vermutlich in keinem vernünftigen Verhältnis zu dem erzielten Effekt stehen.

      Übrigens: ich habe nicht unbedingt erwartet, dass ich das Schliessen des Fensters definitiv verhindern kann, sondern nur, dass ich als dessen "opener" eventmäßig benachrigtigt werde, wenn es geschlossen wird (oder unmittelbar vor der Hinrichtung). So könnte ich nämlich noch meine Aufräumarbeiten erledigen. Danach kann der Browser mit dem Fenster tun, was er will.

      Bye,

      Cyril