Martin Althaus: Function (document.write...) aus Frameset in Frame aufrufen

Gruezi,

trotz intensiven Studiums der Forumsbeiträge u. anderer relevanter URLs konnte ich folgendes Problem bisher nicht lösen:

Ich definiere ein Frameset in der Datei frames.html, die genau einen Frame (content) nachlädt und eine function enthält. In der Datei content.html wird die Funktion aufgerufen.

frames.html
[...]
<script language="JavaScript1.2"><!--
   function menu() {

document.writeln('<table border="1" cellpadding="0" cellspacing="0">');
      document.writeln('<tr>');
      document.writeln('<td>1</td>');
      document.writeln('<td>plus</td>');
      document.writeln('</tr>');
      document.writeln('<tr>');
      document.writeln('<td>2</td>');
      document.writeln('<td>minus</td>');
      document.writeln('</tr>');
      document.writeln('</table>');}

var theMenu = new menu;
   //-->
</script>
</head>
   <frameset rows="100%,*" border="0" frameborder="0" framespacing="0">
      <frame src="content.html" name="content" marginwidth="0" marginheight="0" noresize scrolling="auto">
   </frameset>
[...]

content.html
[...]
<body bgcolor="white">
   <table border="4" cellpadding="0" cellspacing="2" width="100%">
      <tr>
         <td>
            <script language="JavaScript1.2"><!--
               theMenu;
               // -->
            </script>
         </td>
         <td>bla</td>
      </tr>
   </table>
</body>

Leider passiert dieses: Wenn ich frames.html starte, wird content.html zwar geladen, die Funktion erzeugt aber eine Tabelle, die nicht innerhalb der Content-Tabelle, sondern eigenständig auf dem Bildschirm präsentiert, also nicht als nested table. Definiere ich die gleiche Funktion unter content.html und rufe sie von hier auf, funzt alles korrekt.

Thx für die Hilfe...

  1. Hallo Martin,

    Folgendermassen geäandert passiert das, was du (vermutlich) gerne möchtest:

    function menu() {
          document.writeln('<table border="1" cellpadding="0" cellspacing="0">');

    »»       [...]

    document.writeln('</table>');}

    function menu(f)
    {
       f.document.writeln('<table border="1" cellpadding="0" cellspacing="0">');
          [...]
       f.document.writeln('</table>');
    }

    content.html
    [...]
                <script language="JavaScript1.2"><!--
                   theMenu;

    parent.menu(window);

    [...] 
    </body>

    Das document.write schrieb in 'sein' Fenster, das war bei dir das Frameset
    und daher das merkwürdige Resultat.

    So wie ich es geändert habe, ist der Code wohl nicht mehr ganz so wie du ihn
    haben wolltest - als Objekt mit Constructor, aber dazu ist mir erstmal nix
    funktionierendes eingefallen.

    Gruss,
    Carsten

    1. Hi, Carsten!

      Danke für Deine Anregung. Ich werde sie in jedem Fall ausprobieren. Bei meinen eigenen "Pfuschereien" habe ich nun ebenfalls eine Lösung gefunden. Die Datei, die in den Frame geladen wird, enthält diesen Aufruf:

      <script language="JavaScript"><!--
      parent.menu();
      //-->
      </script>

      In der Frameset-Datei (üblicherweise index.html etc.) sieht der Programmcode so aus:

      <script language="JavaScript"><!--
      function menu() {
      frames['content'].document.write('<table border="1" cellpadding="0" cellspacing="0"><tr><td>1</td><td>plus</td></tr><tr><td>2</td><td>minus</td></tr></table>');}
      //-->
      </script>

      Durch den Vorsatz frames['content']... wird nicht das Fenster der Definitions- sondern die Ausgabe des eigentlichen Frames beeinflußt, der entsprechend content heißt.

      Der eigentliche Sinn hinter meinem Vorhaben ist der, Menüstrukturen im Frameset zu definieren, die von allen Frame-Dateien verwendet werden, ohne den Ladeaufwand der einzelnen Seiten durch sich wiederholenden Code auszudehnen. Eigentlich sind meine Seiten nämlich "frame-los", der eine Frame existiert eben nur für das im-Speicher-halten der Funktionen.