Homepage de.comp.lang.javascript
Homepage
de.comp.lang.javascript

FAQ de.comp.lang.javascript

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.
 

 

Wie lade ich das Frameset zu einer bestimmten Datei nach?

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:

 

Zusatz:

Ansatz, wie man die Sache mit der "same origin policy" bei Zugriff auf Eigenschaften von window prinzipiell umgehen kann
   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)

top

Diese Seite ist Teil der de.comp.lang.javascript FAQ. Die Einstiegsadresse lautet http://www.dcljs.de/. Der Text der Seite wurde erstellt von Michael Buschbeck (©) und zuletzt bearbeitet von Christine Kühnel.

 ______ letzte Änderung: 12/2012 ______ 

 
© S. Mintert, Ch. Kühnel