Tommi: window.open ohne [object Window]

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

  1. 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

    1. 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

      1. 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

        1. 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

          1. 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.

            1. 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

              1. @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

                1. 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.

          2. 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

            1. 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

      2. 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

        --
        Warum nennt sich Andreas hier MudGuard?
        Schreinerei Waechter
        Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
        1. 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

      3. 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

        1. 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

          1. 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

            1. 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

  2. <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.

    1. 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