Enibas: Externe Datei mit Ebenen+Scripten in iframe/layer importieren

Hallo an alle,

ich versuche schon seit mehreren Tagen eine HTML-Seite als Flash-Alternative aufzubauen. Wollte eine elegante Lösung mit externen Dateien im iframe, die das Konzept von nachgeladenen Movieclips in Flash aufgreift. Allerdings treibt mich Netscape 4.x langsam in den Wahnsinn!

Das Hauptdokument besteht aus mehreren div-Bereichen für Hintergrund, Navigation sowie Texteinblendungen. Dazu kommt ein iframe bzw. layer für Netscape 4.x, der mit src=... aus einer externen HTML-Datei (inkl. <html>, <head>, <body>) gespeist wird. Je nach Klick auf die Navigationsleiste wird eine andere Inhaltsdatei geladen.
Diese besteht ihrerseits aus mehreren div-Bereichen, die mittels Button über enthaltene Javascript-Funktionen ein und ausgeblendet werden sollen.

Das Laden der externen Datei klappt eigentlich ganz gut. Nur führt Netscape die darin enthaltenen Javascript-Funktionen nur teilweise aus (Bildwechsel bei mouseover funktioniert, Anzeigen bzw. Verbergen von div's nicht)! Die Funktionen scheinen nicht bekannt zu sein. Wenn ich die Javscripte in das Hauptdokument verschiebe, werden die Aufrufe immer komplizierter, da der Explorer dann "parent." vermißt und die vom Hauptdokument angesprochenen Ebenen in der Unterseite liegen ... Ich weiß auch nicht, ob ich auf diese Weise überhaupt erreichen könnte, daß Netscape die Verweigerungstaktik aufgibt.

Kann mir jemand helfen?
Oder denke ich zu sehr um die Ecke, und muß mich mit dem Einsatz herkömmlicher Frames abfinden?

PS. Hoffentlich versteht überhaupt irgend jemand meine Beschreibung.

Gruß und danke für Eure Mühe,
Sabine

  1. Hallo,

    Das Laden der externen Datei klappt eigentlich ganz gut. Nur führt Netscape die darin enthaltenen Javascript-Funktionen nur teilweise aus (Bildwechsel bei mouseover funktioniert, Anzeigen bzw. Verbergen von div's nicht)! Die Funktionen scheinen nicht bekannt zu sein. Wenn ich die Javscripte in das Hauptdokument verschiebe, werden die Aufrufe immer komplizierter, da der Explorer dann "parent." vermißt und die vom Hauptdokument angesprochenen Ebenen in der Unterseite liegen ... Ich weiß auch nicht, ob ich auf diese Weise überhaupt erreichen könnte, daß Netscape die Verweigerungstaktik aufgibt.

    du könntest u.U. das externe Script doppelt, in Haupt- und
    Unterdokument, einbinden, oder alles auf top. statt parent.
    abstellen und ggf. für Netscape anders adressieren.
    Gibt eine URL dazu?

    Grüsse

    Cyx23

    1. Gibt eine URL dazu?

      Hallo Cyx23,

      hab's schnell mal provisorisch überspielt. Du findest alles unter der Adresse http://www.3design-gmbh.de/test/.
      Das Hauptdokument ist start.htm. Zu der einzigen richtig ausgearbeiteten Unterseite, die die Probleme zeigt, kommst Du über den Punkt "informieren" in der Navigation. Quelltext dazu: http://www.3design-gmbh.de/test/proj_informieren/proj_informieren.htm.

      Das ist noch die Variante mit Script im Unterdokument. Mit dem Explorer siehst Du wie es eigentlich aussehen sollte. Netscape zeigt beim Klick auf "1", "2" oder "3" die Bilder und auf "i" den Text nicht an.

      Gruß und danke,
      Sabine

      1. Hallo Sabine,

        Das ist noch die Variante mit Script im Unterdokument. Mit dem

        Netscape kommt wohl mit dem Scriptteil im Unterdokument nicht klar.
        Eine Möglichkeit ist im Unterdokument alles auf top umzustellen,
        müsste inzwischen auch für Opera klappen, function top.produkt_on(){..
        und onClick=top.produkt_on(), die Frameadressierung müsste möglich
        sein da sowieso die Browser unterschiedlich bedient werden.
        Kannst ja erstmal einen kleinen Versuch starten und schauen ob es
        so in allen Browsern läuft.

        Grüsse

        Cyx23

        1. Hallo Cyx23,

          ich habe jetzt das Script aus dem Unterdokument zusätzlich auch extern in das Hauptdokument eingebunden.

          function top.produkt_on(){..

          Bist Du Dir sicher? Die Funktionsdefinition sollte doch wohl ohne Frameadressierung "top." erfolgen, oder?

          Der Aufruf ist dann: <a href="javascript:if(document.layers) {top.produkt_on(1)} else {produkt_on(1)}" ...
          In der Netscape-Console erhalte ich dann folgende Fehlermeldung: document.layers[prod[prod_nr]] has no properties". Schade!

          Merkwürdig ist ja auch, daß die Funktionen produkt_over und produkt_out (Bildwechsel bei mouseover) ohne den umständlichen Aufruf über das Hauptdokument funktionieren. Das spricht eigentlich für einen anderen Fehler innerhalb der Funktion produkt_on. Hast Du eine Idee?

          Gruß und danke,
          Sabine

          1. Hallo Sabine,

            ich habe jetzt das Script aus dem Unterdokument zusätzlich auch extern in das Hauptdokument eingebunden.

            function top.produkt_on(){..
            Bist Du Dir sicher? Die Funktionsdefinition sollte doch wohl ohne Frameadressierung "top." erfolgen, oder?

            top.produkt_on = function produkt_on(){ ...

            klappt eigentlich für IE und NC4, dann kann auch das Unterdokument
            die Funktionen an einem eindeutigen Ort erstellen, m.E. besser zu
            handhaben als gleich immer ins Hauptdokument zu schreiben.
            Allerdings klappt die Syntax nicht für Mozilla, ich weiss jetzt auf
            die Schnelle nicht was der Grund ist.

            Der Aufruf ist dann: <a href="javascript:if(document.layers) {top.produkt_on(1)} else {produkt_on(1)}" ...
            In der Netscape-Console erhalte ich dann folgende Fehlermeldung: document.layers[prod[prod_nr]] has no properties". Schade!

            wenn das array prod[.. so stimmt, dann fehlt vmtl. vorher
            etwas, top.frames[...].document.layers[].document. ....
            (oder verschachtelte frames)

            Merkwürdig ist ja auch, daß die Funktionen produkt_over und produkt_out (Bildwechsel bei mouseover) ohne den umständlichen Aufruf über das Hauptdokument funktionieren. Das spricht eigentlich für einen anderen Fehler innerhalb der Funktion produkt_on. Hast Du eine Idee?

            vorher war ja produkt_on gar nicht definiert, jetzt bei Ablauf der
            Funktion ist -s.o.- die Adressierung vom Hauptdokument oder top aus
            für die angesprochenen Objekte noch anzupassen, erstmal umständlich,
            aber wenn du ein stabiles Schema hast kannst du ja mit nem Editor
            recht schnell für alle Dateien passend ersetzen.

            Grüsse

            Cyx23

            1. Hallo nochmal,

              ich habe jetzt das Script aus dem Unterdokument zusätzlich auch extern in das Hauptdokument eingebunden.

              function top.produkt_on(){..
              Bist Du Dir sicher? Die Funktionsdefinition sollte doch wohl ohne Frameadressierung "top." erfolgen, oder?

              top.produkt_on = function produkt_on(){ ...

              so klappt es mit nc4, IE6, Mozilla1.1:

              function produkt_on(){
               ...
              }
              top.produkt_on=produkt_on;

              Du müsstest dann noch etwas aufpassen welche Variablen ebenfalls
              mit top.varname angesprochen werden müssen, danach sollte es
              m.E. eigentlich einfacher werden. Die Variablen im top bleiben
              beim framewechsel erhalten, also ggf. die gleichnamigen Variablen
              neu definieren bzw. überschreiben. Du kannst damit auch Variablen
              solange erhalten wie die Hauptdatei geladen ist. "top" ist, solange
              du nicht in einem fremden Frame landest, hier m.E. für alle Browser
              zuverlässiger als andere Lösungen.
              Du musst dann bei einem echten Frameset oder für iframe beim IE usw.
              anders ansprechen als einen ilayer für Netscape4.
              top.document.layers[inlineWin].document.layers['divText1'].document.layers['divTextCont1'].
              o.ä. wenn da noch ein ilayer passend zum iframe kommt, ist mir aber
              nicht ganz klar wie du das geplant hast, sonst top.frames[.. mit
              einem echten Frameset für NC4.

              Grüsse

              Cyx23

              1. Hallo Cyx23,

                so klappt es mit nc4, IE6, Mozilla1.1:

                function produkt_on(){
                ...
                }
                top.produkt_on=produkt_on;

                Bei mir leider nicht. Am Mac brachte das Netscape zum Absturz, unter WinNT erschien in die Fehlermeldung "top.produkt_on ist keine Funktion".

                Wenn ich die Funktion aber direkt in das Hauptdokument schreibe und einige Aufrufe anders adressiere, komme ich ein Stück weiter.

                Doch wie kann ich vom Hauptdokument auf Werte bzw. Funktionen in dem Unterdokument zugreifen? Beim Explorer über den Frame - kein Problem. Aber Netscape ... Laut Javascript-Referenz sollte der externe Layer-Inhalt wie ein direkter Include behandelt werden. Dann bräuchte es keine besonderen Aufrufe. Das scheint aber nicht so zu sein ("... is not defined").

                Fällt Dir noch was dazu ein?
                Woher hast Du die Syntax top.produkt_on=produkt_on;? Kann man irgendwo im Netz etwas darüber lesen?

                Gruß und danke für Deine Geduld
                Sabine

                1. Hallo,

                  Bei mir leider nicht. Am Mac brachte das Netscape zum Absturz, unter WinNT erschien in die Fehlermeldung "top.produkt_on ist keine Funktion".

                  wenn produkt_on() vorher definiert war hatte ich bei allen
                  Browsern unter W98 keine Probleme, auch bei Mac hatte ich schonmal
                  etwas ähnliches getestet. Falls es bei dir gar nicht klappt sind
                  andere Schreibweisen top.document... auch wenig efolgversprechend
                  solange nicht klar ist was die Browser da nicht mögen, wenn du aber
                  sowieso einfach die Funktionen in der Hauptdatei erzeugen kannst,
                  geht es ja auch so.

                  Doch wie kann ich vom Hauptdokument auf Werte bzw. Funktionen in dem Unterdokument zugreifen? Beim Explorer über den Frame - kein Problem. Aber Netscape ... Laut Javascript-Referenz sollte der externe Layer-Inhalt wie ein direkter Include behandelt werden. Dann bräuchte es keine besonderen Aufrufe. Das scheint aber nicht so zu sein ("... is not defined").

                  Es bleibt ein layer, also immer noch, von 'oben' aus, document.layers[
                  ].document. usw., über id'' oder von 0 abzählen (layer-array,
                  positionierte divs ggf. mitzählen) um _Objekte_ anzusprechen.
                  Bei den Scriptvariablen _und_ Objekten wäre ggf. beim IE der frame
                  zu berücksichtigen.

                  Grüsse

                  Cyx23