Frameinhalt 'dynamisch' erzeugen

Hallo, Profis,

folgende Situation: ich hab ein Frameset, in dem eine Kopfleiste (kopf.html), ein Menue (menue.html) und eine Hauptseite (wilkom.html) geladen werden. Wenn jetzt jemand wilkom.html direkt aufruft, wird per JavaScript das Frameset geladen. Soweit, so schön. Wenn jetzt aber jemand eine andere Seite direkt aufruft, die normalerweise in der Hauptseite erscheint (irgendeintext.html), lädt das JavaScript das Frameset natürlich wieder mit wilkom.html in der Hauptseite.
Nu die Frage: gibt es eine Möglichkeit, das Frameset beim Direktaufruf von irgendeintext.html dazu zu bringen, in der Hauptseite gleich irgendeintext.html darzustellen? Möglichst ohne serverseitiges Script?
Ich hab überlegt, mit document.referrer zu tricksen, bin mir aber nicht sicher, ob das nicht einen Einfluß auf die Performance der Seite hat…

grybelnden Gruß
Sibylle

PS: der Kunde will unbedingt Frames haben und ihr wisst ja: des Kunden Willi ist sein Himmelreich…

Kunden sind immer groessenwahnsinnig, aber es geht und ich habe jetzt keine Zeit…

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo,

Dein Problem laesst sich clientseitig loesen, aber es ist nicht ganz einfach,
was nicht heissen soll, dass es nicht perfekt funktioniert,
aber es verteilt sich auf mehrere Komponenten.

Jede HTML-Datei, von der Du glaubst, dass sie direkt aufgerufen werden kann
und die dann das Framset nachladen muss um sich im naechsten Schritt im MainFrame
selbst anzeigen zu koennen, muss im Header folgenden Eintrag haben:

Das Script, dass das Nachladen des Framesets besorgt, liegt in der oben genannten JS-Datei
named „framecheck.js“ (kann auch anders heissen).

Im body-Tag jeder Datei steht dazu noch folgendes:

Der Inhalt der Datei „framecheck.js“ sieht wie folgt aus:

/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/
/\* Global definitions \*/
/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/

var altPage = "./index.htm";

/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/
/\* Checks how and where to find the menu entry page \*/
/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/

function onCheckFrames(prmPage)
{
 prmPage = (prmPage && typeof(prmPage)=="string") ? prmPage : altPage;

 var thisPage = window.location.href.substring(window.location.href.lastIndexOf('/')+1);
 var menuPage = prmPage.substring(prmPage.lastIndexOf('/')+1);
 var menuPath = prmPage.substring(0,prmPage.lastIndexOf('/')+1);

 if ((top != self.parent) || (top == self)) {

 if (window.location.href.indexOf("FrontPage") != -1) {
 /\* FrontPage 2000 cannot preview this script \*/
 } else {
 if (thisPage != menuPage) {
 top.location.replace(menuPath+menuPage+'?'+thisPage);
 } else {
 top.location.replace(menuPath+menuPage);
 }
 }
 }
 self.focus(); 
}

Wenn eine solche Datei vollständig geladen ist, dann führt sie ueber den onload-Event die CallBack-Function „onCheckFrames()“ aus. „onCheckFrames()“ empfaengt ein Argument „prmPage“ in dem der Pathname zu der HTML-Datei steht, die das Frameset definiert. Ist kein Parameter vorhanden, dann wird ein default-Wert verwendet, was sich in diesem Fall hinter „altPage“ verbirgt. D.h. hier, das „./index.htm“ Dein Frameset definiert. Heisst Deine Frameset-Datei andern, so sollte path und name von „altPage“ entsprechend geaendert werden, oder Du gibt in der Datei folgenden Aufruf an:

Du kannst die Methode auch direkt aufrufen, indem Du das „onload“ im body weglaesst und folgendes anpasst in „framecheck.js“:

var altPage = "DefaultFramesetPathname";

function onCheckFrames(prmPage)
{
...
}

onCheckFrames("...");

In der Datei, die Dein Frameset definiert schreibst Du im Header folgendes rein:

function initInstance()
{ 
 var aryPages = window.location.search.substr(1).split("&");

 if (aryPages && aryPages[0].length) {
 top.frames["MainFrameTargetName\_OrZeroBasedIndex"].location.replace(aryPages[0]);
 } else {
 /\* Make nothing or load any other page in the MainFrame. \*/
 }

 return(true);
}
/\* Use the following if you do not want onload-Event in the framset-tag. \*/
/\* window.onload = initInstance; \*/





...

Die Funktion „initInstance()“ kannst Du selbstverstaendlich auch in eine externe JS-Datei auslagern und wie bei „framecheck.js“ als script mit src-Pathname-Angabe vor dem „frameset“-Tag in der Frameset-Datei im Header einbinden.
Fuer „MainFrameTargetName_OrZeroBasedIndex“ muss der Index des MainFrame’s oder der Target-Name des MainFrame’s wie er im Frameset via id- oder name-Attribute angegeben ist, eingesetzt werden.
Die else-Klausel ist nicht notwendig wenn im Frameset schon unter src-eine Default-Datei angegeben ist.
ich persoenlich wuerde fuer src der MainFrame-Datei eine Dummy-Datei angeben und die else-Klausel ausfuellen mit dem entsprechen Aufruf, wenn keine Datei angegeben wurde.

Wie funktioniert das ganze?:
Wenn die Datei die im Frameset angezeigt werden soll, aufgerufen wird, dann laedt onCheckFrames() den href -> „./FramesetHtmlFile.html?./CalledMainFrameFile.html“ on top (also die Frameset-Datei mit Parameter via ? getrennt).

In „initInstance()“ wird der Location-Parameter gechopped (also „./CalledMainFrameFile.html“) und in den vorgesehenen MainFrame geladen (ersetzt also die zuvor geladene Dummy-Datei). Ist kein Parameter angegeben, dann wird in der else-Klausel entweder nix gemacht oder dort das gleiche wie im if-Zweig, nur mit Angabe einer Defaul-Datei.

Eine Dummy-Datei kann wie folgt aussehen:

Das src-Attribute im frame-Tag vom Frameset wuerde ich nicht leer lassen (Netscape4).
Statt

top.frames["MainFrameTargetName\_OrZeroBasedIndex"].location.replace(aryPages[0]);

kann oben auch stehen:

parent.frames["MainFrameTargetName\_OrZeroBasedIndex"].location.replace(aryPages[0]);
oder
top.frames["MainFrameTargetName\_OrZeroBasedIndex"].location.href = aryPages[0];
oder
parent.frames["MainFrameTargetName\_OrZeroBasedIndex"].location.href = aryPages[0];

Noch Fragen…? … dann bitte nicht an mich… :smile:

Ciao

2 „Gefällt mir“

Hallo, Profis,

folgende Situation: ich hab ein Frameset, in dem eine
Kopfleiste (kopf.html), ein Menue (menue.html) und eine
Hauptseite (wilkom.html) geladen werden. Wenn jetzt jemand
wilkom.html direkt aufruft, wird per JavaScript das Frameset
geladen. Soweit, so schön. Wenn jetzt aber jemand eine andere
Seite direkt aufruft, die normalerweise in der Hauptseite
erscheint (irgendeintext.html), lädt das JavaScript das
Frameset natürlich wieder mit wilkom.html in der Hauptseite.
Nu die Frage: gibt es eine Möglichkeit, das Frameset beim
Direktaufruf von irgendeintext.html dazu zu bringen, in der
Hauptseite gleich irgendeintext.html darzustellen? Möglichst
ohne serverseitiges Script?

Ich glaube (ohne nachzuschauen), daß dieses Thema in http://www.dcljs.de/faq/fragen.php#Fenster abgehandelt ist. Hab’ ich jedenfalls vor einiger Zeit dort gekupfert.

eljot

Hai, Vir2allender

DANKE!!!

Noch Fragen…? … dann bitte nicht an mich… :smile:

Na gut, dann frag’ ich Dich nicht, ob ich Dir zur Belohnung einen 1:1-Nachbau von Schloß Neuschwanstein schenken soll :wink:

begeisterten Gruß
Sibylle

Hai, eljot,

auch 'n feiner Tip - Danke

Sibylle