Max Grüning: HTML-Experten aller Länder vereinigt euch! (Zweiframes)

Hallo!
Dem eifrigen Leser dieses Forums dürfte die folgende Frage bekannt vorkommen, aber da ich beim durchstöbern der Archivdateien bislang insgesamt vier mal über eine Frage zu diesem Thema gestolpert bin (und ich habe das Archiv noch nicht durch), will ich noch einen letzten verzweifelten Versuch starten eine Lösung zu finden.

Nun also das Problem: Nach dem Ändern von zwei Frameinhalten durch das JS "Zweiframes" aus SELFHTML lässt sich der Originalzustand nur durch zweimaliges drücken des Back-Buttons wiederherstellen. Nun wollen offensichtlich eine menge Leute (incl. mir) wissen, wie man es erreicht durch einmaliges drücken auf den Back-Button zurückzukommen.

Falls es keine Lösung geben sollte, würde ich Stefan vorschlagen einen Hinweis auf die Seite selfhtml\teda.htm zu setzen: "Achtung kann Schlaflose Nächte hervorrufen!"

Ich hoffe auf einen Erfolg, MAX

  1. Hi,

    wenn man es ohne JavaScript regeln möchte, gebe ich (mal wieder *grins*) meine Homepage als Beispiel: Gehe zu http://cheatah.net, klicke dort auf "Spaß & Fun". Sei dies nun die Ausgangsposition. Die beiden oberen Frames ändern wir hiernach durch einen Klick auf "Linklisten". Drücke anschließend genau ein mal auf den Backbutton und beobachte, was geschieht... :-)

    Mit Framesets ist es also ganz einfach. Zwei Nachteile fallen mir dazu ein:
    1.) Für jede Kombination zweier zu ändernder Frames muß eine Framesetdatei erstellt werden.
    2.) Die beiden zu ändernden Frames müssen genau neben- oder übereinander stehen. Bei aneckenden Frames geht es nicht.

    Den Punkt 1. kann man noch mit halbwegs komplexer JavaScript- oder Perl-Programmierung regeln (z.B. Aufruf durch "frame.html?ersterFrame.html&zweiterFrame.html", danach werden die <frame>s dynamisch geschrieben), für Punkt 2 fällt mir keine "einfache" Lösung ein. Wenn Du aber nebeneinanderliegende Frames ändern willst... warum nicht einfach ohne JavaScript?

    Cheatah

    1. Moin erstmal,

      ich moechte es ganz ohne JavaScript regeln, klappt auch wunderbar. Dazu nehme ich mein Ausgangsframeset, aendere den Dateinamen und die URL der zu veraendernden Frames entsprechend und verweise mit <a href> auf dieses neue Frameset. Der Backbutton spielt mit und die Lage der Frames ist auch egal.

      Jetzt suche ich den Haken.
      Sind es die Ladezeiten? Muss der Browser die schon geladenen, unveraenderten Frames neu laden, wenn man auf ein neues Frameset verweist, oder holt er sie sich aus dem Cache??
      Oder gibt es gar keinen Haken?
      Leider habe ich noch nicht die moeglichkeit das Online zu testen, zumal mir ja ohne ein entsprechendes JavaScript die Vergleichsmoeglichkeit fehlt.

      Gruesse an alle
      ralf

      1. Hallo,

        ich moechte es ganz ohne JavaScript regeln, klappt auch wunderbar. Dazu nehme ich mein Ausgangsframeset, aendere den Dateinamen und die URL der zu veraendernden Frames entsprechend und verweise mit <a href> auf dieses neue Frameset. Der Backbutton spielt mit und die Lage der Frames ist auch egal.
        Jetzt suche ich den Haken.

        Eigentlich gibt es keinen, denke ich.
        Ich glaube die Ladezeiten, die ein neues Frameset braucht, sind nicht so gravierend.
        Beide Methoden haben Vor- und Nachteile, kommt auf den konkreten Fall an.
        Ich denke, die legendaere Funktion wird zu oft benutzt, auch an Stellen, an denen ich was anderes machen wuerde.

        Wann geht nur die reine JS-Loesung?
        Wenn zwei (oder mehr) Frames geaendert werden sollen, die zusammen kein Rechteck (durch Frameset darstellbar) bilden, so links oben und rechts unten etwa.

        Wann mach die reine HTML-Loesung Sinn?
        Eben immer dann, wenn neben-/untereinaderliegende Frames geaendert werden sollen.
        Sind deren Inhalte starr, sprich, es sind immer dieselben Dateien, die da reingeschrieben werden sollen, dann kann man auf JavaScript gaenzlich verzichten.
        Nachteil: man braucht eine Reihe zusaetzlicher Framesets.
        Vorteil: es geht auch ohne JS, man muss ueber "Back" nicht nachdenken.

        Bisschen anders, wenn zwar als Frameset darstellbar, aber die Inhalte immer wieder anders, verschiedene Kombinationen von Seiten z.B.
        Dann  kann man ZwieFrames() nehmen, aber auch ueber eine kombinierte Loesung nachdenken.
        Vielleicht nimmt man ein Frameset, sagt dem aber per JS, welche Dateien es laden soll.
        Hier muss man aber je nach gewaehltem Verfahren wieder ueber "Back" nachdenken.
        Arbeitet man naemlich beim Einsetzen des konkreten Inhalts mit Ersetzen, dann wirkt sich das aus. Hier mueste aber komplettes replace() reichen.

        Bitte diesen Beitrag auch im Zusammenhang mit dem sehen, was ich gestern hier im Thread geschrieben habe http://www.teamone.de/selfaktuell/self_forum/9162.html

        Noch ein paar Gedanken zum Schluss:
        Ich persoenlich halte nicht viel von vorgefertigten Loesungen, na ja , zumindest nicht davon, diese starr einzusetzen. Ich denke bei jedem Problem eigentlich neu darueber nach, was der beste Weg ist. Klar benutze ich dann auch Dinge, die ich mal fuer anderes geschrieben habe - Fahhrraeder fuer ganz China erfinde ich auch nicht neu - aber eben erst nach Analyse der konkreten Aufgabenstellung.
        Das gilt nicht nur fuer ZweiFrames(), sondern generell, macht doch eigentlich auch ein Stueck weit den Reiz der gazen Sache aus. Findet Ihr nicht?

        Christine

        1. Hi,

          dem kann ich eigentlich nichts mehr hinzufügen :-)))

          Nur eins sei noch erwähnt:

          Bisschen anders, wenn zwar als Frameset darstellbar, aber die Inhalte immer wieder anders, verschiedene Kombinationen von Seiten z.B.
          Dann  kann man ZwieFrames() nehmen, aber auch ueber eine kombinierte Loesung nachdenken.
          Vielleicht nimmt man ein Frameset, sagt dem aber per JS, welche Dateien es laden soll.

          So habe ich das bei mir gelöst, und zwar auf der Startseite. Dort wird je nach gesetztem Cookie eine Grafik- oder Textversion meines Menus geladen. Aufbau ist in etwa folgender:

          <script language=JavaScript>
            <!--
            document.write('<frameset><frame ...><frame ...></frameset>'); // dies natürlich dynamisch ;-)
            // -->
          </script>
          <noscript>
            <frameset><frame ...><frame ...></frameset> <!-- dies hier ist statisch -->
          </noscript>

          Funktioniert überaschenderweise einwandfrei! Bisher habe ich keine Gerüchte über Probleme gehört, und bei mir greifen relativ viele verschiedene Browser zu.

          Obige Lösung kann man dann mit dem Aufruf frameset.html?frame1.html&frame2.html kombinieren, indem man die Parameter frame1.html und frame2.html herausfiltert und entsprechend in das Frameset schreibt. Statt der <noscript>-Framedefinition kann man natürlich auch sagen, man solle doch bitte JavaScript anschalten oder sich erst mal einen vernünftigen Browser bei http://home.netscape.com holen... ;-)

          Der Phantasie sind keine Grenzen gesetzt!

          Cheatah

  2. Hallo Max

    Nun also das Problem: Nach dem Ändern von zwei Frameinhalten durch das JS "Zweiframes" aus SELFHTML lässt sich der Originalzustand nur durch zweimaliges drücken des Back-Buttons wiederherstellen.

    Ich frage mich zwar warum (denn das Script ist absolut trivial), aber irgendwie habe ich scheinbar die Ehre, als der erste Mensch in die Geschichte einzugehen, der den Leuten die tausendfach brennende Frage beantwortet hat, wie man zwei Frames gleichzeitig aendert. Kein anderes Beispielscript aus SELFHTML hat so ein Aufsehen erregt wie dieses. Freut mich zwar, aber ich verstehe eigentlich wirklich nicht warum, denn nach zwei Stunden Beschaeftigung mit der JavaScript-Objektwelt kommt man darauf eigentlich von selber.

    Aber nun gut. Das Problem mit den Back-Buttons ist bekannt, ja. Bei allen Gelegenheiten wurde hier im Forum meines Wissens die Arbeit mit location.replace() empfohlen. Ich habe das noch nicht ausprobiert, aber es klingt logisch. Also:
    function ZweiFrames(URL1,F1,URL2,F2)
    {  
    parent.frames[F1].location.replace(URL1);
    parent.frames[F2].location.replace(URL2);
    }
    Ohne Gewaehr das Ganze, habs wie gesagt nie probiert <g>

    viele Gruesse
      Stefan Muenz

    1. Bei allen Gelegenheiten wurde hier im Forum meines Wissens die Arbeit mit location.replace() empfohlen. Ich habe das noch nicht ausprobiert, aber es klingt logisch. Also:
      function ZweiFrames(URL1,F1,URL2,F2)
      {

      »»  parent.frames[F1].location.replace(URL1);
      »»  parent.frames[F2].location.replace(URL2);

      }
      Ohne Gewaehr das Ganze, habs wie gesagt nie probiert <g>

      viele Gruesse
        Stefan Muenz

      Stimmt diese Lösung wird immer wieder angeboten aber ich habe sie nun schon in allen möglichen und unmöglichen Kombinationen ausprobiert und es funktioniert einfach nicht. Ich werde jetzt mal Cheatahs Vorschlag nachgehen, obwohl mir der Nachteil, den er unter erstens aufführt (> Für jede Kombination zweier zu ändernder Frames muß eine Framesetdatei erstellt werden)noch ein Dorn im Auge ist.

      MAX
      Die Benutzung von <g> scheint in diesem Forum übrigens überproportional hoch zu sein. (das gefällt mir)

    2. Hi Stefan,

      Aber nun gut. Das Problem mit den Back-Buttons ist bekannt, ja. Bei allen Gelegenheiten wurde hier im Forum meines Wissens die Arbeit mit location.replace() empfohlen. Ich habe das noch nicht ausprobiert, aber es klingt logisch. Also:
      function ZweiFrames(URL1,F1,URL2,F2)
      {

      »»  parent.frames[F1].location.replace(URL1);
      »»  parent.frames[F2].location.replace(URL2);

      }

      das hat den Nachteil, daß man mit dem Back-Button überhaupt nicht mehr zurückkommt... je nachdem, ob man nur einen oder beide Frames mit replace bearbeitet kann man auch nur maximal einen Frame zurückbekommen!

      Gibt es eine Möglichkeit, onLoad zu prüfen, ob in der History nach vorne noch Daten stehen? Dann könnte man nämlich parent.andererFrame.history.back() ausführen... nur so als Idee :-)
      Das darf man allerdings nur in einem Frame machen, weil sich das System sonst ganz schnell zum Anfang zurückschaukelt. Problem: Die Ladereihenfolge der beiden Frames steht nicht fest, man kann damit also schnell auflaufen.

      Vielleicht geht es aber so:
      Man ändere nur einen Frame (ganz normal mit <A href>) und führe dort entweder onLoad oder besser umgehend ausgeführt im <head>-Bereich parent.andererFrame.location.replace() aus. Auf diese Weise werden beide Frames korrekt geändert, und mit Back kommt man auch zwei Frameseiten zurück. Ist das die Lösung?

      Cheatah

    3. Hallo,

      »»  Kein anderes Beispielscript aus SELFHTML hat so ein Aufsehen erregt wie dieses. Freut mich zwar, aber ich verstehe eigentlich wirklich nicht warum, denn nach zwei Stunden Beschaeftigung mit der JavaScript-Objektwelt kommt man darauf eigentlich von selber.

      Ja, so ist das nun mal, Stefan, man kann sich nicht aussuchen, womit man beruehmt wird. <g>
      Bist mit Sicherheit nicht der erste, der mit vergleichsweise Trivialem in die Geschichte eingeht, waehrend das, was er selbst fuer gross haelt, in Vergessenheit geraet.

      Aber nun gut. Das Problem mit den Back-Buttons ist bekannt, ja. Bei allen Gelegenheiten wurde hier im Forum meines Wissens die Arbeit mit location.replace() empfohlen. Ich habe das noch nicht ausprobiert, aber es klingt logisch.

      Dazu haben wir doch irgendwann mal eine ganz ausfuehrliche Diskussion gehabt.
      Wenn ich nur noch wuesste, wann das war.
      Dieses replace() hat naemlich auch ein paar Haken.

      function ZweiFrames(URL1,F1,URL2,F2)
      {

      »»  parent.frames[F1].location.replace(URL1);
      »»  parent.frames[F2].location.replace(URL2);

      }
      Ohne Gewaehr das Ganze, habs wie gesagt nie probiert <g>

      Ich habe leider auch nie ein Beispiel dazu gemacht.
      Nur, so wie es da steht, duerfte eigentlich "Back" die beiden Frames vollstaendig ignorieren, noch einen Schritt davor landen.
      Nur _ein_ replace() muesste dazu fuehren, dass "Back" sich lediglich auf den anderen Frame auswirkt, also doch auch nicht das Gewuenschte? Oder wie ist das?

      Wie war das damals in der Debatte?
      Ich bilde mir ein, selber war geschrieben zu haben, so etwa in die Richtung:

      • mal nicht die "weltberuehmte Funktion" nehmen
      • dafuer eine Abhaengigkeit zwischen den Frames schaffen, also dafuer sorgen,
          dass immer der eine den anderen mitzieht
      • wenn sich keine 1:1-Beziehung zwischen den beiden herstellen laesst, sondern
          durchaus verschiedene Verknuepfungen moeglich sind, dann muesste man halt
          irgendwie noch Variablen benutzen, im Frameset selber etwa

      So etwa muesste die Richtung sein, mal ganz ins Unreine getippt.
      Verflixt, hat denn niemand mal Lust, ein richtig schoenes Beispiel zu basteln? :-)))
      Dann haetten wir eine ordentliche Aussage, koennten so herrlich bequem darauf verweisen,
      wenn die Frage wiederkommt. Waer doch schoen ...

      Christine