Oliver: Mehrere Frames ändern & Back-Button

Hallo!

Ich weiß nicht, ob das Problem mit dem Back-Button bei der Änderung mehrerer Frames mit einem Link schon gelöst ist. Hier mein Vorschlag, der in Tests funktioniert hat:

Vorab: Sollten die erklärten Funktionen in dieser Mail nicht angezeigt werden, werden Sie vom Browser als Quellcode interpretiert. Bitte in diesem Fall den Quellcode der Mail ansehen!

Frameset mit drei Frames
0: Navigation
1: z.B.: Überschrift
2: Hauptseite

A. Quelltext zum Ändern der Frames 1 und 2 durch Link im Frame 0:

1. Funktion im Dateikopf der Frame 0-Datei:
------------------------------------------------------
function ZweiFrames(URL1,F1,URL2,F2)
   {  
    parent.frames[F1].location.replace(URL1);
    parent.frames[F2].location.href=URL2;
   }

------------------------------------------------------

2. Aufruf der Funtion beim Anklicken des Links in Frame 0:
------------------------------------------------------
   <A HREF="javascript:ZweiFrames
      ('frame1datei.htm',1,'_frame2datei.htm',2)">Frames ändern</A>
------------------------------------------------------

Folge: Nur die URL der letzten Datei bleibt in der History stehen. Beim Betätigen des Back-Buttons wird diese Seite  in den Frame 2 geladen.

B. Beim Zurückspringen auf diese Seite muß die passende Seite in den Frame 1 geladen werden. Dies geschieht mit Hilfe einer Funktion, die überprüft, ob im Frame 1 bereits die richtige Seite steht. Andernfalls wird sie nachgeladen. Diese Funktion steht mi Kopf der Frame 2-Datei und wird onLoad ausgeführt.

Wichtig ist, daß alle HTML-Dokumente, die in Frame 2 stehen, mit einem _ (Unterstrich) beginnen. Dieser darf sonst im Pfad (URL, Verzeichnisnamen) nicht vorkommen. Außerdem sollte die passende Datei für Frame 1 im gleichen Verzeichnis liegen (Bei anderem Verzeichnis entspr. mit ../ anpassen).

------------------------------------------------------
function checkframes()
   {

/* Pfad der Infoseite im Hauptframe ermitteln und speichern. */
   var Infodatei = "'" + parent.frames[2].location + "'";

/* Startposition des Dateinamens ermitteln und speichern. */
   var Schnitt = Infodatei.indexOf("_") - 1;

/* Pfad um Dateinamen kürzen und speichern. */
   var Verzeichnis = Infodatei.substr(1,Schnitt);

/* Prüfen, ob Frame1 den richtigen Inhalt anzeigt, ggf. ersetzen. */
   if (parent.frames[1].document.location != Verzeichnis  
      + "frame1datei.htm")
   parent.frames[1].location.replace(Verzeichnis + "oben01.htm");

Aufruf der Funktion:

<BODY onLoad="checkframes()">

Die Datei im Frame 1 wird also nur geladen, wenn Sie nicht ohnehin bereits angezeigt wird (dies ist z. B. bei Betätigung des Links "Frames ändern" (s. o.) der Fall.).

liegt die Frame2-Datei in einem untergeordneten Verzeichnis /docs, muß der Pfad mit indexOf nach der Zeichenkette docs/_ durchsucht werden. Liegt die Frame1-Datei in einem anderen Verzeichnis, muß die Variable "Verzeichnis" um den zusätzlichen Pfad ergänzt werden:

Verzeichnis + "/zusVerz/frame1datei.htm".

So, ich hoffe, ich habe diese zugegebenermaßen etwas umständliche Lösung einigermaßen verständlich erklärt. Notwendige Anpassungen können sich aus der Verzeichnisstruktur Euerer Webseite ergeben.

Hierzu kann ich nur das ausführliche Studium von SELFHTML empfehlen. Wirklich ein großes Kompliment an den Autor!!!

Tschüss

Oliver Beyer

P.S.: Bei Verwendung der Funktionen würde ich mich über einen kurzen Hinweis auf den Urheber freuen.

  1. Korrekturen:

    In der Funktion checkframes():

    /* Prüfen, ob Frame1 den richtigen Inhalt anzeigt, ggf. ersetzen. */
       if (parent.frames[1].document.location != Verzeichnis  
          + "frame1datei.htm")
       parent.frames[1].location.replace(Verzeichnis + "frame1datei.htm");

    Oliver

    1. Sorry, noch eine Korrektur: Klammer am Ende der Funktion fehlt

      Korrekturen:

      In der Funktion checkframes():

      /* Prüfen, ob Frame1 den richtigen Inhalt anzeigt, ggf. ersetzen. */
         if (parent.frames[1].document.location != Verzeichnis  
            + "frame1datei.htm")
         parent.frames[1].location.replace(Verzeichnis + "frame1datei.htm");

      }

  2. Hallo Oliver

    Ich weiß nicht, ob das Problem mit dem Back-Button bei der Änderung mehrerer Frames mit einem Link schon gelöst ist. Hier mein Vorschlag, der in Tests funktioniert hat:

    Wenn man mit ursprünglich 2 Frames arbeitet, dann in den Content-Frame ein weiteres Frameset lädt (das die beiden Seiten Überschrift und Inhalt enthält), hat man das Problem erst gar nicht. Und der große Vorteil: Es läuft auch ohne Javascript.

    MfG
    Andy

    1. Wenn man mit ursprünglich 2 Frames arbeitet, dann in den Content-Frame ein weiteres Frameset lädt (das die beiden Seiten Überschrift und Inhalt enthält), hat man das Problem erst gar nicht. Und der große Vorteil: Es läuft auch ohne Javascript.

      Aber nur, wenn die zwei Frames direkt nebeneinander oder untereinander liegen. Bei Frames, die sich nur an einer Ecke berühren, z. B. bei 4 Frames links oben und rechts unten, klappt das nicht.

      Für diese Fälle ist mein script gedacht.

      Oliver