Suche nach als

.frame

Auf dieser Seite:

Fenster ansprechen

Jeder Frame kann durch seine Relation angesprochen werden, durch seinen Namen oder seinen frames[] index. An die Stelle von 'window' tritt der Frame!

self, parent, top

'self' meint den Frame, in dem sich dieses Script befindet. 'parent' meint den übergeordneten Frame. 'top' meint das oberste Fenster bzw. das frameset. Wenn das Framesets nur einmal verschachtelt ist, sprechen 'parent' und 'top' das selbe Fenster an.

Home

So kann man den Frameset wechseln, egal in welchem Frame man sich gerade befindet (top ersetzt window):

top.location.href="index.htm"

Kontent

So kann man den Frame wechseln, in welchem man sich gerade befindet (self ersetzt window):

self.location.href="inhalt_agb.htm"

Achtung: 'content' ist ein reserviertes Schlüsselwort, es soll nicht als Framename verwendet werden, der im Folgenden verwendete Framename ist 'inhalt'.

Navigation

So kann man einen (oder zwei) Frame(s) wechseln - fernsteuern -, in welchem man sich nicht befindet (Framename ersetzt window):

<a href='javascript:void(parent.inhalt.location.href="inhalt_agb.htm");
  void(parent.fussframe.location.href="fuss_agb.htm");'>AGB</a>
// Es ginge auch mittels der Frameindizes (bei drei Frames):
parent.frames[2].location.href="inhalt_agb.htm";

Über eine Funktion

Aus einem Navigationsframe heraus lassen sich mittels parent und der Framenamen die Dateien in den unterschiedlichen Frames ansprechen:

<script type="text/javascript">
function framechange(url1,url2,url3) {
	parent.kopf.location.href=url1;
	parent.nav.location.href=url2;
	parent.inhalt.location.href=url3;
	}
</script>

Der Link mit dem Aufruf und der Parameterübergabe (das Frameset wird dabei nicht gewechselt):

<a href='javascript:framechange("kopf2.htm","nav1.htm","inhalt69.htm")'>Alle Frames wechseln.</a>

Ohne Javascript

Ohne Javascript (per HTML) spricht man einen anderen Frame via das Attribut target="Framename" an:
<a href="inhalt_agb.htm" target="inhalt">AGB</a>

Force in Frame

Jeder Frame eines Framesets beinhaltet eigene Dateien, welche entsprechend ihren Inhalten von Suchmaschinen indexiert werden und dann unabhängig, also ausserhalb ihres Frames und Framesets, geladen werden können. Auch Bookmarks verlinken nicht auf das Frameset, sondern auf die aktive Inhaltsseite.

Solchermassen aufgerufenen Seiten fehlt natürlich das Head- und das Navigationsframe (und wer weiss was sonst noch). Darum gibt es Scripts, die prüfen, ob sich die Datei in einem Frame befinded, und wenn dies nicht der Fall ist, die Frameset Datei aufrufen.

<script type="text/javascript">
if (parent.frames.length==0) { // if not in Frameset
  window.location.href="frameset_xy.htm" // URL des eigenen Framesets
 }
</script>

Den selben Effekt hat auch dieses Script:

<script type="text/javascript">
if (top.location == self.location) {
  self.location.replace("frameset_xy.htm")
 }
</script>

Das langweilige daran ist nun, dass das aufgerufene Frameset natürlich die Defaultdateien in seine einzelnen Frames ladt und nicht dasjenige, von welchem der Aufruf ausgegangen war.

Das Dilema könnte damit gelöst werden, dass für jede Inhaltsdatei ein eigenes Frameset existiert, welches die Inhaltsdatei aufrufen kann. Das führt zu einer Verdoppelung der Anzahl der Inhaltsdateien.

Doppelte Prüfung

Das Dilema wird gelöst, indem das Frameset auch prüft, was es lädt.

1. Stellt die Inhaltsdatei onLoad fest, dass es ausserhalb eines Frames ist, dann ersetzt es sich nicht nur selber durch die Framesetdatei, sondern gibt dem Aufruf als Substring auch noch seinen Dateinamen mit.

<script type="text/javascript">
// check if in Frame and tell my filename
function checkFrameset() {if(!parent.inhalt){location.href="frames_force_frameset.htm?" + location.pathname;}}
</script>

2. Das Frameset prüft seinerseits onLoad, ob es einen Substring empfängt und lädt die darin gefundene Datei in den Frame 'inhalt'.

<script type="text/javascript">
function checkFramecall() {
  var SetUrl=location.search;
  if(SetUrl) {frames.inhalt.location.href=SetUrl.substring(1, SetUrl.length); } }
</script>

>> frames_force_frameset.htm Das Frameset laden
>> frames_force_target.htm Versuch die Datei ausserhalb eines Frames zu laden

Dynamische Variante

Fast das Selbe macht diese Variante, der aber der jeweilige Dateinamen explizit mitgegeben wird.
Wenn sich diese Seite als oberste Seite wiederfinden würde, ersetzt sie ihre Adresse durch die Framesetadresse und fügt das Fragezeichen und ihren Dateinamen ein. So wird sie in der Frameset-Datei zur 'callingURL'

<script type="text/javascript">
if (top.location == self.location) {
  self.location.replace("frames_force2_frameset.htm?frames_force2_inhalt2.htm")
 }</script>

Das Frameset ist eine Rumpfdatei mit HTML- und Head- aber ohne Body-Tags, erst anhand der aufrufenden Datei schreibt das Javascript das Set und die aufrufende Datei hinein.

<script type="text/javascript">
// Standartseite im inhalt-Frame
linkURL = "frames_force2_inhalt1.htm";

// wenn das Objekt 'document.URL' bekannt ist fahre fort, sonst überspringe die geschweiften Klammern
if (parent.document.URL) {
  // die Variable 'callingURL' speichert den Objektwert
  callingURL = parent.document.URL;
  // gibt es in der 'callingURL' ein Fragezeichen dann ...
  if (callingURL.indexOf('?') != -1) {
    // ... ist die 'linkURL'  der Teilbereich der 'callingURL' nach dem Fragezeichen
    linkURL = callingURL.substring(callingURL.indexOf('?')+1,callingURL.length);
  }
}
// Frameset wird zeilenweise geschrieben bestehend aus 2 Zeilen
document.writeln('<frameset rows="150,*" border="0" framespacing="0" frameborder="no">')
//der Head-Frame
document.writeln('<frame src="frames_force2_head.htm" name="head" scrolling="no">')
// in die 2. Zeile kommen 2 Kolonnen
document.writeln('<frameset cols="162,*" frameborder="no" border="0" framespacing="0">')
//der Navigations-Frame
document.writeln('<frame src="frames_force2_navigation.htm" name="navigation" noresize scrolling="no">')
//der Inhalts-Frame
document.writeln('<frame src="' + linkURL + '" name="inhalt">')
//Frameset wird geschlossen
document.writeln('<\/frameset>')
</script>

(Dieses Script ist ohne Beispiel.)

Force out of Frame

Auch das Gegenteil kann erwünscht sein. Die schöne Seite, welche Sie mit viel Mühe erstellt haben, wird von einem Räuber einfach in sein Frameset geladen; mit seinem Logo im Headframe tut er auch noch so, als wäre er der Urheber.

Wir prüfen onLoad, ob die Datei in einem Frame ist, und wenn ja, befreien wir uns daraus:

<script type="text/javascript">
if (top.location != self.location) {
  top.location=self.location;
 }
</script>


Valid XHTML 1.0 Check den Code.

Scroll >> << Popups
Ich bin hier: > JavaScript Lehrling >>> .frame
 
HTML und XHTML | CSS | JavaScript und DHTML | PHP und MySQL | Andere Sprachen
Letzter Update: 29.01.2010