Opera ab 8.0 und window.closed
![](/uploads/users/avatars/000/000/018/thumb/waechter.png)
- javascript
Hi,
ich hab grad ne halbe "Ewigkeit" einen Fehler in Opera gesucht.
Eigentlich ganz simples Ding.
var win = null;
//irgendwann später:
if (!win || win.closed)
win = window.open("about:blank", "bla");
//irgendwann später:
if (!win || win.closed)
win = window.open("about:blank", "bla");
Also, jedesmal, wenn das Fenster benötigt wird, wird geprüft, ob es überhaupt noch nicht angelegt wurde (!win) oder falls es schon angelegt wurde, ob es geschlossen wurde.
Funktionierte so auch in den relevanten Browsern (Uralt-Browser wie NS 4.x scheiden schon vorher aus, das ist Absicht) IE 5.0, 5.5, 6.0, Firefox 1.0.7, Mozilla 1.7, Opera 7.54.
Opera 8.02 und 8.5 weigerten sich aber, das Fenster wieder zu öffnen, nachdem ich es geschlossen hatte.
Also die Werte mal ausgegeben:
alert(!win + " " + win.closed)
[object] false
solange das Fenster noch existiert. Alles normal.
Aber wenn das Fenster geschlossen war, kam nicht das erwartete
[object] true
sondern das vollkommen unerwartete
[object] undefined
Da undefined im boolean-Kontext wie false zählt, kann win.closed im Opera 8.02/8.54 nie true werden.
Gelöst hab ich das jetzt erstmal per
if (!win || (win.closed !== false))
win = window.open("about:blank", "bla");
Ist das jetzt mein Fehler, daß ich bei geschlossenem Fenster den Wert true bei win.closed erwartet habe oder ist es ein Fehler in den neueren Operas, daß dort undefined statt true kommt?
SELFHTML (http://de.selfhtml.org/javascript/objekte/window.htm#closed) gibt mir recht:
closed
Speichert, ob ein Fenster, das zum Beispiel mit open() neu geöffnet wurde, mittlerweile geschlossen wurde. Hat den Wert true, wenn das Fenster geschlossen wurde.
Ist ja schön, daß der Opera jetzt kostenlos ist. Aber solche Fehler sollten eigentlich nicht sein. Und in Opera 7.54 geht's ja auch noch ...
cu,
Andreas
Hi,
Also die Werte mal ausgegeben:
alert(!win + " " + win.closed)
[...]
[object] undefined
interessant. Kannst Du Dir mal die Eigenschaften von win ausgeben lassen? Es scheint hier plötzlich zu einem nicht-Window-Objekt zu werden. Auch typeof(win) wäre hilfreich.
Ist das jetzt mein Fehler, daß ich bei geschlossenem Fenster den Wert true bei win.closed erwartet habe
Nein, das hätte ich ebenfalls erwartet.
Ist ja schön, daß der Opera jetzt kostenlos ist. Aber solche Fehler sollten eigentlich nicht sein.
Bei Opera gibt es mir zu viele Fehler, die in die Kategorie "unnötig" fallen. Deswegen kommt das Ding für mich als Nutzbrowser auch nicht in Frage - obwohl es über ein hinreichendes Maß an Genialität verfügt.
Cheatah
Hi,
interessant. Kannst Du Dir mal die Eigenschaften von win ausgeben lassen? Es scheint hier plötzlich zu einem nicht-Window-Objekt zu werden. Auch typeof(win) wäre hilfreich.
alert(typeof(win)) ist object, egal, ob das Fenster noch offen ist oder schon geschlossen.
alert(win) ergibt [object Window] bei noch offenem Fenster, [object Object] nach dem Schließen.
cu,
Andreas
Hi,
alert(typeof(win)) ist object, egal, ob das Fenster noch offen ist oder schon geschlossen.
schade.
alert(win) ergibt [object Window] bei noch offenem Fenster, [object Object] nach dem Schließen.
Das unterstützt meine Vermutung, dass sich das Objekt verändert. Über welche Eigenschaften verfügt es?
Cheatah
Hi,
Das unterstützt meine Vermutung, dass sich das Objekt verändert. Über welche Eigenschaften verfügt es?
Wenige:
for (property in win)
{
alert(property);
}
erzeugt bei geschlossenem Fenster keinen einzigen Alert.
cu,
Andreas
Opera 8.02 und 8.5 weigerten sich aber, das Fenster wieder zu öffnen, nachdem ich es geschlossen hatte.
Das Problem hatt ich vor einigen Wochen auch schon.
http://forum.de.selfhtml.org/archiv/2005/7/t112177/#m708971
Also die Werte mal ausgegeben:
alert(!win + " " + win.closed)
[object] false
solange das Fenster noch existiert. Alles normal.
Aber wenn das Fenster geschlossen war, kam nicht das erwartete
[object] true
sondern das vollkommen unerwartete
[object] undefinedDa undefined im boolean-Kontext wie false zählt, kann win.closed im Opera 8.02/8.54 nie true werden.
Gelöst hab ich das jetzt erstmal per
if (!win || (win.closed !== false))
win = window.open("about:blank", "bla");
>
ich hab's in etwa so gelöst:
~~~javascript
if(!showFenster || showFenster.closed ||
typeof showFenster.closed == 'undefined' // Opera 8 Bugfix
) showFenster = wondow.open(....);
Struppi.
Hi,
) showFenster = wondow.open(....);[/code]
Muß das nicht Taekwondow.open heißen ;-) ;-) ;-)
cu,
Andreas