Homepage de.comp.lang.javascript
Homepage
de.comp.lang.javascript

FAQ de.comp.lang.javascript

FAQ
de.comp.lang.javascript

 

 

Bitte verwenden Sie als Einstiegsadresse in diese FAQ die Homepage der Newsgroup de.comp.lang.javascript. Der Aufenthaltsort dieser Seiten hier kann sich ohne Vorwarnung ändern.
 

 

Wie prüfe ich, ob ein Fenster geschlossen wurde?

Zuerst einmal braucht man eine Referenz auf das Fensterobjekt. Diese gibt es zum Beispiel als Rückgabewert der open-Methode:

   fref = open(...);

Wurde das Fenster über einem Link mit target="neuesFenster" geöffnet, kann man sich die Referenz so besorgen:

   fref = open("", "neuesFenster");

Ist man an dem Fenster interessiert, welches das aktuelle Fenster geöffnet hat, gibt es dazu die window-Eigenschaft opener:

   fref = opener;

Nun ist also fref eine Referenz auf das Fensterobjekt. Dieses Objekt existiert auch noch nachdem das betreffende Fenster bereits geschlossen wurde. Allerdings verliert es beim Schließen alle seine Eigenschaften - bis auf closed. closed bekommt den Wert true.

fref ist also geschlossen, wenn fref.closed==true.

So jedenfalls ist das in der Theorie und bei Netscape. Leider hat jedoch IE eine schwere Demenz beim Umgang mit Fensterreferenzen, weshalb das in der Praxis oft daneben geht.

Die Probleme treten auf, wenn das Fenster, das man anzusprechen versucht, geschlossen wurde. Je nach Konfiguration (Betriebssystem/IE-Version/IE-Einstellungen) passiert dann Folgendes:

  1. Der Browser stürzt ab.
  2. Der Browser liefert eine Fehlermeldung, die behauptet, der aufgerufene Server existiere nicht.
  3. Der Browser liefert eine beliebige andere Fehlermeldung.
  4. Alles funktioniert wie gewünscht.

Wenn bei der eigenen Konfiguration Fall 4 eintritt, heisst das noch lange nicht, dass es überall so ist.

Was tun? Es gibt zwei Möglichkeiten:

Die erste ist, sich vor jedem Zugriff auf ein anderes Fenster eine neue Referenz zu besorgen:

   fref = open("", "fensterName");
   // jetzt kann auf fref sicher zugegriffen werden
Anmerkung:
Das Ganze läuft "schöner", wenn man das Fenster unsichtbar positioniert:
   fref = open("", "fensterName", "rigth=99999");
Ist das Fenster noch offen, wird es nicht verschoben, ist es bereits geschlossen wird es (i.d.R.) nicht sichtbar positioniert und kann sofort wieder geschlossen bzw. korrekt positioniert werden.

(Wenn man sowas mit NN4 macht, weigert er sich irgendwann, neue Fenster zu erzeugen. Deshalb die open-Anweisung am besten nur IE ausführen lassen.)

Wurde das Fenster schon geschlossen, wird dabei natürlich ein neues, leeres Fenster erzeugt. Das kann man ja dann gleich wieder zumachen.

Die andere Lösung ist Error-Handling:

   fensterIstZu = false;
   onerror = function() {
      fensterIstZu = true;
      naechsteAnweisung();
      return true;
   }
   if (fref.closed) fensterIstZu = true;
   onerror=function() {
      return false;
   }
   naechsteAnweisung();

Dieses Stück Code prüft, ob fref geschlossen wurde. Je nachdem setzt es die Variable fensterIstZu auf true oder false. Anschließend wird naechsteAnweisung() ausgeführt.

Das funktioniert recht zuverlässig, weil oben erwähnter Fall 1 (Browser-Absturz) extrem selten ist, Fall 2 und Fall 3 aber abgefangen werden.

top

Diese Seite ist Teil der de.comp.lang.javascript FAQ. Die Einstiegsadresse lautet http://www.dcljs.de/. Der Text der Seite wurde erstellt von Wolfgang Schwarz (©).

 ______ letzte Änderung: 12/2012 ______ 

 
© S. Mintert, Ch. Kühnel