Tobias S.: Seitenwechsel in Frames registrieren und darauf reagieren

Hallo zusammen!

Ich suche einen komfortablen Lösungsweg zu folgender Situation:

  • Frameset mit zwei oder mehr Frames A, B, ...
  • Den Frames ist der Inhalt aller anderen Frames unbekannt
  • Falls A seinen Inhalt wechselt, soll das den anderen Frames mitgeteilt werden, damit sie mit Javascript in irgend einer Form darauf reagieren können

Beispiel:

  • Frame A: Frame mit Hauptmenü
  • Frame B: Frame mit Content
  • Link in seite1.html in B führt zu seite2.html in B
  • A reagiert darauf, indem automatisch das Untermenü zu seite2.html geöffnet wird

Mein Problem umfasst nicht WELCHE Reaktion in A erfolgen soll, sondern WIE eine beliebige Aktion in einem fremden Frame angestoßen wird!

Folgende Lösungsansätze habe ich mir überlegt:

  1. Fremde Frames neu laden (fremde_frames.location.reload())
    Vorteil: Inhalt des fremden Frames könnte auf neue URL des geänderten Frames zugreifen und entsprechend reagieren
    Nachteil: Frames sollen reagieren und nicht neu geladen werden (Traffic)

  2. Im Inhalt aller anderen Frames existiert eine fest vorgegebene Funktion, die aufgerufen wird
    Vorteil: Kann direkt während des Seitenwechsels angestoßen werden
    Nachteil: Was soll die Funktion ausführen? Was getan werden soll ist dem wechselnden Frame leider unbekannt

  3. Ändern einer fest vorgegebenen Variable in allen anderen Frames
    Vorteil: Kann direkt während des Seitenwechsels angestoßen werden und bleibt unabhängig vom Inhalt der eigentlichen Reaktion, die ausgeführt werden soll
    Problem: Man bräuchte eine Möglichkeit um eine Variable auf Änderung zu überwachen (Variable ändert sich > Aktion wird ausgeführt). Eine Art Eventhandler für Variablenwerte. Eine andere - nicht ganz so elegante - Möglichkeit wäre, mit setInterval() regelmäßig eine Funktion aufzurufen, die den Status der Variable überwacht und bei einer Änderung entsprechend reagiert. All das müsste bei Bedarf vom Inhalt der fremden Frames implementiert werden. Die Lösung ist allerdings unsauber, da "ständig gearbeitet wird" und eine Reaktion  durch zu großzügig gesetzte Intervallpausen trotzdem zu spät kommen könnte.

Ich hoffe ich konnte meine Gedankengänge ausreichend schildern und freue mich über jeden Kommentar zu meinen Lösungsansätzen. Oder hat jemand einen völlig neuen Lösungsansatz?

Viele Grüße,
Tobias S.

  1. Hallo Tobias,

    Ich suche einen komfortablen Lösungsweg zu folgender Situation:

    Du arbeitest mit Frames, Dein Problem beruht ...

    • Frameset mit zwei oder mehr Frames A, B, ...
    • Den Frames ist der Inhalt aller anderen Frames unbekannt
    • Falls A seinen Inhalt wechselt, soll das den anderen Frames mitgeteilt werden, damit sie mit Javascript in irgend einer Form darauf reagieren können

    ... wie Dein Beispiel wunderbar demonstriert ...

    Beispiel:

    • Frame A: Frame mit Hauptmenü
    • Frame B: Frame mit Content
    • Link in seite1.html in B führt zu seite2.html in B
    • A reagiert darauf, indem automatisch das Untermenü zu seite2.html geöffnet wird

    ... einzig und allein auf der Verwendung von Frames

    Folgende Lösungsansätze habe ich mir überlegt:

    Workarounds :-)

    1. Fremde Frames neu laden (fremde_frames.location.reload())
    2. Im Inhalt aller anderen Frames existiert eine fest vorgegebene Funktion, die aufgerufen wird
    3. Ändern einer fest vorgegebenen Variable in allen anderen Frames

    Ich hoffe ich konnte meine Gedankengänge ausreichend schildern und freue mich über jeden Kommentar zu meinen Lösungsansätzen. Oder hat jemand einen völlig neuen Lösungsansatz?

    Tobias, es gibt einen sehr einfachen und schönen Lösungsansatz:
    Verzichte ganz einfach auf die Frames und die Probleme die sie Dir bereiten.

    Freundliche Grüße

    Vinzenz

    1. Tobias, es gibt einen sehr einfachen und schönen Lösungsansatz:
      Verzichte ganz einfach auf die Frames und die Probleme die sie Dir bereiten.

      Freundliche Grüße

      Vinzenz

      Da hast du natürlich Recht ;-)

      Allerdings handelt es sich hierbei nicht um eine fertige Website, sondern um einen Teil eines WCMS, das in der Lage sein sollte bei Bedarf mit einer solchen Situation umzugehen.

      Frames sind zwar unschön, aber sie gehören nun mal (leider) zum Umfang des Systems.

      Vorschläge werden also weiterhin gerne angenommen :-)

      Viele Grüße,
      Tobias S.

  2. Hallo zusammen!

    Mitlerweile ist mir eine brauchbare Lösung zu dem Problem eingefallen. Um den Thread abzuschließen möchte ich die Lösung hier gerne vorstellen.

    Szenario wie in der Fragestellung:

    • Frame B ändert seinen Inhalt
    • Frame A reagiert darauf durch eine beliebige Javascript-Aktion

    Da B seinen Inhalt stets durch den Aufruf einer Javascript-Funktion ändert, kann den anderen Frames die Änderung im gleichen Atemzug mitgeteilt werden. B darf dabei annehmen, dass sich in jedem Frame die Variable "current_html" und die Funktion "after_addressing_frames()" befinden:

    • Variable "current_html": Speichert die aktuelle URL
    • Funktion "after_addressing_frames()": Startet alle "Reaktionen" des Frames A

    Anders gesagt, kapselt die Funktion "after_addressing_frames()" alle nötigen Funktionsaufrufe. Die Namen aller Reaktions-Funktionen (0..n) müssen der Funktion "after_addressing_frames()" zunächst bekannt gemacht werden. Das geschieht widerrum durch eine weitere Funktion:

    • Funktion "register_function(new_function)": Einen Funktionsaufruf in "after_addressing_frames()" bekannt machen:

    //Die Funktion wird als "Leer"-Funktion initialisiert
    function after_addressing_frames(){}

    //Registrieren von Funktionsaufrufen in after_addressing_frames()
    function register_function(new_function)
    {
     var after_addressing_frames_old = after_addressing_frames;
     after_addressing_frames = function()
     {
      after_addressing_frames_old();
      new_function();
     }
    }

    Um das Beispiel fortzuführen, geht man nun davon aus, dass A eine HTML-Datei mit folgender Javascript-Funktion zur Verfügung stellt, mit der auf wechselnde Inhalte in B reagiert werden soll:

    //Ausgabe der aktuellen URL
    function gibaus(){alert(current_html);}

    Diese Funktion muss in "after_addressing_frames()" registriert werden, damit sie bei einem Seitenwechsel in einem fremden Frame automatisch aufgerufen wird:

    //Registrieren der Funktion "gibaus()"
    register_function(gibaus);

    Ein Aufruf der Funktion "after_addressing_frames()" erzeugt nun ein Alert-Fenster. Theoretisch könnte man "gibaus()" mehrfach registrieren, was bei einem Aufruf von "after_addressing_frames()" mehrere aufeinanderfolgende Alert-Fenster zur Folge hätte. Auf die gleiche Weise lassen sich beliebig viele, unterschiedliche Funktionen registrieren, die zeitgleich mit dem auslösenden Inhaltswechsel ausgeführt werden, und die dank der Variable "current_html" sofort auf die neue URL zugreifen können.

    Viele Grüße,
    Tobias S.