Wolfgang: Link setzen u. gleichzeitig Inhalt eines iframes festlegen

Guten Tag!

Ich habe eine Seite in einem eingebetteten Frame [A] geladen. In dieser Seite möchte ich einen Link setzen, sodass sich beim Klicken der Inhalt dieses eingebetteten Frames [A] ändert. Dies ist natürlich grundsätzlich kein Problem.
Zusätzlich ist aber in der neu geladenen Seite (und nur in der neu geladenen Seite) ein neuerliches eingebettetes Frame [B] definiert. Und den Inhalt dieses Frames [B] möchte ich mit dem Link ebenfalls dynamisch setzen können.

Wie schafft man das? Ich habe bereits im WWW und hier bei SelfHTML gesucht, aber nichts relevantes gefunden. Leider kann ich auch noch keinen Link dazu angeben...

Ich habe versucht, in einer JS-Funktion nacheinander den Inhalt der Frames zu bestimmen, allerdings wird nur das erste Frame [A] geladen, im zweiten Frame [B] wird nur der im <iframe>-Tag definierte Inhalt geladen. Der Code dazu sieht wie folgt aus:

function changeContent() {
  parent.frames['frame_A'].window.location.href = "neueseite.html";
  parent.frames['frame_B'].window.location.href = "neueseite.html";
}

Vielen Dank für Eure Hilfe!
Gruß, Wolfgang

  1. Hallo,

    nicht getestet, aber schmeiß mal das ".window" raus:

    function changeContent() {
    parent.frames['frame_A'].location.href = "neueseite.html";
    parent.frames['frame_B'].location.href = "neueseite.html";
    }

    Gruß,
    Stefan

    1. Hallo,

      nicht getestet, aber schmeiß mal das ".window" raus:

      function changeContent() {
      parent.frames['frame_A'].location.href = "neueseite1.html";
      parent.frames['frame_B'].location.href = "neueseite2.html";
      }

      Gruß,
      Stefan

      Dadurch hat sich leider nichts geändert. Es wird zwar nach wie vor zur Seite "neueseite1.html" gelinkt (im eingebetteten Frame [A], aber die Seite "neueseite2.html" wird noch immer nicht angezeigt im eingebetteten Frame [B].

  2. Hallo Wolfgang,

    wenn du, wie Stefan es sagt "window." weglässt, müsste das im IE funktionieren. sonst kannst du es auch mal mit .src statt .location.href versuchen. Bei den anderen Browsern sprichst du die IFRAMES besser über ihren Namen an. Dafür vergibst du das Namens-Attribut und schreibst dann einfach "iframeName.location.href", also:

    function changeContent() {
      parent.frame_A.location.href = "neueseiteA.html";
      parent.frame_B.location.href = "neueseiteB.html";
    }

    Gruß Gernot

    1. Hallo Wolfgang,

      wenn du, wie Stefan es sagt "window." weglässt, müsste das im IE funktionieren. sonst kannst du es auch mal mit .src statt .location.href versuchen. Bei den anderen Browsern sprichst du die IFRAMES besser über ihren Namen an. Dafür vergibst du das Namens-Attribut und schreibst dann einfach "iframeName.location.href", also:

      function changeContent() {
        parent.frame_A.location.href = "neueseiteA.html";
        parent.frame_B.location.href = "neueseiteB.html";
      }

      Gruß Gernot

      Hallo Gernot!

      Ich habe beides versucht, es hat nicht funktioniert.
      Nochmals kurz zum Abklären der Problemstellung. Frame [B] ist nur in der Seite definiert, die im Frame [A] NACHGELADEN wird (aber nicht in jener Seite im Frame [A], von der aus der Link stattfindet bzw. gesetzt wird).

      Wo muss man das JS-Script eigentlich definieren? Es sollte doch kein Problem sein, es in eine externe JS-Datei zu schreiben und diese Datei in jede der beteiligten Seiten einzubinden, oder?

      Ich versuche, den Aufbau bzw. die wichtigen Teile des Codes kurz aufzubauen:

      index.htm

      ...
      <iframe src="page1.htm" name="frame_A">
        <p></p>
      </iframe>
      ...

      page1.htm

      ...
      <a href"javascript: linkfunction();">DAS IST DER LINK</a>
      ...

      page2.htm

      <iframe src="page3.htm" name="frame_B">
        <p></p>
      </iframe>

      Grundsätzlich ist es ja kein Problem, einen Link zu setzen, sodass in Frame [A] "page2.htm" angezeigt wird. Allerdings sollte zusätzlich im Frame [B] nicht die Seite "page3.htm", sondern z.B. "page4.htm" angezeigt werden!

      Wie ist dies möglich?

      1. Hallo Wolfgang,

        ich würde das JS an einer Stelle einbauen, die selbst keiner Veränderung unterliegt, also z.B. in der Top- oder Parent-Seite. Ob du es direkt da definierst oder extern einbindest ist unerheblich, es darf während des Umschaltvorgangs nur selbst nicht von Veränderung (Neuladen) betroffen sein.

        Aber ich weiß nicht, habe ich dich richtig verstanden? Hast du etwa ein Iframe im (I)Frame oder doch (hoffentlich) nur zwei Iframes auf hierarchisch gleicher Stufe nebeneinander? Ersteres würde wohl kompliziert, da du dann auch noch mit Query-Strings arbeiten müsstest, die im neuladenden (I)Frame den Tochter-Iframe mitbestimmen.

        Stell doch deinen Versuch mal ins Netz, wenn du eine Möglichkeit hast!

        Gruß Gernot

        1. Hallo Gernot!

          Ich habe zur Zeit leider keine Möglichkeit, meine Seite ins Netz zu stellen.

          Doch, ich habe ein IFrame im IFrame definiert.
          Gibt es eine Möglichkeit, eine JS-Funktion so zu programmieren, dass der gewünschte, beschriebene Link problemlos funktioniert? Gibt es dazu eine Beispiel oder kann mir dabei jemand behilflich sein?

          Beste Grüße
          Wolfgang

          1. Hallo Wolfgang,

            ich habe schwierigkeiten, mir das vorzustellen. Wo sitz denn der Link und was soll verändert werden, nur der Iframe 1. Grades oder nur der Iframe 2. Grades oder beide gleichzeitig?

            Musst du das wirklich so kompliziert aufbauen oder gibt es da keine einfachere Möglichkeit, warum Iframe im Iframe?

            Aber im Prinzip kannst du den Iframe 2. Grades von der Mutterseite aus so ansprechen:

            iframeErstenGrades.iframeZweitenGrades.location.href="xyz.html"

            Dabei stehen iframeErstenGrades und iframeZweitenGrades jeweils für den Iframe dem du einen entsprechenden Namen verpasst hast.

            Gruß Gernot

            1. Hallo Wolfgang nochmal,

              http://aktuell.de.selfhtml.org/tippstricks/javascript/fensterzugriff/index.htm

              Das hilft dir vielleicht weiter.

              Gruß Gernot

              1. Hallo Gernot!

                Ich habe gerade hier https://forum.selfhtml.org/?t=88835&m=530013 Carsten geantwortet, der meine Fragestellung verstanden hat.
                Ich habe hier auch zusätzlich nochmals die Problemstellung erläutert.

                Ich werde mir den von dir geposteten Link auf jeden Fall mal angucken.

                Grüße, Wolfgang

      2. Hi Wolfgang,

        das ist so einfach nicht möglich. Zu dem Zeitpunkt wo der Link geklickt wird exisitiert der IFRAME noch nicht. Denn der ist ja erst in der Seite, die erst noch geladern werden muß!
        Richtig unübersichtlich wird es wenn du auch noch Selbstmordscripte baust, d.h. solche die ihren eigenen location.href verändern.

        Zweckmässig ist es möglichst weit aussen (schlimmstenfalls eben ein extra Frameset aussenrum) ein Script zur Seitensteuerung unterzubringen.
        (Beachte: Das ist was ganz anderes als wenn das Script wiederholt in mehrere Seiten neu eingebunden wird.)
        Jetzt kann jede geladene Seite wenn sie fertig geladen hat (im onLoad=...) eine Funktion im Frame ganz aussen eine Funktion aufrufen die den IFRAME setzt. Im Frameset ganz aussen gibt es dazu eine Merkvariable die von der onClick=linkfunction() gesetzt wurde.

        Gruß,
          Carsten

        1. Hallo Carsten, Gernot!

          Das Frame [A] ist ganz aussen (definiert in der Datei "index.htm"). Diese Datei ändert sich nie.
          Heißt das, dass ich im <head>-Tag die Funktion linkfunction() definieren kann? Oder muss man im <body>-Tag ein Script definieren?

          index.htm

          ...
          <iframe src="page1.htm" name="frame_A">
            <p></p>
          </iframe>
          ...

          Von der Seite "page1.htm" (geladen in Frame [A]) aus soll der Link gesetzt werden:

          page1.htm

          ...
          <a href"javascript: linkfunction();">DAS IST DER LINK</a>
          ...

          Anschließend soll "page2.htm" in Frame [A] geladen werden und irgendeine andere Seite (z.B. "page4.htm", aber nicht "page3.htm") in Frame [B] geladen werden.

          page2.htm

          <iframe src="page3.htm" name="frame_B">
            <p></p>
          </iframe>

          Ich habe mal versucht, die linkfunction() im head-Bereich der Seite "index.htm" zu definieren. In diesem Fall konnte ich sie aus der Datei "page1.htm" aber nicht aufrufen --> JS-Fehler im IE.

          Wie muss ich das anlegen, dass es funktioniert?
          Gruß, Wolfang

          1. Hallo Wolfgang,

            Ich habe mal versucht, die linkfunction() im head-Bereich der Seite "index.htm" zu definieren. In diesem Fall konnte ich sie aus der Datei "page1.htm" aber nicht aufrufen --> JS-Fehler im IE.

            der Aufruf von page1.htm wäre dann parent.linkfunction()

            Die würde ich in index.htm im Head-Bereich definieren und dann sprichst du von dort aus folgendermaßen dein Frame zweiten Grades an:

            linkfunction() {
              frame_A.frame_B.location.href="neueseite.htm";
            }

            Gruß Gernot

            1. Hallo nochmal,

              der Aufruf von page1.htm wäre dann parent.linkfunction()

              Die würde ich in index.htm im Head-Bereich definieren und dann sprichst du von dort aus folgendermaßen dein Frame zweiten Grades an:

              linkfunction() {
                frame_A.frame_B.location.href="neueseite.htm";
              }

              Wenn du nicht gleichzeitig den frame_A ändern willst kannst du die linkfunction() auch in frame_A definieren und schreibst dort einfach

              frame_B.location.href="neueseite.htm";

              Wenn du beides gleichzeitig ändern willst, kannst du dem URL von frame_A den URL von frame_B als searchstring mitgeben und dort im Body von frame_A onLoad die location.href von frame_B die du erst einmal als leere Zeichenkette src="" definierst nachrtäglich setzen.

              Suche in SELFHTML nach location.search() und substring()!

              Gruß Gernot

          2. Hi Wolfgang,

            Das Frame [A] ist ganz aussen (definiert in der Datei "index.htm"). Diese Datei ändert sich nie.

            gut.

            Heißt das, dass ich im <head>-Tag die Funktion linkfunction() definieren kann?

            Ja, da sollte sie bin. (Muss nicht, ist aber üblich.)

            index.htm

            <script>
            merklink="";

            function linkfunction(linkA,linkB)
            {
              frame_A.location.href=linkA;
              merklink=linkB;
            }
            function setzteIframeLink()
            {
              if(merklink.length>0) // darf nur ausgeführt werden wenn vorher ein link gesetzt wurde
              {
                if(frame_A.frame_B)  // darf nur ausgeführt werden wenn in frame_A auch wirklich ein zweiter frame ist.
                 frame_A.frame_B.location.href=merklink;
              }
            }
            </script

            <iframe src="page1.htm" name="frame_A">
              <p></p>
            </iframe>
            ...

            Von der Seite "page1.htm" (geladen in Frame [A]) aus soll der Link gesetzt werden:

            page1.htm

            ...

            <a href="javascript: top.linkfunction("page2.htm","page4.htm");">DAS IST DER LINK</a>

            page2.htm

            <body .... onLoad="top.setzteIframeLink()">

            <iframe src="" name="frame_B">

            <p></p>
            </iframe>

            ausprobiert hab ichs nicht, aber das Prinzip sollte klar sein.
            href="javascript..." ist übrigens böse, besser ist
            <a href="page5.htm" onClick="top.linkfunction(...); return false;">
            weil der Link dann auch ohne Javascript geht (und auf page5.htm verweist - armseligstenfalls steht da dann drin 'Sorry ich war zu faul die Navi auch ohne Script hinzufummeln', besser natürlich der gewünschte Inhalt...)

            Gruss,
              Carsten