|
FAQ de.comp.lang.javascript |
|
Bitte verwenden Sie als Einstiegsadresse in diese FAQ die
Homepage der Newsgroup de.comp.lang.javascript.
Der Aufenthaltsort dieser Seiten hier kann sich ohne Vorwarnung ändern.
Achtung:
Die
Antwort
berücksichtigte noch nicht die Tatsache, dass window in MSIE > 3
unter die "same origin policy" fällt, so dass ein Zugriff auf Variablen in top einen
"Zugriff verweigert"-Error wirft. Hier passiert das bei top.frameset_geladen dann, wenn
die Seite, die im eigenen Frameset nachgeladen werden soll, zuerst einmal in einem fremden Frameset steckt.
Das eigentliche Prinzip des Nachladens (2.Teil der Antwort) ist nach wie vor gültig.
Ein Ansatz, wie man die Sache mit der "same origin policy" bei Zugriff auf Eigenschaften von window prinzipiell umgehen kann, ist als Zusatz zu dieser Antwort zu finden.
Den Einbau in die Antwort auf diese Frage hier bleiben wir noch ein wenig schuldig. :-(
Das Problem:
eine Seite ist mit Frames aufgebaut, sagen wir zwei Frames, einer mit dem Namen MENU
und einer mit dem Namen INFO.
Wenn jetzt jemand z.B. über eine Suchmaschine eine der Infoseiten aufruft, soll nicht nur diese
Seite angezeigt werden, sondern das dazugehörige Frameset soll aufgebaut werden,
und in den INFO-Frame soll die entsprechende Datei geladen werden.
Um dies zu erreichen, sind mehrere Schritte nötig:
Zunächst muß man, wie im oben genannten FAQ-Eintrag beschrieben, überprüfen,
ob das Frameset geladen wurde. Dazu definiert man in der Frameset-Datei eine Variable,
die in der Frame-Datei überprüft wird. Wenn das Frameset nicht geladen ist,
wird es nachgeladen.
Dabei übergibt man den jeweiligen Dateinamen in der URL an das Frameset.
Im Frameset steht dann eine Funktion die den Search-String der URL auswertet und die
entsprechende Datei in einem Frame nachlädt.
Zu theoretisch?
Okay, hier sind die Bausteine.
Die Frameset-Datei nennen wir FRAMESET.htm, die Datei, die im INFO-Frame angezeigt werden soll, heißt DATEI.htm.
Im Head von DATEI.htm steht folgendes Script:
<SCRIPT LANGUAGE="JavaScript"> <!-- var Dateien = "FRAMESET.htm?DATEI.htm"; if (top.frameset_geladen + "" != "okay"){ if(document.images) top.location.replace(Dateien); else top.location.href = Dateien ; } //--> </SCRIPT>
[Anmerkung: Die Abfrage von "document.images" ist hier ein Workaround. Sie testet, ob der Browser JavaScript 1.1 beherrscht und damit auch "location.replace()" (wenn nicht, wird "location.href" verwendet). "replace()" hat den Vorteil, daß der History-Eintrag überschrieben wird. "location.href" dagegen funktioniert auch mit dem Internet Explorer 3.x und dem Navigator 2.x]
In FRAMESET.htm definiert man zunächst im Head die Variable, und da steht auch die Funktion zum Nachladen der entsprechenden Datei in den INFO-Frame.
<SCRIPT LANGUAGE="JavaScript"> <!-- var frameset_geladen = "okay"; function SeiteLaden() { if(self.location.search.length > 0) { var Search_Laenge = self.location.search.length; var info_url = self.location.search.substring(1,Search_Laenge); self.INFO.location.href = info_url; } } //--> </SCRIPT>
Im Frameset-Tag der Datei FRAMESET.htm wird diese Funktion 'onLoad' aufgerufen.
<FRAMESET ... onLoad="SeiteLaden(); return true;">
Das wär's.
Wenn jetzt jemand direkt DATEI.htm aufruft,
wird zunächst das Frameset aufgebaut und anschließend DATEI.htm in den INFO-Frame geladen.
Alternativ zu self.location.search könnte natürlich auch mit self.location.hash gearbeitet werden.
Probleme dieser Lösung:
var onError = (document.all) ?null :onError, topUrl = "http://meineDomain.de/meineSeite.html"; function setTopUrl(){ onerror = onError; top.location.href = topUrl; return true; } onerror = setTopUrl; if(top.location.href != topUrl){ setTopUrl(); } onerror = onError;
Anmerkung:
Der eigenartige onError-Konstrukt ist für Mac-IE notwendig,
da Lesezugriffe auf onerror Fehler provozieren, so dass bei
origOnerror = onerror;
bereits einen Fehler auftaucht.
(Danke, Thomas Fischer)
Diese Seite ist Teil der de.comp.lang.javascript FAQ. Die Einstiegsadresse lautet http://www.dcljs.de/.
Dieser Text wurde erstellt von Michael Buschbeck (©) und zuletzt bearbeitet von Christine Kühnel.
© S. Mintert, Ch. Kühnel
______ letzte Änderung: 01.01.2002 ______
Original-URL dieser Datei: http://dcljs.de/faq/antwort.php?Antwort=fenster_framecheck