Michael: und nochmals Frames... verschachtelte nachladen

Beitrag lesen

Hi Alex,

Werde ich CSS schneller lernen als dieses Problem zu lösen :-)

???
Weis nicht ;-)
Weis nur, dass man beides nicht mal schnell ebenso nebenbei lernen kann ;-)
Die ersten 90% lernt man bei beiden ziemlich schnell, nur die anderen 90% dauern dann ;-)

Aber jetzt mal zu Deinen ernsteren Fragen...
Ich hab leider ein wenig den durchblick verloren, was wo wie welche Frames sind, deshalb versuch ichs mal lieber ganz allgemein zu erklären.

Ersteinmal dazu, wie diese JS-Funktionen funktionieren:

function checkFrameset() {
  if(!parent.mainFrame2)
   location.href="http://www.xyz.de/Neu/Start/index.htm?" + location.pathname;
}

Hier wird geprüft, ob es in der Seite die geladen wurde ein bestimmtes Objekt gibt, nämlich "parent.mainFrame2".

"parent" gibt dabei an, dass dieses Objekt im direkt übergeordneten Element (Frame) zu finden ist. ("top" würde im gegensatz dazu immer das aller oberste Objekt der Hierarchie ansprechen).
"mainFrame2" ist der Name des Objektes, das es dort geben soll.
(Aus JS-Sicht ist der Frame "mainFrame2" ein Objekt, das Du über seinen Namen, also eben "mainFrame2" ansprechen kannst.)

if(!parent.mainFrame2) bedeutet also: "falls es das Objekt mainFrame2 im übergeordneten Objekt (Frame) nicht gibt, dann..."
(wobei damit gleich zwei Bedingungen geprütf werden:
1. gibt es überhaupt ein übergeordnetes Objekt
2. enthält dieses wiederum ein Objekt "mainFrame2")
... mach folgendes:

location.href="http://www.xyz.de/Neu/Start/index.htm?" + location.pathname;

"ändere die Adresse (URL) in "http://www.xyz.de/Neu/Start/index.htm?" und hänge daran (+) den Pfad der aktuellen Adresse (also den relativen Weg zur aktuellen Seite von der eigentlichen Adresse aus zb www.adresse.de/pfad/weg/einFrame.html --> Adresse = www.adresse.de/ und Pfad = pfad/weg/einFrame.html)")

Damit wird dann also was neues im Browser geladen, nämlich die angegebene Adresse ("http://www.xyz.de/Neu/Start/index.htm") und daran angehängt steht in der Adresszeile der neu geladenen Seite der Anhang mit "?" und dem "Pfad".

In dieser Seite die nun geladen wurde steht dann der zweite Teil des Skripts:

function checkFramecall() {
  var Adressanhang=location.search;
  if(Adressanhang)
  frames.topFrame.location.href=Adressanhang.substring(1,Adressanhang.length);
}

Dieser sorgt nun dafür, dass der der Frame, der zuvor (einzeln) geladen war nun als Frame in dem Frameset (an eine bestimmte "Stelle") geladen wird, was so funktioniert:
In die Variable Adressanhang wird ein String gespeichert, der den Pfad zu dem Frame enthält. Dieser String ergibt sich aus dem, was in der Adresszeile mit "?" angehängt ist (also den relativen Pfad zum Frame).

if(Adressanhang) prüft lediglich, ob es den Adressanhang überhaupt gibt (da es ja sonst unsinnig wäre, weiterzumachen).

Nun wird der Adressanhang an den gewünschten Frame (Objekt) übergeben.
(Jedes (Frame)Objekt hat von Haus aus einige Eigenschaften. Darunter die Eigenschaft "Adresse" (location), die geändert werden kann. (Und eine Eigenschaft Name, mit dem man das Objekt ansprechen kann)).

"frames.topFrame.location.href" spricht also die Adresseigenschaft des Objektes "topFrame" an.
Diese wird nun geändert ("=" bzw. neu zugewiesen). Dabei wird der String der String der in der Variablen Adressanhang gespeichert wird zugewiesen.
Allerdings nicht der ganze, sondern nur ein bestimmter Teil davon (substring). Und zwar der Teil vom zweiten Zeichen ("1") bis zum letzten (Adressanhang.length).
"1" ist das zweite Zeichen, weil die Zeichen mit 0 beginnend gezählt werden.
Adressanhang.length ist das letzte Zeichen, weil es als Ergebis die Länge des Strings liefert und damit die Nummer des letzten Zeichens.

Einfach gesagt wurde also das erste Zeichen des Strings abgeschnitten und dieses erste Zeichen war das "?", das bei var Adressanhang = location.search im String mit abgespeichert wurde.

Wenn Du das nun verstanden hast, wie es  funktioniert, kannst Du damit beliebige Frames in Deine Hauptseite oder das darunterliegende Haupt-Frameset laden lassen.

Ob und wie Du das genau machen musst, kann ich Dir pauschal nicht beantworten. Das hängt davon ab, welche Frames wann geladen werden sollen und ob sich abhängig von dem Frame mit dem eigentlichen Content noch andere Frames ändern sollen (zb wenn Content-Frame X geladen ist, dass dann der Navigationsframe Y statt Z geladen werden soll). Wenn das so ist, prüfst Du am besten vom Content-Frame aus, ob es top.einenFrameDerDenContentFrameEnthält gibt und übergibst dann von top aus den Pfad für den Content Frame. Den sprichst Du von dieser "top"-Seite (also der eigentlichen index.html) aus dann der Hierarchie entsprechend mit seinem Namen an.
Also zb.
frames.EinUnterFrame.NochEinUnterFrame.DerContentFrame
(Denn wenn die index.html geladen wurde, wurden mit ihr ja alle SubFrames geladen (nur eben evtl. nicht die richtigen)).
Sollen sich nun abhängig vom ContentFrame auch andere Frames ändern, gibt es dazu verschiedene Möglichkeiten. Am einfachsten aber Schreibaufwendigsten ist, wenn Du in der index.html mit einer Fallunterscheidung prüfst, ob wenn ContentFrame X geladen ist auch NaviFrame Y geladen ist das sieht dann in JS so aus:
if ( ! ( (ContentFrame.location.href == "http://www.abc.de/abc/contentX.html") && (NaviFrame.location.href == "http://www.abc.de/xyz/naviY.html")))
{
NaviFrame.location.href = http://www.abc.de/xyz/naviY.html;
}

Hoffe, das hilft Dir ein bisschen weiter.

PS: falls Du noch Fragen hast, die darauf hinauslaufen, wie nun welcher hauptframe1, mitte, MainFrame2 usw. sein soll, dann musst Du mir dazu bitte einen Link zu der Seite posten (oder mailen), weil ich da leider den Überblick verloren habe ;-)

Viel Spaß beim JS lernen und üben und noch ein kleiner Tipp:
Mit alert(frames.einFrame.location.href) oder ähnlich kannst Du immer schnell und einfach prüfen, was wo wie gerade ist oder sein soll.

Viele Grüße

Michael