|
|
|
|
Einzelseiten ins Frameset umleiten (JavaScript)
Ein weiteres Problem mit den Frames ist ja auch, daß über Suchmaschinen häufig auf Seiten verwiesen wird, die eigentlich Teil dieses Framesets sein sollten. Mit einer Unmenge JavaScript kann man den Besucher in das Frameset umleiten und dort den zuerst aufgerufenen Inhalt an der korrekten Stelle laden. Natürlich gibt es hierfür diverse Variationen, je nach Bedürfnis, aber die grundsätzliche Vorgehensweise sollte klar werden.Ruft man nun die URL "[..]/tips/tip021.html" auf, so wird man umgeleitet zu "[..]/index.html?tips?tip021" und der Inhalt ist in den korrekten Frames vorzufinden.
- Die aufrufende Datei, der Frameinhalt, der ungewollt ohne Frames geladen wurde, lädt die Hauptadresse, welche das Frameset enthält, und übergibt seinen eigenen Ort als Parameter.
<script language="JavaScript"><!-- function ersetzen(adresse) {top.location.href = adresse;} // --> </script> <script language="JavaScript1.1"><!-- function ersetzen(adresse) {top.location.replace(adresse);} // --> </script> <script language="JavaScript"><!-- folder="tips"; file="tip021"; if (parent.in_frame + "" != "yes") {ersetzen("../index2.html?"+folder+"?"+file);} // --> </script>Zuerst wird eine Funktion definiert, die die neue URL in das Hauptfenster lädt. Dabei bietet sich in "JavaScript 1.1" die Möglichkeit, den aktuellen Eintrag auch bequem aus der History zu löschen, womit die Funktionalität der "Zurück"- Browserfunktion erhalten bleibt. Darum wird die gleichnamige Funktion gegebenenfalls durch eine erweiterte überschrieben...
Danach wird mit "folder" und "file" der Standort dieser Datei angegeben. (Ist "folder" leer, wird das Stammverzeichnis angenommen.) Ich teile dies hier in zwei Variablen auf, um später bequemer zwei Frames gleichzeitig ändern zu können. Man kann aber auch nur eine Variable verwenden, was im Folgenden kleine Optimierungen erlaubt, oder eine Variable zu anderen Zwecken (Ziel-Frame?) verwenden.
Zuguterletzt wird geprüft, ob sich diese Datei im korrekten Frame befindet. Dies geschieht durch die Definition einer Variable in der Datei, die das Frameset definiert: Ist die Variable nicht gesetzt, ist auch das Frameset nicht vorhanden.- Dies ist in der Datei, die das Frameset erzeugt:
<SCRIPT LANGUAGE="JavaScript"><!-- var in_frame = "yes", folder="", file=""; var uebergabe = self.location.search; if (uebergabe != "") { uebergabe=uebergabe.substring(1,uebergabe.length); for (i = 0; i < uebergabe.length; i++) { if (uebergabe.charAt(i) == "?") { folder=uebergabe.substring(0,i); file=uebergabe.substring(i+1,uebergabe.length); } } } //--> </SCRIPT>Dieser Datei wurden von der vorher aufgerufenen Datei der dortige Dateiname übergeben. Dieser wird Variablen zugewiesen, damit er in Folge abrufbar ist...
- Die Dateien, die im Normalfall in das Frameset geladen werden, müssen sich selbst durch den entsprechenden Inhalt ersetzen:
<script language="JavaScript"><!-- function ersetzen(adresse) {parent.***.window.location.href = adresse;} function nach_top(adresse) {top.window.location.href = adresse;} // --> </script> <script language="JavaScript1.1"><!-- function ersetzen(adresse) {parent.***.window.location.replace(adresse);} function nach_top(adresse) {top.window.location.replace(adresse);} // --> </script> <script language="JavaScript"><!-- if (top.in_frame + "" != "yes") { nach_top("index.html"); } else { if (parent.file+"" != "") { datei = parent.file; parent.file = ""; if (parent.folder+"" != "") { datei = parent.folder+"/"+datei; }; ersetzen(datei+".html"); }}; // --> </script>"parent.***.window.location." enthält den Namen des Frames (Groß- und Kleinschreibung beachten!). Ansonsten ist dies ähnlich der ersten Stufe, der Datei, die außerhalb des Frames geladen wurde.
- Dateien, die ihren Inhalt innerhalb des Framesets nicht ändern, wie z.B. Logos, müssen ja nur sich durch das gesamte Frameset ersetzen, ohne danach weitere Dateien "nachzuladen":
<script language="JavaScript"><!-- function nach_top(adresse) {top.location.href = adresse;} // --> </script> <script language="JavaScript1.1"><!-- function nach_top(adresse) {top.location.replace(adresse);} // --> </script> <script language="JavaScript"><!-- if (top.in_frame + "" != "yes") {nach_top("../index.html");} // --> </script>Wichtig: Mit dem Internet Explorer (3?) ist man nicht in der Lage, dies auf der Festplatte zu testen, da dieser das Protokoll file: innerhalb von JavaScript nicht unterstützt...
Zusätzlich bietet dieses Script noch die Funktionalität, daß das Frameset, sollte es innerhalb fremder Frames geladen werden, sich automatisch in das gesamte Fenster expandiert. Dies läßt sich vermeiden, wenn man die Funktion "nach_top" durch "ersetzen" und "top.in_frame" durch "parent.***.in_frame" ersetzt. Gleichfalls wäre dies Verhalten beim Laden einzelner Dateien gegebenfalls wohl einfach durch Ersetzen des "top" durch "self" in Punkt 1 zu ändern.
Dieses Script entstammt hauptsächlich der Homepage von de.comp.lang.javascript, der entsprechenden Newsgroup und den JavaScript- Notizen. Vielen Dank für die Mithilfe...