Christoph Lipp: Separates Browser-Fenster mit dynamischen Frames

Hallo zusammen,

Feine Sache dieses Forum! Konnte bislang zwar noch nicht mit Hilfestellungen glaenzen, aber das kommt vielleicht ja noch :)

Als fleissiger Selfhtml-Anwender habe ich im Moment folgendes Problem zu knacken:
Ich wuerde gerne via Javascript ein separates Browser-Fenster oeffnen, das Frames enthaelt, wobei der Inhalt eines der Frames als Parameter frei waehlbar ist.

Bis jetzt habe ich folgendes probiert:
1) Mit window.open() oeffne ich ein Fenster, in das ich eine HTML-Datei lade, die ein Frameset definiert.
2) Ich ueberschreibe den Inhalt des einen Frames mit einer anderen Datei, die ich als Parameter mitgebe.

Leider erkennt der Browser nicht jedesmal, das dieses Fenster Frames enthaelt und bringt daher eine Fehlermeldung. Witzigerweise funktioniert das ganze, wenn ich zwischen die beiden Schritte ein alert() einbaue, der mir irgendeinen Text ausgibt.

Kann mir jemand da einen Tip geben?

Vielen Dank
Christoph

  1. Hallo Christoph,

    Feine Sache dieses Forum! Konnte bislang zwar noch nicht mit Hilfestellungen glaenzen, aber das kommt vielleicht ja noch :)

    Glaubst Du, Du sitzt hier vorm Fernseher? Das ist kein Laden, wo man alles serviert bekommt, sondern das Internet. Hier muss man selber was dazutun. Wie waer's denn zum Beispiel damit, wenn Du selber mal offene Fragen im Forum beantwortest.
    Nur damit das klar ist: ich habe dieses Forum nicht eroeffnet, um noch mehr Fragen gestellt zu bekommen, sondern (unter anderem), damit andere Leute Fragen stellen und Fragen beantworten. Bis jetzt wird fleissig gefragt und wenig geantwortet, also fleissig genommen und wenig gegeben. Typisch. Geht's eigentlich nicht auch mal anders???

    Bis jetzt habe ich folgendes probiert:
    1) Mit window.open() oeffne ich ein Fenster, in das ich eine HTML-Datei lade, die ein Frameset definiert.
    2) Ich ueberschreibe den Inhalt des einen Frames mit einer anderen Datei, die ich als Parameter mitgebe.

    Die Idee ist schon richtig. Wichtig ist nur, dass Du die Zeile, in der der "dynamische Frame" definiert wird, auch dynamisch erzeugst, z.B. mit:

    <script language="JavaScript">
    document.write("<frame name="Fenstername" src=""+Variable+"">");
    </script>

    In Variable sollte der Wert stehen, der uebergeben wurde.

    Viele Gruesse
      Stefan Muenz

    1. Hallo Stefan

      Vielen Dank fuer Deinen Tip, ich werde es sofort ausprobieren!

      Allerdings finde ich es nicht gut, wenn auf jede Problemnachricht zuerst mal ein Anschiss kommt (von wegen Selbstbedienungsladen und Fernseher).
      Dass ich hier noch keine Tips abgegeben habe, lag im wesentlich daran, dass ich das Forum erst diese Woche entdeckt habe, und auf die unbeantworteten Fragen hier im Moment auch keine Antwort weiss, nicht an der Einstellung.

      Viele Gruesse
      Christoph Lipp

    2. Bis jetzt habe ich folgendes probiert:
      1) Mit window.open() oeffne ich ein Fenster, in das ich eine HTML-Datei lade, die ein Frameset definiert.
      2) Ich ueberschreibe den Inhalt des einen Frames mit einer anderen Datei, die ich als Parameter mitgebe.

      Die Idee ist schon richtig. Wichtig ist nur, dass Du die Zeile, in der der "dynamische Frame" definiert wird, auch dynamisch erzeugst, z.B. mit:

      <script language="JavaScript">
      document.write("<frame name="Fenstername" src=""+Variable+"">");
      </script>

      In Variable sollte der Wert stehen, der uebergeben wurde.

      Funktioniert leider nicht so einfach, da JavaScript-Code, der zwischen <frameset> und </frameset> steht, anscheinend nicht interpretiert wird.
      Eine Loesungsmoeglichkeit dafuer ist aber, den ganzen <frameset>-Bereich mit document.write() zu erstellen.
      Jetzt muss ich nur noch rausfinden, wie ich die Variable aus der Aufruf-Funktion in der Frame-Datei uebergebe (Ueber window.name waere ein workaround, aber da sind keine Sonderzeichen erlaubt).
      Ich bleibe aber dran!
      Gruesse
      Christoph

      1. Hallo Christoph,

        Funktioniert leider nicht so einfach, da JavaScript-Code, der zwischen <frameset> und </frameset> steht, anscheinend nicht interpretiert wird.
        Eine Loesungsmoeglichkeit dafuer ist aber, den ganzen <frameset>-Bereich mit document.write() zu erstellen.

        Stimmt - ich erinnere mich, das mal gehoert zu haben, probiert hab ich's bislang selber nicht.

        Jetzt muss ich nur noch rausfinden, wie ich die Variable aus der Aufruf-Funktion in der Frame-Datei uebergebe (Ueber window.name waere ein workaround, aber da sind keine Sonderzeichen erlaubt).

        Falls das oeffnende Fenster noch offen ist, koenntest Du in der dort angezeigten Datei ein verstecktes Formular definieren:

        <form name="Daten">
        <input name="varFrame" type=hidden value="">
        </form>

        Bevor Du das neue Fenster oeffnest, in der das Frameset geschrieben wird, kannst Du dort mit JavaScript etwas hineinschreiben, etwa:

        document.Daten.varFrame.value = "datei.htm"

        In der neuen Datei, also der, in der das Frameset geschrieben wird, kannst Du dann darauf bezug nehmen:

        Variable = opener.document.Daten.varFrame.value;
        document.write("<frame name="Fenstername" src=""+Variable+"">");

        Viele Gruesse
          Stefan Muenz

        1. Hallo Stefan,

          Vielen Dank fuer die Tips, es funktioniert jetzt!

          Und fuer alle anderen Leser noch eine kurze Zusammenfassung, um was es ging:

          Problem:
          Ich wollte ein separates Browser-Fenster mit Frames oeffnen, wobei der Inhalt eines Frames durch einen Parameter frei gewaehlt werden kann.

          Loesung:
          1) Im oeffnenden Fenster ein verstecktes Formular definieren, in dem der Parameter abgelegt werden kann:
          <form name="Daten"><input name="varFrame" type=hidden value=""></form>

          2) Eine Funktion openWindow schreiben, die etwa so aussieht:

          function openWindow(filename) {
          document.Daten.varFrame.value = filename; /* Parameter setzen */
          NewWindow = window.open( 'separat.html', 'NewWindow' ); /* Fenster oeffnen */
          NewWindow.focus(); /* Fenster aktivieren */
          }

          3) Die aufgerufene Datei separat.html sollte etwa folgenden JavaScript-Bereich erhalten::

          <script language="JavaScript">
              Variable= opener.document.Daten.varFrame.value;
              document.write("<frameset rows="70,*" >");
              document.write("<frame src="fix.html" name="frame1">");
              document.write("<frame src=""+Variable+"" name="frame2">");
              document.write("</frameset>");
          </script>

          (Man muss das ganze Frameset mit JavaScript definieren, da JavaScript zwischen <frameset> und </frameset> offensichtlich nicht interpretiert wird.)

          Viele Gruesse
          Christoph

          1. Hallo,

            kann ja sein, dass ich ein bisschen spaet dran mit mit meiner Bemerkung, aber ich habe doch glatt verpasst, dass es hier ein Forum gibt, und meinen Senf moechte ich halt dazugeben.

            (Man muss das ganze Frameset mit JavaScript definieren, da JavaScript zwischen <frameset> und </frameset> offensichtlich nicht interpretiert wird.)

            Die beschriebene Loesung funktioniert natuerlich.
            Aber, nur so als Anregung, es sollte auch einfacher gehen.
            Ich habe da mal irgendwann ein Beispiel gebastelt, das zwar kein neues Fenster benutzt (URL s. unten). Aber das Prinzip muss doch ganz genau so gehen.
            Man muss lediglich dafuer sorgen, dass das Tauschen des Frameinhalts erst passiert, wenn das Framest wirklich geladen ist. Das duerfte die Ursache fuer die Fehlermeldung im ersten Ansatz gewesen sein, also <FRAMESET onload="tauschen()"> mit einer Funktion tauschen(), die den Austausch vornimmt.
            Wer ganz sicher gehen will, den Browsern bzgl. der Ermittlung  des Zeitpunkts fuer load nicht so ganz traut, der fragt vorher, ob der Frame existiert - if (self.Framename) .
            Wenn die Standardseite klein und unaufffaellig ist, stoert das nachtraegliche Tauschen auch nicht

            Die Loesung hat IMHO einen Vorteil.
            Man kann darueber nachdenken, abwaertskompatibel zu bleiben, z.B. alternativ zum Oeffnen mit JS target="_blank" nutzen, auf der standardmaessig angezeigten ersten Seite ganz normal Links zu den einzutauschenden anbieten, oder so in der Richtung halt...

            Christine

            1. Hallo Stefan,

              Tschuldigung bitte, doppelt sollte natuerlich nicht sein.
              Ich habe den von mir versprochenen und eingetragenen Link unten gesucht, glatt uebersehen, dass die bei Dir oben stehen und vor lauter Staunen und Wundern nach Browser-Back-Forward
              "repost form data" bestaetigt.
              Wenn man halt mittags um 12 noch schlaeft...

              Christine

              1. Hallo Christine,

                Wenn man halt mittags um 12 noch schlaeft...

                Macht nix - ich freue mich auf jeden Fall riesig, dass Du in dieses Forum gefunden hast und hoffe, dass wir hier von Deiner Kompetenz noch oefters zehren koennen.

                Zur Info fuer alle, die es nicht wissen: Christine Kuehnel ist eine der Hauptpersonen in der deutschen Newsgroup zu JavaScript und in diesem Bereich so ziemlich "on the top"!

                Viele Gruesse
                  Stefan Muenz

          2. Hallo,

            kann ja sein, dass ich ein bisschen spaet dran mit mit meiner Bemerkung, aber ich habe doch glatt verpasst, dass es hier ein Forum gibt, und meinen Senf moechte ich halt dazugeben.

            (Man muss das ganze Frameset mit JavaScript definieren, da JavaScript zwischen <frameset> und </frameset> offensichtlich nicht interpretiert wird.)

            Die beschriebene Loesung funktioniert natuerlich.
            Aber, nur so als Anregung, es sollte auch einfacher gehen.
            Ich habe da mal irgendwann ein Beispiel gebastelt, das zwar kein neues Fenster benutzt (URL s. unten). Aber das Prinzip muss doch ganz genau so gehen.
            Man muss lediglich dafuer sorgen, dass das Tauschen des Frameinhalts erst passiert, wenn das Framest wirklich geladen ist. Das duerfte die Ursache fuer die Fehlermeldung im ersten Ansatz gewesen sein, also <FRAMESET onload="tauschen()"> mit einer Funktion tauschen(), die den Austausch vornimmt.
            Wer ganz sicher gehen will, den Browsern bzgl. der Ermittlung  des Zeitpunkts fuer load nicht so ganz traut, der fragt vorher, ob der Frame existiert - if (self.Framename) .
            Wenn die Standardseite klein und unaufffaellig ist, stoert das nachtraegliche Tauschen auch nicht

            Die Loesung hat IMHO einen Vorteil.
            Man kann darueber nachdenken, abwaertskompatibel zu bleiben, z.B. alternativ zum Oeffnen mit JS target="_blank" nutzen, auf der standardmaessig angezeigten ersten Seite ganz normal Links zu den einzutauschenden anbieten, oder so in der Richtung halt...

            Christine

    3. Moin.

      Das hier wird zwar langsam etwas off-topic, aber ich denke, Ihr zwei (Christoph und Stefan) redet etwas aneinander vorbei... Ich bin mir ziemlich sicher, dass Christoph, als er folgendes:

      Feine Sache dieses Forum! Konnte bislang zwar noch nicht mit Hilfestellungen glaenzen, aber das kommt vielleicht ja noch :)

      ... schrieb, meinte, dass ER SELBST noch nicht mit Hilfestellungen glaenzte. Stefan hat das allerdings anscheinend so aufgefasst, dass DAS FORUM noch nicht mit Hilfestellungen glaenzen konnte.

      Leider wird ja tatsaechlich noch nicht allzuviel von "Nichtstefanoiden" geantwortet, aber das entwickelt sich hoffentlich noch...

      1. Hallo Christian,

        Das hier wird zwar langsam etwas off-topic, aber ich denke, Ihr zwei (Christoph und Stefan) redet etwas aneinander vorbei...

        Ooch, ich denke, das ist laengst kein Problem mehr, und was mich betrifft, muss ich halt auch mal mit Kritik etwas lockerer leben.
        Das, was Du da so schoen "off-topic" nennst - es wird auch "Thread Drift" genannt - gehoert sowieso zu einem Diskussionsforum dazu. Es ist vielleicht nicht optimal zum Lesen, wenn jeder Thread vom eigentlichen Thema abdriftet, aber so hin und wieder gehoert das unbedingt dazu. In meiner "Heimat-Sektion" in CompuServe gibt es manchmal richtig schoene Monster-Threads mit ziemlich interessanten Statements. So was wuensche ich mir hier eigentlich auch. Kann man natuerlich nicht erzwingen, und es haengt stark von den Leuten ab, bzw. von ihrer Bereitschaft, auch mal "ueber die Tags hinaus" was beizutragen.

        Viele Gruesse
          Stefan Muenz

        PS: was spielst Du denn da Schoenes auf der Gitarre?

      2. Das hier wird zwar langsam etwas off-topic, aber ich denke, Ihr zwei (Christoph und Stefan) redet etwas aneinander vorbei... Ich bin mir ziemlich sicher, dass Christoph, als er folgendes:

        Feine Sache dieses Forum! Konnte bislang zwar noch nicht mit Hilfestellungen glaenzen, aber das kommt vielleicht ja noch :)

        ... schrieb, meinte, dass ER SELBST noch nicht mit Hilfestellungen glaenzte. Stefan hat das allerdings anscheinend so aufgefasst, dass DAS FORUM noch nicht mit Hilfestellungen glaenzen konnte.

        Stimmt!
        Ist mir gar nicht aufgefallen, dass man den Satz auch falsch verstehen kann. Da muss ich wohl in Zukunft besser aufpassen. Aber ich denke, dass Missverstaendnis ist inzwischen geklaert ;-)