Seitenwechsel in Frames registrieren und darauf reagieren
Tobias S.
- javascript
Hallo zusammen!
Ich suche einen komfortablen Lösungsweg zu folgender Situation:
Beispiel:
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:
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)
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
Ä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.
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 :-)
- Fremde Frames neu laden (fremde_frames.location.reload())
- Im Inhalt aller anderen Frames existiert eine fest vorgegebene Funktion, die aufgerufen wird
- Ä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
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.
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:
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:
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:
//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.