Christoph Schnauß: iFrames und EventHandler in Netscape, Opera, mozilla

hallo Forum ;-)

beinahe hätte das eine "Zwei-Frames-Frage" werden können ...

Folgende Problemstellung: ich habe zwei iFrames nebeneinander positioniert, die sich teilweise überlappen (unterschiedliche z-index-Werte). Links einer, der eine Reihe Verweise enthält und so etwas wie eine Menüführung ist, rechts ein "main"-Frame.
Keine Sorge, die Verweise öffnen sich, die Frame-Inhalte ändern sich in beiden bei allen getesteten Browsern  -  allerdings leider nur so lange, wie ich beide iFrames auf "visible" stehen lasse. Jetzt wollte ich aber gerne, daß der linke iFrame auf "hidden" gesetzt werden kann, sobald in ihm ein link geklickt wird, also im Prinzip dasselbe, was man mit Layer-Konstruktionen erreichen kann. Und da hängt es.

Ich habe also eine Javascript-Funktion, die das Verbergen/Sichtbarmachen eigentlich ermöglichen sollte (und das bei Layer-Konstruktionen auch tut). Jetzt rufe ich im linken iFrame einen Verweis auf nach dem Schema:

<a href="neueSeite.htm" target="iframe_rechts" onclick="iframe_links_schliessen()">neueSeite.htm</a>

und das klappt auch völlig problemlos mit dem IE 5.0, 5.5 und 6. Prima. Bloß sämtliche anderen spielen nicht mit. Netscape, Opera, Konqueror ... öffnen zwar die "neueSeite.htm" im vorgegebenen rechten iFrame, denken aber nicht daran, den linken iFrame auf "hidden" zu setzen. Ich habs mit so ziemlich allen EventHandlern durchgespielt, immer mit demselben Ergebnis. Sobald ich die beiden iFrames in eigene Layer (div's) einbinde und den EventHandler nicht auf den iFrame, sondern auf den Layer anwende, machen sie es allerdings auch. Der einzige, der trotzdem nicht mitspielt, ist mozilla, dem ich für ein iFrame noch kein "hidden" bzw. "display:none" beibringen konnte, er zeigt iFrames grundsätzlich an.

Kennt jemand eine Konstruktion, mit der ich ohne den Umweg über zusätzliche Layer Netscape, Opera und Konqueror beibringen kann, EventHandler zu beachten, die das "Verstecken" eines iFrames bewirken sollen ?

Der Grund für den Einsatz von iFrames: in Layer (div's) kann ich keine wechselnden externen HTML-Dokumente einbinden. Ausweichen auf eine "normale" Framekonstruktion geht auch nicht, weil ich dann die Menüfunktionen innerhalb des Frames in Layer packen müßte, die bekanntlich die Frame-Begrenzung nicht überschreiten können.

Auf Netscape 4.7x nehme ich übrigens keine Rücksicht.

Grüße aus Berlin

Christoph S.

  1. hi

    Der einzige, der trotzdem nicht mitspielt, ist mozilla, dem ich für ein iFrame noch kein "hidden" bzw. "display:none" beibringen konnte, er zeigt iFrames grundsätzlich an.

    vorab, so würde ich es machen:
    onclick="parent.<anderer>.location.href='URL';parent.document.getElementById('der iframe').style.display='none';" (oder so ähnlich :)

    Wegen Mozilla:
    welche Version hast du getestet? Imho sind einige Probleme mit <iframes> und deren Ausblendung erst seit kurzem gelöst.

    gruss Kai

    1. grüßchen,

      vorab, so würde ich es machen:
      onclick="parent.<anderer>.location.href='URL';parent.document.getElementById('der iframe').style.display='none';" (oder so ähnlich :)

      ja, und genau das tun die Kumpels eben nicht. Es sieht so aus, als ob EventHandler innerhalb von <a ...> nicht befolgt werden, sobald sie sich auf iFrames beziehen. Könnte was mit der Element-Hierarchie zu tun haben, aber ich habe keinen Hinweis dafür gefunden

      Wegen Mozilla:
      welche Version hast du getestet? Imho sind einige Probleme mit <iframes> und deren Ausblendung erst seit kurzem gelöst.

      0.9.9  -  ich sehe eigentlich zu, daß ich mindestens einmal pro Woche nachschaue, ob ich bei mozilla "aktuell" bin.

      Christoph S.

      1. hi,

        Könnte was mit der Element-Hierarchie zu tun haben, aber ich habe keinen Hinweis dafür gefunden

        sieht mir eher nach einem handfesten bug aus: bei mir war der auf "hidden" gesetzte, aber noch sichtbare iframe _nach_ dem Aufruf der JS-Konsole, die sich sich natuerlich in den Vordergrund legt und das Fenster verdeckt, plötzlich verschwunden! *kratz*
        Muss ich mal weiter untersuchen...

        Gruesse  Joachim

        1. hallo Joachim,

          sieht mir eher nach einem handfesten bug aus

          Dem würde ich mich gerne anschließen, aber wann tritt ein "bug" bei drei teils sehr verschiedenen Browsern in gleicher Weise auf ? Ausgerechnet der IE kanns, und keiner von den anderen  -  das ist doch ziemlich ungewöhnlich

          bei mir war der auf "hidden" gesetzte, aber noch sichtbare iframe _nach_ dem Aufruf der JS-Konsole, die sich sich natuerlich in den Vordergrund legt und das Fenster verdeckt, plötzlich verschwunden!

          Bei mir verschwindet er auch, wenn ich zwei oder drei Mausklicks _später_ eine history.back()-Funktion aufrufe, und das ist nun schon einigermaßen kurios.

          Dein Tip weiter oben mit "createChild" und "removeChild" scheint erstmal eine Lösung zu sein. Ich habe sowieso beide iFrames mit Javascript und "document.write" erzeugt

          Grüße aus Berlin

          Christoph S.

  2. hi,

    Kennt jemand eine Konstruktion, mit der ich ohne den Umweg über zusätzliche Layer Netscape, Opera und Konqueror beibringen kann, EventHandler zu beachten, die das "Verstecken" eines iFrames bewirken sollen ?

    eventuell hilft es, den iframe mit createElement/appendChild dynamisch zu erzeugen und nicht zu verstecken, sondern mit removeChild vollstaendig zu entfernen:

    <html>
    <head>

    <style type="text/css">
    #ebene0 {
     position:absolute;
     top:100px;
     left:100px;
     width:200px;
     height:200px;
     border: solid;
    }
    </style>

    <script language="javascript1.2">

    function go()
    {
     xy    = document.createElement("iframe");
     xy.id = "ebene0";
     document.body.appendChild(xy);
    }

    </script>

    </head>

    <body onload="go()">
    <a href="#" onclick="document.body.removeChild(xy); return false;">link</a>
    </body>
    </html>

    Der Grund für den Einsatz von iFrames: in Layer (div's) kann ich keine wechselnden externen HTML-Dokumente einbinden.

    im NC4x schon ;-)

    Gruesse  Joachim