Fenster wieder neu öffnen
hambam
- javascript
Hallo Leute!
Ich möchte beim Click auf einen Link nichts anderes machen, als ein Fenster mit fester Größe
öffnen, daß eine HTML-Datei anzeigt.
So sieht der Link schonmal aus:
<a href="javascript:fehler()">Bildchen</a>
Die Javscript-Funktion sieht dann so aus:
function fehler() {
if ((fehler == null) (fehler.self==null)) {
fehler=window.open("", "fehler", width=250,height=250,left=300,top=320");
}
if(fehler.focus !=null) fehler.focus();
fehler.location.href="fehler.html";
}
Das erste Mal wird auch das Fenster geöffnet. Aber kein zweites Mal!
Sowohl, wenn ich den selben Link anklicke, als auch wenn ich einen anderen Link anklicke, der
genauso gestaltet ist.
Aber warum?
Ich hätte es gerne gehabt, daß, wenn das Fenster bereits offen ist, das Fenster den Fokus bekommt (hätte funktionieren sollen, tut's aber auch nicht) und wenn das Fenster nicht existiert,
dann öffne es neu.(klappt aber nur beim ersten Mal!)
Jemand eine Lösung für mich?
Danke für jede Art von Hilfe.
Hambam
Hallo Hambam
<a href="javascript:fehler()">Bildchen</a>
Die Javscript-Funktion sieht dann so aus:
function fehler() {
»» if ((fehler == null) (fehler.self==null)) {
fehler=window.open("", "fehler", width=250,height=250,left=300,top=320");
»» }
»» if(fehler.focus !=null) fehler.focus();
»» fehler.location.href="fehler.html";
}
Deine Probleme haben mehrere Ursachen, besonders die gleichen Bezeichnungen: fehler als Fenster-, Funktions- und Variablenname. Diese müssen geändert werden.
Du kannst dir die Abfrage nach dem Fenster sparen,
es reicht folgender Aufruf:
<script language="JavaScript">
<!--
function fehler(x) {
fehler1=window.open(x, "fehler2", "width=250,height=250,left=300,top=320");
setTimeout("fehler1.focus()",40)}
//-->
</script>
Anstatt x kannst du gleich den Dateinamen angegeben also "fehler.htm" und x rausnehmen. Vor der width- Angabe hattest du die Anführungsstriche vergessen. Das setTimeout ist für den IE5. Seit ich den installiert habe, fokusiert er bei mir ein Fenster nur noch mit einer Warteschleife.
Aufruf: <a href="JavaScript:fehler('fehler.htm')">Link</a>
Hi!
Die Javscript-Funktion sieht dann so aus:
function fehler() {
»» if ((fehler == null) (fehler.self==null)) {
'fehler' ist zu diesem Zeitpunkt die Referenz auf die Funktion fehler() (vgl.
<../../sfarchiv/1999_3/t05169.htm#a25106>), und da diese Funktion existiert,
ist die Referenz niemals null. 'fehler.self' bedeutet die self-Eigenschaft der Referenz
auf eine Funktion und sollte eigentlich einen Fehler verursachen. Allerdings ist ja die erste
Bedingung immer true, sodass die zweite hinter dem gar nicht ausgewertet wird.
fehler=window.open("", "fehler", width=250,height=250,left=300,top=320");
Aber spaetestens jetzt sollte es doch einen JS-Fehler geben, denn der Name 'fehler' ist
ja schon vergeben.
»» }
»» if(fehler.focus !=null) fehler.focus();
Hier versuchst Du ja auch die Existenz einer Funktion zu pruefen, indem Du die
Referenz auf diese auswertest.
»» fehler.location.href="fehler.html";
Warum nicht gleich den Dateinamen bei window.open() angeben?
}
Deine Probleme haben mehrere Ursachen, besonders die gleichen Bezeichnungen: fehler als Fenster-, Funktions- und Variablenname. Diese müssen geändert werden.
Richtig. Allerdings kann der Fenstername rihig so bleiben, da er in einem voellig anderen "Namensraum" (das heisst wirklich so, bzw. richtiger: name space) existiert und nichts mit der JS-Variable zu tun hat, die die Referenz auf das Fenster aufnehmen soll.
Du kannst dir die Abfrage nach dem Fenster sparen,
Statt dessen immer window.open() geht natuerlich auch. Nur wird doch da die Datei - entsprechende Cachesettings vorausgesetzt - immer neu vom Server geladen, oder? Es ist schon sauberer, erst auf Existenz zu pruefen und dann je nach Ergebnis window.open() window.focus() durchzufuehren. Dann muss man jedoch auch mit window.closed ueberpruefen, ob das Fenster bereits wieder durch den Benuzter geschlossen wurde (<../../tecb.htm#a2>).
Das ergibt dann diesen Code:
var fehlerwin = null;
function fehler() {
if (fehlerwin && (!fehlerwin.closed)) {
fehlerwin = window.open("fehler.html", "fehler", "width=250,height=250,left=300,top=320");
} else {
if (window.focus) fehlerwin.focus();
}
}
Ich hab mal absichtlich den Namen des Fensters wieder auf "fehler" gesetzt, um zu verdeutlichen, dass das kein Problem macht.
Das setTimeout ist für den IE5. Seit ich den installiert habe, fokusiert er bei mir ein Fenster nur noch mit einer Warteschleife.
&@^#*@( ??? Na gut, dann die eine Zeile eben umaendern in
if (window.focus) setTimeout("fehlerwin.focus();", 40);
Und da regen sie sich immer ueber die Netscape-Bugs auf...
Aufruf: <a href="JavaScript:fehler('fehler.htm')">Link</a>
Vorsicht! An dieser Stelle nie das Semikolon vergessen! Siehe <../../sfarchiv/1999_3/t04978.htm>.
Calocybe
Hallo Calobcy
bevor ich in den Urlaub gehe :-)noch einiges zur Funktion hier, die hat mir schon einiges Kopfzerbrechen bereitet:
Es ist schon sauberer, erst auf Existenz zu pruefen und dann je nach Ergebnis window.open() window.focus() durchzufuehren. Dann muss man jedoch auch mit window.closed ueberpruefen, ob das Fenster bereits wieder durch den Benuzter geschlossen wurde.
Das ergibt dann diesen Code:
var fehlerwin = null;
function fehler() {
if (fehlerwin && (!fehlerwin.closed)) {
fehlerwin = window.open("fehler.html", "fehler", "width=250,height=250,left=300,top=320");
} else {
if (window.focus) fehlerwin.focus();
}
}
Der IE3 kennt closed und auch focus() nicht und spuckt eine Fehlermeldung aus, schließt aber das Fenster trotzdem und der Navi 3 schließt das Fenster und bricht dann die Ausführung der Funktion ab. Da hilft nur die Trennung der Schließfunktion von der Öffnungsfunktion. Wenn man dann mit einem Link erst das Öffnen mittels setTimeout aufruft und dann die Schließfunktion klappt es.
Viele Grüße
Antje
Hi Antje!
Der IE3 kennt closed und auch focus() nicht und spuckt eine Fehlermeldung aus, schließt aber das Fenster trotzdem und der Navi 3 schließt das Fenster und bricht dann die Ausführung der Funktion ab. Da hilft nur die Trennung der Schließfunktion von der Öffnungsfunktion. Wenn man dann mit einem Link erst das Öffnen mittels setTimeout aufruft und dann die Schließfunktion klappt es.
Aeh... was? Wieso Schliessfunktion? Es sollte doch nur ein Fenster geoeffnet bzw. der Focus drauf gesetzt werden.
Stimmt, ich haette dran denken sollen, dass der IE3 closed und focus() nicht kennt. Aber Navi3 sollte sie eigentlich schon kennen, zumindest laut Selfhtml (na ok, die Angaben stimmen nicht immer).
Mmh, also erstmal muss ich feststellen, dass mein abgelieferter Code falsch rum ist, d.h. if- und else-Zweig sind vertauscht. Sollte also eigentlich heissen:
function fehler() {
if (fehlerwin && (!fehlerwin.closed)) {
if (window.focus) fehlerwin.focus();
} else {
fehlerwin = window.open("fehler.html", "fehler", "width=250,height=250,left=300,top=320");
}
}
Wenn ein Browser die focus()-Methode nicht kennt, sollte er "if (window.focus)" ja eigentlich zu false auswerten und demnach "fehlerwin.focus()" ignorieren. (Dummerweise bringt er ja dann das Fenster nicht wieder in den Vordergrund.) Genauso sollte er die closed-Eigenschaft mit false bewerten, denn es koennte ja z.B. der Test sein, ob eine closed()-Methode zur Verfuegung steht. Ich werde jetzt leider aus Deinem "schließt aber das Fenster trotzdem" nicht ganz schlau, deswegen biete ich vorerst mal diese veraenderte Variante an.
function fehler() {
if (fehlerwin && window.focus && (!fehlerwin.closed)) {
fehlerwin.focus();
return;
}
fehlerwin = window.open("fehler.html", "fehler", "width=250,height=250,left=300,top=320");
}
Wie gesagt, eigentlich sollte das funzen, aber wenn der IE3 da Fehler bringt, muss wohl leider eine Browserabfrage rein, oder man oeffnet das Fenster einfach jedesmal neu, wie Du es hattest.
Calocybe
Aeh... was? Wieso Schliessfunktion? Es sollte doch nur ein Fenster geoeffnet bzw. der Focus drauf gesetzt werden.
stimt, hatte ich übersehen, dieses Script mit dem anschließenden Schließen spukte noch in meinem Kopf herum
Stimmt, ich haette dran denken sollen, dass der IE3 closed und focus() nicht kennt. Aber Navi3 sollte sie eigentlich schon kennen, zumindest laut Selfhtml (na ok, die Angaben stimmen nicht immer).
Kennt der Navi schon, aber er verhält sich eben etwas seltsam zumindest meine N3-Version, dies bezieht sich jedoch nur auf close(). Mein Irrtum, außerdem
<selbstkritik> habe ich nicht richtig gelesen </selbstkritik>, und deshalb zwei Scripte miteinander vertauscht.
Mmh, also erstmal muss ich feststellen, dass mein abgelieferter Code falsch rum ist, d.h. if- und else-Zweig sind vertauscht. Sollte also eigentlich heissen:
Ich werde jetzt leider aus Deinem "schließt aber das Fenster trotzdem" nicht ganz schlau, deswegen biete ich vorerst mal diese veraenderte Variante an.
Ich auch nicht mehr. Für heute sollte ich wohl das Posten lassen.
Viele Grüße
Antje