Roland: Zugriff auf Elemente in noch nicht geladenen Frames

Hallo,

nachdem ich vergeblich im Archiv bzw. SELFHTML gestöbert habe, muß ich jetzt doch mal hier um Hilfe bitten.

Wieder mal geht es um Frames (sorry..)

Vereinfacht ausgedrückt habe ich einen linken Frame mit Menü und einen Hauptframe für Inhalte. Ich möchte, daß im Menü immer der gerade aktive Punkt auch als solcher gekennzeichnet wird.

Dazu spricht der onload-Handler der Hauptframe-Seiten die Menüpukte im linken Frame über GetElementById an und modifiziert deren CSS-Style.

Funktionert prima, außer im IE (nur Version 6.0 getestet) wenn der linke Frame noch nicht im Cache ist. Jeder weitere Aufruf klappt dann.

Hier der Handler:

<script TYPE="text/javascript">
<!--
/* die IDs der Menüpunkte */
Punkte=new Array('m7a','m7b','m7c','m7d','m7e','m7f','m7g');

function markit()
{
/*  while (parent.leftframe.document.getElementById("m7")==null) {} */

/* evtl. vorher markierte Menüeinträge auf normal setzen */
  for (var i=0;i<7;i++)
  { obj=parent.leftframe.document.getElementById(Punkte[i]).style;
    obj.borderLeft="0px";
  }

/* den "richtigen" Eintrag markieren: */
  obj=parent.leftframe.document.getElementById("m7").style;
  obj.borderBottom="2px solid #c00000";
  obj.borderLeft="2px solid #c00000";
}
//-->
</script>

Die while-Schleife war ein Reperaturversuch, ich wollte damit sicherstellen, daß die angesprochenen Objekte auch existieren (d.h. warten, bis der linke Frame auch tatsächlich geladen ist). Dummerweise bleibt (nur im IE) dieses Element immer ==null, es sei denn, wie gesagt, der linke Frame liegt noch im Cache herum.

Die Untauglichkeit dieser while-Schleife kann ich mir noch damit erklären, daß der IE während der Ausführung sonst nichts tut, also auch den linken Frame nicht lädt.

Gibt es irgendeine andere Möglichkeit sicherzustellen, daß ein Code-Teil erst dann ausgeführt wird, wenn der Inhalt eines anderen Frames fertig geladen ist? (außer stur 2 Minuten zu warten natürlich)

Oder ist mein ganzer Ansatz verkehrt?

Bin für jeden Hinweis dankbar!

Grüße
Roland

P.S.: Der linke Frame steht im Frameset-Quelltext vor dem Hauptframe, die aktuelle Version ist zugänglich unter http://www.nir-support.de, der Fehler tritt z.B. auf, wenn man das erste Mal auf "Unser Schulungsangebot" klickt. CSS- und HTML-mäßig sind die Dateien validiert und OK (bis auf die leidigen "border"-Attribute im Frameset).

  1. Hallo Roland

    Oder ist mein ganzer Ansatz verkehrt?

    Ja, lass die Frames und damit das Javascript weg.
    Wenn das Menü bei jeder Inhaltsseite anders aussehen soll, wäre das einfacher, zuverlässiger und browserübergreifend ohne Frames zu realisieren.

    Ich habe vor einer gewissen Zeit auch schon einmal soetwas gebastelt.
    Nach vielen erfolglosen Versuchen (auch mit while Schleife) habe ich dann

    • das Script ins Navigationsframe eingebunden
    • die jeweilige Inhaltsseite testet, ob die Funktion im anderen Frame verfügbar ist
        wenn ja wird diese dann ausfeführt
      und
    • das Navigationsframe prüft nach dem Laden, ob und wenn ja welche Seite im Inhaltsframe geladen ist, um dann die Funktion mit dem richtigen Parameter aufzurufen.

    MFG
    Detlef

    --
    - Wissen ist gut
    - Können ist besser
    - aber das Beste und Interessanteste ist der Weg dahin!
    1. Hallo Detlef,

      danke schön, daß Du Dich meines Problemchens angenommen hast!

      Ja, lass die Frames und damit das Javascript weg.

      im Prinzip muß ich Die recht geben, auf Dauer wird der Weg wohl dahin gehen, ist alles "historisch gewachsen", wenn ich wüßte, daß alle meine Besucher CSS-2.0 fähige Browser hätten... ach, alles wäre so einfach:-)

      Zu Deiner Lösungsbeschreibung noch zwei kurze (wahrscheinlich dumme) Fragen:

      • die jeweilige Inhaltsseite testet, ob die Funktion im anderen Frame verfügbar ist

      wie?

      • das Navigationsframe prüft nach dem Laden, ob und wenn ja welche Seite im Inhaltsframe geladen ist,

      welches Objekt fragst Du genau ab? "document" und dann "location.href"?

      Ich hab's jetzt provisorisch doch mit Zwangswartepause von 1 Sekunde gemacht, schließlich ist ja für den User alles da, bis auf die Markierung halt, war auf der Suche dnach einer "schönen" Lösung, aber die läuft wohl auf Deinen erster Vorschlag hinaus..

      Anyway, Danke für Deine Hilfe!
      Roland

      1. Hallo Roland

        Zu Deiner Lösungsbeschreibung noch zwei kurze (wahrscheinlich dumme) Fragen:

        Die Fragen waren gar nicht so dumm. Ich hatte mich ein wenig geirrt. Nicht das Vorhandensein der Funktion sondern einer Variablen hattte ich geprüft, und im Inhaltsframe auch eine dort gesetzte Variable.

        Durch "onload" im leftframe aufgerufen:

        /* die IDs der Menüpunkte
           ein leeres Element, weils mit 0 nicht funktioniert*/
        Punkte=new Array('', 'm7a','m7b','m7c','m7d','m7e','m7f','m7g');

        function markit()
        {

        /* den "richtigen" Eintrag markieren und
           evtl. vorher markierte Menüeinträge auf normal setzen */
          if (parent.rightframe && parent.rightframe.Punkt && document.getElementById) {
           for (var i=1;i<Punkte.length;i++)
           { obj=document.getElementById(Punkte[i]).style;
            if (parent.rightframe.Punkt == i) {
             obj.borderBottom="2px solid #c00000";
             obj.borderLeft="2px solid #c00000"; }
            else
             obj.borderLeft="0px";
           }
          }
         /* bestätigt, dass Navi fertig geladen ist */
         geladen=true;
        }

        Dito im rightframe:

        <!--
         Punkt=1;
         function marke () {
          if (parent.leftframe && parent.leftframe.geladen) {
           parent.leftframe.markit();}
        }
        //-->

        So müsste es funktionieren und auch Fehlermeldungen in Browsern vermeiden, die document.getElementById nicht kennen. Allerdings nicht lange getestet.

        MFG
        Detlef

        --
        - Wissen ist gut
        - Können ist besser
        - aber das Beste und Interessanteste ist der Weg dahin!
        1. Hallo Detlef,

          ist ja geschickt getrickt, so ist es wirklich egal, welcher Frame zuerst geladen wird. Sobald ich mal wieder 'ne halbe Stunde am Stück Zeit habe, werde ich es umsetzen.

          Herzlichen Dank nochmal!
          Roland