barrierefreies Webdesign Ingo Turski

zum Inhalt

Ingo

Tips und Tricks:Frameset ohne Zwischenanzeige nachladen mit JavaScript

Framesets sind im aktuellen XHTML Strict nicht mehr zulässig, aber sie werden - besonders von Einsteigern mit geringen CSS-Kenntnissen - noch immer bevorzugt eingesetzt, um den Titelbereich und/oder die Navigation feststehend zu positionieren.

Wird nun eine einzelne Seite eines Framesets z.B. über den Link einer Suchmaschine direkt aufgerufen, fehlt das Frameset und damit meist die Navigation zu den weiteren Seiten des Angebotes, manchmal sogar die im Titel-Frame stehenden Angaben zum Anbieter.
Man sollte daher entsprechende Vorsorge treffen und:

Hier möchte ich eine JavaScript-Lösung vorstellen, die ich auf meinen älteren, noch nicht 'XHTML Strict'en Seiten verwende; hier ein Test (Info zum CSS-Standard).

Was man leider häufig sieht, ist ein solches einfaches Script:

<script type="text/javascript">
  if (top.frames.length == 0) top.location.href="index.html";
</script>

Der Nachteil hierbei ist, daß die über einen direkten Link aufgerufene Seite nicht angezeigt wird und kaum ein Besucher gerne nach der z.B. in einer Suchmaschine gefundenen Information über die Startseite erneut suchen will.

Es ist also erforderlich, das Frameset so aufzurufen, daß die aufgerufene Seite in den Inhalts-Rahmen geladen wird. Üblicherweise wird hierzu unnötig das Frameset (i.d.R. die Index-Datei) aufgerufen und diesem die anzuzeigende Frame-Datei als Parameter übergeben. Dies hat aber den Nachteil, dass im Inhalts-Rahmen zunächst die Startseite geladen wird und dann erst durch den angeforderten Inhalt ausgetauscht wird.
Diesen besonders bei langsamen Datentransfer unschönen Effekt vermeidet mein Script, das in den <head>-Bereich jeder Inhaltsseite eingebunden wird:

<script type="text/javascript">
var Pfad = self.location.href;
if (Pfad.indexOf("file://") && !parent.frames.length) {
  var Datei = Pfad.slice(Pfad.lastIndexOf("/") + 1);
  document.close();
  with (document) {
    open();
    writeln('<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN">');
    writeln('<html><head><title>Frameset-Beispiel<-- Individuelle Anpassung:
Tragen Sie hier den Titel Ihrer Startseite
ein, der vom Browser angezeigt werden soll. -->
<'+'/title><'+'/head>');
    writeln('<frameset cols<-- Individuelle Anpassung:
Die Aufteilung der Seite erfolgt hier zunächst vertikal.
Zur horizontalen Aufteilung ersetzen Sie COLS duch ROWS. -->
="120,*<-- Individuelle Anpassung:
Dieses Frameset hat einen linken Frame mit 120px Breite
und einen rechten Frame, welcher weiter unterteilt ist.
Passen Sie diese Angaben dem Aufbau Ihres Framesets an. -->
">');
    writeln('<frame name="LinkFrame<-- Individuelle Anpassung:
Tragen Sie hier den Fensternamen dieses Frames ein
(den Namen, der vom TARGET-Attribut verwendet wird). -->
" src="link.html<-- Individuelle Anpassung:
Tragen Sie hier die URL dieser Frame-Datei ein.
Berücksichtigen Sie wie beim Frameset den Pfad. -->
">');
    writeln('<frameset rows="80,*">');<-- Individuelle Anpassung:
Dieses Beispiel hat hier eine weitere Unterteilung.
Wenn Ihr Frameset nur aus zwei Frames besteht, dann
löschen Sie diese und die nachfolgende Zeile. -->

    writeln('<frame name="TitelFrame<-- Individuelle Anpassung:
Sofern das zweite Frame weiter unterteilt werden soll,
tragen Sie hier den Fensternamen des oberen Frames ein. -->
" src="titel.html<-- Individuelle Anpassung:
Sofern das zweite Frame weiter unterteilt wird,
tragen Sie hier die URL dieser Frame-Datei ein
und berücksichtigen Sie wie zuvor den Pfad. -->
">');
    writeln('<frame name="InhaltsFrame<-- Individuelle Anpassung:
Tragen Sie hier den Fensternamen (für das TARGET-Attribut)
des im Frameset anzuzeigenden aktuellen Inhaltsframes ein. -->
" src="' + Datei + '?frameset">');
    writeln('<'+'/frameset><'+'/frameset><'+'/html>');
    close();
  }
}
</script>

Ergänzen Sie die über writeln(' ') ausgegebenen <frameset>- und <frame>-Tags mit den evtl. in Ihrer Frameset vorhandenen Attributen border, frameborder, framespacing sowie scrolling, marginwidth, marginheight und noresize.

Es ist sinnvoll, den JavaScript-Code (ohne die <script>-Tags) in eine externe JavaScript-Datei (z.B. frameset.js) auslagern und diese dann im <head>-Bereich - ggfls. mit (relativer oder absoluter) Pfadangabe - zu referenzieren:

<script type="text/javascript" src="/frameset.js"></script>

Achtung: eine absolute Pfadangabe wie hier auf das Hauptverzeichnis verursacht im lokalen Betrieb ohne Webserver einen Fehler, der allerdings nicht kritisch ist, da das Script ohnehin nur für Online-Betrieb konzipiert ist.
Sie können die URL auch relativ - ausgehend immer von der referenzierenden Datei - angeben; ohne Pfad (frameset.js), wenn beide Dateien im selben Verzeichnis sind, oder z.B. '../frameset.js', wenn sich die JavaScript-Datei im übergeordneten Verzeichnis befindet.

Bereits bevor die Datei vollständig geladen ist und angezeigt wird, überprüft das Script, ob sie online (genauer: ob sie lokal gespeichert und über das Dateisystem angezeigt ist) und außerhalb eines Framesets aufgerufen wurde. In diesem Fall wird das Dokument mit einem angepaßten Frameset überschieben, in welchem die angeforderte Frame-Seite angezeigt wird.
Der (beliebige) Parameter ?frameset ist für den Internet Explorer und einige neuere Versionen anderer Browser erforderlich, damit die Frame-Seite als "neu" betrachtet und in das Frameset geladen wird. Sollten Ihre Seitenaufrufe bereits Parameter enthalten, dann ändern Sie im Script ?frameset in &amp;frameset.