Michael Schröpl: verschachteltes Frameset vollständig rekursiv nachladen

Beitrag lesen

Hi Sebastian,

Ich meine als onLoad Event mit JavaScript.
Sprich wenn sagen wir mal die Seite test.html geladen wird,
diese aber Teil eines Framsets ist, soll selbiger nacgeladen
werden, damit die Leute auch was zum navigieren haben.
Das klappt ja bisher auch mit einem normalen Frameset nur halt
nicht mit einem verschachtelten ...

Sieh das Problem doch einfach mal rekursiv.

Du hast bereits einen Dokumentnamen verwendet, der nicht "index.html"
heißt.
Daraus schließe ich, daß Dir bewußt ist, das Dein Frameset von außen
mitgeteilt bekommen muß, welche Seite es laden soll.
Der JavaScript-Code von test.html muß also ein übergeordnetes Frameset,
sagen wir mal "index.html", welches aber irgendwie erfahren muß, daß in
seinem Arbeits-Frame "test.html" geladen werden soll. Das mußt Du ihm
also mitteilen.

Bisher ist das eine skalare Information. Du hast mehrere Möglichkeiten,
sie darzustellen. Du könntest beispielsweise irgendwo eine JavaScript-
Variable verwenden - wenn Du sicher wärest, daß diese in einem Frame
liegt, welcher während der gesamten Nachlade-Aktion überlebt!
Kannst Du das nicht, dann könntest Du diese Information über den Query-
String des URL durchreichen.
"test.html" würde also "index.html?framex=text.html" referenzieren, und
in "index.html" würde selbst wiederum per JavaScript-Code der eigentliche
Inhalt des Framesets dynamisch erzeugt werden.
Mit 'framex' versuche ich, anzudeuten, daß das Frameset auch den Namen
des Frames wissen möchte, weil dieser ja ggf. von JavaScript-Code oder
einfachen Hyperlinks angesprochen werden soll. (Ich möchte den JavaScript-
Code so formulieren, daß er in jedem einzelnen Deiner Dokumente einge-
setzt werden kann und keinerlei Wissen über dieses Frameset hat - diese
Eigenschaft werden wir nämlich gleich noch ausnutzen.)

Damit ist das Problem aber im Prinzip bereits gelöst. Denn ein Frame
bekommt innerhalb seines <frame>-Tags ein Dokument über einen URL zuge-
wiesen. Dieser URL darf sehr wohl ebenfalls wieder einen Query-String
enthalten!
Wenn Du das Wissen darüber besitzt, den gesamten geschachtelten Frameset-
Baum in einen einzigen URL zu codieren und diesen innerhalb einer jeden
Frameset-Stufe wieder decodieren und zur Generierung der Framesets ver-
wenden kannst, dann ist Dein Problem bei beliebiger Schachtelung der
Framesets lösbar.

Beweisen wir noch schnell, daß dies möglich ist:
1. Ein Browser-Inhalt besteht aus endlich vielen geschachtelten Framesets.
2. Jeder Frameset entspricht einer sequentiellen Anordnung von Frames.
   (Durch die Verwendung von Namen wird es minimal komplizierter, aber
   das blende ich erst mal aus - die sequentielle Anordnung der Framesets
   möge erst mal genügen.)
Damit läßt sich der vollständige Browser-Zustand durch einen geklammerten
Ausdruck endlicher Größe formulieren.

Der Trick besteht nun darin,
a) innerhalb eines jeden (!) BlLattes des Dokumentbaums diese Baumstruktur
   einmal hinzuschreiben (also zu definieren, was in jedem gleichzeitig
   sichtbaren Frame irgend eines beliebigen Framesets angezeigt werden soll,
   falls dieses Blatt einzeln angesprochen wird - beispielsweise könntest
   Du für eventuelle Navigations-Frames auch wiederum Query-Strings brauchen,
   um dem darin enthaltenen JavaScript-Code mitzuteilen, welche Hover-Buttons
   er automatisch präselektieren soll ...) und
b) JavaScript-Code zu schreiben, welcher den entsprechenden Baumartigen
   "UFL" (uniform frameset locator) auf der obersten Hierarchie-Ebene so
   auseinander nimmt, daß er die Namen der zu generierenden Frames und die
   verbleibenden UFLs der nächst-niedrigeren Ebene extrahieren kann. Mit
   diesen beiden Informationen kannst Du den Frameset generieren - dessen
   Frames werden wieder mit UFLs angesteuert, welche Du mit demselben Java-
   Script-Code wieder zerlegen mußt usw.

Der Aufwand für die Analyse eines geklammerten Ausdrucks ist rein intellek-
tuell nicht völlig vernachlässigbar - insbesondere ist das ja eine CH2-
Sprache, erfordert also das Gedächtnis eines Keller-Automaten.

Hm ... das wäre doch mal ein netter Feature-Artikel ... JavaScript-Hacker,
vortreten!

Viele Grüße
      Michael

P.S.:   Genauso, wie Du die Namen der Framesets durchreichen mußt, mußt Du
        auch die Größenangaben der jeweiligen Frames innerhalb des Framesets
        durchreichen. Ein "UFL-Knoten" besteht also aus
        1. einer listenartigen Information für diese LayoutInformation
           (dort muß alles enthalten sein, was Du zum Generieren des <frameset>
           brauchst - auch die Information, ob es Zeilen oder Spalten sind!)
           und
        2. einer Liste von Paaren aus Frame-Name und Dokument-UFLs.

P.P.S.: Das eigentliche Problem scheint mir, daß ein rekursives Laden eines
        beliebig geschachtelten UFL so viele HTTP-Zugriffe und Browser-Re-
        freshes nach sich ziehen wird, daß dem Benutzer vor lauter Flackern
        schwindelig werden dürfte.