window.open ohne [object Window]
Tommi
- javascript
1 Der Martin0 Gernot Back0 Der Martin0 Gernot Back0 Tommi0 Der Martin
0 MudGuard0 Ingo Turski
0 Struppi
Hallo,
mit folgendem Code wird ein neues Fenster mit dem richtigen Inhalt geöffnet, gleichzeit erscheint im Ursprungsframe die Meldung [object Window] und der Inhalt ist futsch. Was muss ich tun damit der Frame so bleibt wie er ist.
<a href="javascript:window.open('xxx.jpg' ,'Bild','width=800,height=600,scrollbars=no');">
Gruss und Dank
Hallo Tommi,
[...] gleichzeit erscheint im Ursprungsframe die Meldung [object Window] und der Inhalt ist futsch.
Klar. Das hast du ja auch so bestellt.
Denk doch mal nach: Beim Anklicken eines Links versucht der Browser, das mit href="..." angegebene Verweisziel im aktuellen Fenster darzustellen (wenn jetzt wir mal die Möglichkeit eines target-Attributs außer acht lassen). Und was ist das Ergebnis deines Javascript-Statements im href? Genau: Eine Referenz auf ein window-Objekt. Genau das zeigt dir dein Browser ja auch an. Dass bei dieser Aktion noch ein zusätzliches Fenster geöffnet wurde, ist formal nur ein Nebeneffekt.
Was muss ich tun damit der Frame so bleibt wie er ist.
Erstens solltest du deinen Scriptaufruf nicht im href-Attribut unterbringen, sondern besser in einem onclick-Handler.
Zweitens ist es wichtig, eine Alternative für Besucher anzubieten, die JS deaktiviert haben. Für die könnte man einen ganz "normalen" Link machen. Kombiniert könnte das dann etwa so aussehen:
<a href="xxx.jpg" target="_blank" onclick="return (window.open('xxx.jpg' ,'Bild','width=800,height=600,scrollbars=no')==null);">
Wenn JS deaktiviert ist, wird der onclick-Handler komplett ignoriert und stattdessen wird das Linkziel xxx.jpg in einem neuen Fenster geöffnet (wegen target="_blank"). Dieses neue Fenster hat zwar dann nicht die Größe und die Eigenschaften, die du gern hättest, aber die Funktion bleibt grundsätzlich erhalten.
Bei aktiviertem JS wird der onclick-Handler ausgeführt. Also zuerst die window.open-Methode, die versucht, ein neues Fenster mit vorgegebenen Eigenschaften zu öffnen. Gelingt das, ist der Rückgabewert von window.open() ungleich null, das Ergebnis des Vergleichs mit null liefert also false. Dadurch wird die weitere Auswertung des Links unterdrückt. Schlägt das Öffnen des Fensters fehl (etwa durch einen Popup-Blocker), liefert window.open() null, der Vergleich ergibt true - und das bewirkt, dass der eigentliche Link (das href) doch noch ausgewertet wird. Damit hat der Benutzer wenigstens noch die Basisfunktion wie ohne JS.
Das hättest du aber alles auch durch einen Streifzug durchs Forumsarchiv selber finden können.
Schönen Tag noch,
Martin
Hallo Martin,
<a href="xxx.jpg" target="_blank" onclick="return (window.open('xxx.jpg' ,'Bild','width=800,height=600,scrollbars=no')==null);">
Das Folgende finde ich gerechter, da überlässt der JS- dem HTML-Code in jedem Fall den Teil der Arbeit, den dieser selbst leisten kann:
<a href="xxx.jpg" onclick="window.open('','Bild','width=800,height=600,scrollbars=no')" target="Bild">
Gruß Gernot
Hi Gernot,
die Variante, die du hier vorschlägst, habe ich ja noch nie gesehen, zumindest nicht bewusst.
<a href="xxx.jpg" onclick="window.open('','Bild','width=800,height=600,scrollbars=no')" target="Bild">
Öhm... Einmal kurz gestutzt, dann nochmal nachgedacht...
Yo, eigentlich raffiniert!
Abgesehen von einer gewissen Eleganz des Codes sehe ich allerdings noch nicht den wirklichen Vorteil gegenüber meinem Vorschlag, wenn man ihn denn -wie Struppi empfiehlt- durch Verwendung von this.href verfeinert.
Ciao,
Martin
Hallo Der,
Öhm... Einmal kurz gestutzt, dann nochmal nachgedacht...
Yo, eigentlich raffiniert!
Abgesehen von einer gewissen Eleganz des Codes sehe ich allerdings noch nicht den wirklichen Vorteil gegenüber meinem Vorschlag, wenn man ihn denn -wie Struppi empfiehlt- durch Verwendung von this.href verfeinert.
Nein, denn ansonsten musst du auch wieder ; return false
hinzufügen, wenn du nicht willst dass das Bild zweimal geladen wird und zwischendurch aufflackert.
Gruß Gernot
Ich bin begeistert, aber wie muss der Tag aussehen wenn nur per JS ein zusätzliches Fenster geöffnet werden soll? Der Besucher wird schon am Anfang auf JS hingewiesen und ohne kommt er erst gar nicht an die Stelle...
Es soll also nur ein Fenster mit 800 x 600 geöffnet werden und der Rest soll so bleiben wie er ist.
Hallo Tommi,
Ich bin begeistert, aber wie muss der Tag aussehen wenn nur per JS ein zusätzliches Fenster geöffnet werden soll? Der Besucher wird schon am Anfang auf JS hingewiesen und ohne kommt er erst gar nicht an die Stelle...
Naja, da würde ich in das HREF-Atribut einen Lattenzaun # setzen und dein "xxx.jpg" müsstest du dann wieder als ersten Parameter der window.open()-Funktion mitgeben. Als zweite Anweisung schreibst du dann getrennt durch Semikolon return false
in deinen onclick-Eventhandler. Auf letzteres kannst du auch verzichten, wenn du statt des Lattenzauns javascript:void(0) ins HREF-Attribut schreibst. Aber eines von beiden solltest du schreiben, da dir eine lange Seite mit dem Lattenzaun ansonsten ganz nach oben hüpft.
Aber warum willst du denn Leute ohne Javascript aussperren, muss doch gar nicht sein!
Gruß Gernot
@Gernot
Herzlichen Dank, damit kann ich was anfangen.
Eigentlich will ich ja niemand aussperren, aber ich finde dass die grosse Funktionsvielfalt von JS nicht ungenutzt bleiben sollte nur weil ein kleiner Teil der User es ausgeschaltet hat.
Schönen Sonntag noch
Eigentlich will ich ja niemand aussperren, aber ich finde dass die grosse Funktionsvielfalt von JS nicht ungenutzt bleiben sollte nur weil ein kleiner Teil der User es ausgeschaltet hat.
umgekehrt wird ein Schuh draus. Du kannst die JS Funktion nutzen ohne das irgendjemand ausgesperrt wird.
Struppi.
Hallo Gernot,
toll, diese automatischen Anredefloskeln! ;))
Hallo Der,
Nein, denn ansonsten musst du auch wieder
; return false
hinzufügen, ...
Es ist IMHO sowieso empfehlenswert, einen Rückgabewert anzugeben - und das hab ich in meinem Beispiel ja auch in vollem Bewusstsein getan. Das ist mir durch meine Programmierernatur schon so selbstverständlich, dass ich es weder als Nachteil noch als "Klotz am Bein" sehe.
Ciao,
Martin
Hallo Martin,
toll, diese automatischen Anredefloskeln! ;))
Hallo Der,
Sorry, manchmal denke ich im Eifer des Gefechts bei problematischen Nicks wie dem deinen nicht daran, was in meinem ersten Posting aber nicht der Fall war.
Gruß Gernot
Hi,
Das Folgende finde ich gerechter, da überlässt der JS- dem HTML-Code in jedem Fall den Teil der Arbeit, den dieser selbst leisten kann:
<a href="xxx.jpg" onclick="window.open('','Bild','width=800,height=600,scrollbars=no')" target="Bild">
Mögliches Problem könnte dabei sein:
window.open teilt dem Windowmanager mit, daß es ein Fenster mit der gegebenen Größe wünscht.
Da der Event-Handler damit abgearbeitet ist, kommt jetzt (wegen des fehlenden return false) das href-Attribut zum Zuge - im Zusammenarbeit mit dem target-Attribut.
Der Browser stellt fest, daß es noch kein Fenster mit Namen "Bild" gibt (der Windowmanager ist noch nicht soweit ...).
Also teilt er dem Windowmanager mit, daß er gerne ein Browserfenster hätte.
Jetzt kommt endlich der Windowmanager in die Gänge und erledigt die beiden Aufträge.
Ergebnis wäre ein leeres Fenster in der gewünschten Größe und ein "normales" Browserfenster mit der Seite drin.
cu,
Andreas
Hallo MudGuard,
Mögliches Problem könnte dabei sein:
Der Browser stellt fest, daß es noch kein Fenster mit Namen "Bild" gibt (der Windowmanager ist noch nicht soweit ...).
Wird nicht der Eventhandler onClick immer vor dem href-Attribut abgearbeitet?
Genausogut könnte es doch sonst auch passieren, dass das return false
aus dem onClick
nicht rechtzeitig greift.
Gruß Gernot
Hi,
<a href="xxx.jpg" onclick="window.open('','Bild','width=800,height=600,scrollbars=no')" target="Bild">
wobei allerdings zu beachten ist, daß HTML nicht zwangsläufig ein neues Fenster öffnet und dieses u.U. im Hintergrund belassen wird.
freundliche Grüße
Ingo
Hallo Ingo,
wobei allerdings zu beachten ist, daß HTML nicht zwangsläufig ein neues Fenster öffnet und dieses u.U. im Hintergrund belassen wird.
Deshalb gebe ich dem Fensterobjekt ja meistens auch noch einen Variablennamen und hole es mit der Methode focus() in den Vordergrund:
<a href="willkommen.html" onClick="popobj = window.open('', 'pop', 'width=436,height=436,directories=no,location=no,menubar=no,resizable=no,scrollbars=no,status=no'); popobj.focus()" target="pop">Popup öffnen</a>
Ich hatte anders als Tom auch noch nie Probleme damit, wenn ich dabei für das JS-Fensterobjekt denselben Namen benutzte wie für das Fenster/Target, also in obigem Beispiel dann auch nur "pop", wo jetzt "popobj" steht. Aber das mag an meinen Browsern (IE6, Opera 7.54, Mozilla 1.7.2) und meinem Betriebssystem (Win98)liegen.
Wir hatten das Thema ja schon mal vor fünf Monaten:
http://forum.de.selfhtml.org/archiv/2004/11/t93851/
Gruß Gernot
Hi,
wobei allerdings zu beachten ist, daß HTML nicht zwangsläufig ein neues Fenster öffnet und dieses u.U. im Hintergrund belassen wird.
Deshalb gebe ich dem Fensterobjekt ja meistens auch noch einen Variablennamen und hole es mit der Methode focus() in den Vordergrund:
Du hast übersehen, daß ich mich auf HTML bezog - da hilft Dir Dein focus nicht weiter..;-)
freundliche Grüße
Ingo
Hallo Ingo,
Du hast übersehen, daß ich mich auf HTML bezog - da hilft Dir Dein focus nicht weiter..;-)
Stimmt! Wem's darauf ankommt, stets die (erneut) aufgerufene Seite im Vordergrund zu haben, der fährt mit target="_blank"
am besten, sollte für die JS-Nutzer dann allerdings vor dem return false
auch noch einen focus()
auf das gerade (wieder)geborene Fensterobjekt setzen.
Gruß Gernot
<a href="javascript:window.open('xxx.jpg' ,'Bild','width=800,height=600,scrollbars=no');">
Das sollte besser so gemacht werden:
<a href="xxx.jpg"
onclick="window.open(this.href ,'Bild','width=800,height=600,scrollbars=no');return false">
Struppi.
Hallo Struppi,
Das sollte besser so gemacht werden:
<a href="xxx.jpg"
onclick="window.open(this.href ,'Bild','width=800,height=600,scrollbars=no');return false">
Ja, siehe meine ausführliche Fassung. *gg*
Aber die Stringkonstante in der Parameterliste von window.open() durch this.href zu ersetzen, ist wirklich noch eine gute Idee. Warum habe ich nicht daran gedacht?
So long,
Martin