Klaus Junge: JavaScript und Frameset?

Hallo allerseits,

eigentlich hab' ich das für eine Trivialität gehalten,
laufen tut's aber nicht. Trotzdem oder gerade deswegen.

Ich wollte, daß meine Frameset-Definition sich ggf. aus
einem fremden Frameset befreit, auch, weil ich von Unter-
frames mit top. auf Funktionen im Kopf meines Framesets
zugreifen wollte.

Um das zu testen habe ich ein Frameset definiert was mir
meinen Frameset in eines seiner Frames lädt und bin davon
ausgegangen, daß meiner sich durch das kleine SELF-cutnpaste
befreit. Geht aber nicht, es bleibt schlicht in dem entsprechen-
den Frame von 'fremdes' stehen. Aber warum?

Ich dachte, wenn dieses Teil ausgeführt wird, gibt es noch keine
eigenen Frames, daher könnte .length > 0 nur von einem übergeord-
neten Frameset stammen und top.location.href müßte sich dann
auch darauf beziehen, auf das Übergeordnete.
Die Gegenprobe mit Umwandeln in Funktion und Aufrufen mit onLoad
hat mich durch dauerndes neuladen in meiner Meinung bestätigt.

<HTML>
<HEAD>
  <TITLE>meines</TITLE>
  <SCRIPT LANGUAGE="JavaScript">
  <!---
  if(top.frames.length > 0)
  top.location.href=self.location;
...diverse Funktionen...
  //-->
  </SCRIPT>
</HEAD>
<FRAMESET...
...
</FRAMESET>
</HTML>

Kann mir jemand auf die Sprünge helfen?
Vielen Dank

Klaus

  1. Hallo Klaus,

    probier mal die Loesung aus, die hier vorgeschlagen wird:

    http://irb-www.informatik.uni-dortmund.de/~sm/aw/js/faq/fenster/seiteinframe.html

    Na, gut erholt vom See? <g>

    viele Gruesse
      Stefan Muenz

    1. Hallo Stefan,

      ja, es klappt. Vielen Dank.
      Der Vergleich (self == top) ist ja pfiffig.

      Naja, zumeist schon sehr viel besser.

      Der IE5 macht's anscheinend immer richtig, beim NC4.5 darf ich
      'fremdes' manchmal nicht nochmal auf das ausgetauschte 'meines'
      draggen oder drüberladen.
      Dann kommt oft Dr.Watson auf den Plan oder das Schweigen im Walde.
      Zum Glück gibt es ja den Taskmanager.
      Da hab' ich wohl noch etwas rumzuknobeln.

      Kapiert hab' ich aber auch noch nicht warum das erste nicht ging.

      Na, gut erholt vom See? <g>

      Ja, doch, für uns war es ja eher zu kurz.
      Und sooo naß sind wir doch auch nicht geworden,
      wir hatten ja auch keinen Hund auszuführen.

      Klaus

      1. Hallo Stefan,

        ja, es klappt. Vielen Dank.
        Der Vergleich (self == top) ist ja pfiffig.

        Naja, zumeist schon sehr viel besser.

        Der IE5 macht's anscheinend immer richtig, beim NC4.5 darf ich
        'fremdes' manchmal nicht nochmal auf das ausgetauschte 'meines'
        draggen oder drüberladen.
        Dann kommt oft Dr.Watson auf den Plan oder das Schweigen im Walde.
        Zum Glück gibt es ja den Taskmanager.
        Da hab' ich wohl noch etwas rumzuknobeln.

        hmmm, das Problem hab ich auch, wenn ich das script in mein Frameset schreibe... nur, dass es bei mir keinen Dr Watson gibt (win95)... ich war aber auch schon ganz schlau, und hab mir eine eigene Loesung ausgedacht *freudenstrahl*
        <ganzstolzpraesentier>

        ich schreib das ganze einfach in eine ANDERE Datei, die als Standard benutzt wird (index.htm)... diese Datei laedt dann _auf_jeden_Fall_ das ganze Frameset als top.location...
        sieht dann so aus:

        <html>
        <head>
        <title> irgendein titel der ja sowieso nur fuer sekundenbruchteile angezeigt wird </title>
        <script language="JavaScript">
        window.defaultStatus = "";

        if(navigator.appVersion.substring(0,1) < "4")
                {top.location.href="files/oldver.htm"}
                else
                top.location.href="frameset.htm";
        </script>
        </head>
        <body>
        </body>
        </html>

        </ganzstolzpraesentier>

        hat den Vorteil, dass ich in dieser Datei auch noch andere Sachen machen kann (wie du ja siehst ueberpruef ich auch gleich noch die Brauser-Version), allerdings den
        _NACHTEIL_, dass natuerlich ein schlauer Dieb warscheinlich hergehen wuerde und den Link auf frameset.htm setzen taet...

        daher frag ich jetzt ganz einfch mal:
        weiss jemand eine bessere Loesung? (_OHNE_ dass NS abstuerzt!!!)

        1. Hi Boris!

          hmmm, das Problem hab ich auch, wenn ich das script in mein Frameset schreibe... nur, dass es bei mir keinen Dr Watson gibt (win95)... ich war aber auch schon ganz schlau, und hab mir eine eigene Loesung ausgedacht *freudenstrahl*
          <ganzstolzpraesentier>

          *g* Ein wenig muss Deine Freude leider daempfen. Deine Methode hat leider den Nachteil, dass nicht javascriptfaehige Browser keine Weiterleitung vornehmen und der Benutzer somit gar nichts zu sehen bekommt. Laesst sich aber auch ganz leicht umgehen, indem Du noch eine <META HTTP-EQUIV="REFRESH"> mit einigen Sekunden Verzoegerung einbaust. So wird erst das JS ausgefuehrt, und wenn das nicht angesprungen ist, kommt eben der Meta-Refresh. Und fuer die ganz alten Browser, die noch nichtmal dieses Meta-Tag kennen, kannst Du ja noch einen Link anbieten.

          Bye, Calocybe

          1. Howdy Calocybe!

            <ganzstolzpraesentier>

            *g* Ein wenig muss Deine Freude leider daempfen. Deine Methode hat leider den Nachteil, dass nicht javascriptfaehige Browser keine Weiterleitung vornehmen und der Benutzer somit gar nichts zu sehen bekommt. Laesst sich aber auch ganz leicht umgehen, indem Du noch eine <META HTTP-EQUIV="REFRESH"> mit einigen Sekunden Verzoegerung einbaust. So wird erst das JS ausgefuehrt, und wenn das nicht angesprungen ist, kommt eben der Meta-Refresh. Und fuer die ganz alten Browser, die noch nichtmal dieses Meta-Tag kennen, kannst Du ja noch einen Link anbieten.

            hmmmm... stimmt, guter Einwand! muss ich jetzt noch irgendwie einflechten... wobei natuerlich Leute mit SOOOO alten Brausern auf meiner tollen, fortschrittlichen Seite nix zu suchen haben *g* naja... zumindest kann man mit dem ganzen kruscht den ich fabriziert hab nicht allzuviel anfangen, wenn der Brauser kein Javascript kennt... aber egal, weil: die (wenigen), die noch nichtmal Javascript koennen muss ich ja auch irgendwie abfangen und von ihrem hoffnungslos veralteten Zustand unterrichten...  =v)

            btw: ab welchen Versionen koennen die Brauser eigentlich was mit Metas anfangen ?!

            Boris

        2. Hallo Boris,

          hmmm, das Problem hab ich auch,...

          das beruhigt mich, dann ist es nicht meine Blödheit.

          ...den Link auf frameset.htm setzen taet...

          das wollt ich ja verhindern!
          Auch dann sollen meine Funktionen da sein.

          ...ein schlauer Dieb...

          braucht weder schlau noch ein Dieb zu sein,
          ein pottgewöhnlicher Bookmark tut's auch.

          Klaus

      2. Hallo Klaus!

        ja, es klappt. Vielen Dank.
        Der Vergleich (self == top) ist ja pfiffig.

        Dank meiner "Anpassungsarbeiten" am joust Outliner (die Menü"Maschine" auf Atomic-Eggs) habe ich das mit "self == ..." oder "self != ..." gelernt und gelernt zu schätzen.

        Folgende Zeilen Code zum Beispiel helfen, eigene Seiten entweder Standalone anzeigen (Sprich: aus einem fremden Frameset zu befreien, wenn der Besucher einem Link folgt) aber natürlich soll das _eigene_ Frameset nicht gekillt werden:

        if (self.name == 'NAME DES ANZEIGEFRAMES')
           { ;}
        else { if (self != top)
          top.location.href = self.location;}

        Als Name für den Anzeigeframe darf man natürlich keinen meist eingesetzten Namen wie "haupt", "text" o.Ä., sonst läuft man Gefahr, dass das Anzeigeframe des fremden Framsets auch so heisst, und dann passiert natürlich nichts!

        Na, gut erholt vom See? <g>
        Ja, doch, für uns war es ja eher zu kurz.
        Und sooo naß sind wir doch auch nicht geworden,
        wir hatten ja auch keinen Hund auszuführen.

        Tja... wir waren ja auch nur _kurz_ mit dem Hund, leider zum falschen Zeitpunkt ;-)

        Bis danndann

        PAF (patrickausfrankfurt)

        Klaus

        1. Hallo PAF,

          vielen Dank für Deine Versuche.

          Irgendwie komisch... offline stürzt er IMMER ab,
          online bei diesem Beispiel nur manchmal...

          Bei mir schmiert der Netsi auch nicht immer ab, aber offenbar
          ziemlich sicher wenn ich die 'Ersetzungsoperation' wiederhole.
          Wenn ich mir den Link zB in die Zwischenablage hole und dann
          nach erfolgtem Aufruf nochmal in die Location paste und aus-
          führe, dann war's das. Egal ob bei mir offline oder bei Dir
          online.
          Die erste Operation geht eigentlich immer klar.

          Das ganze erinnert mich ein _wenig_ an Christines CKMENU.
          Sie hat dort irgendwo kleine timeouts eingebaut ohne die es
          auch ziemlich sicher zu Abstürzen kam.
          Hier ist es zwar kein Zeitproblem, aber irgendwer zieht wohl
          auch hier jemandem.sich.selbt den Stuhl unterm Hintern weg.

          Irgendwie muß ich über diese ganze Strategie nochmal nachdenken.
          Ich finde das Eine wie das Andere für den Besucher unzumutbar.
          Es sollte doch hinlänglich stabil und gradlinig funktionieren
          ohne daß man sich als Besucher Gedanken um die Hintergründe
          machen muß.

          Tja... wir waren ja auch nur _kurz_ mit dem Hund,
          leider zum falschen Zeitpunkt ;-)

          So ist das verschieden, wir waren zu genau dem gleichen
          Zeitpunkt mit der Sonne unterwegs, oben strahlend hellgelb-blond.

          Klaus

          1. Hallo PAF,

            irgendwie ist das schon sonderbar, bei mir macht das einen Unterschied
            im Abschmierverhalten ob ich

            function standalone() {return (self == top);}
              if (!standalone()) {top.location.href=self.location.href;};

            oder

            if (self != top) {top.location.href=self.location.href;};

            schreibe.
            Es ist zwar nicht so relevant, 'abjeschmiert is abjeschmiert'.

            Die erste Variante schlägt bei mir bevorzugt bei der Wiederholung zu,
            die zweite eher gleich beim ersten Mal.
            Es spielt auch irgendwie eine Rolle ob ich vorher was fehlerfrei
            laden konnte.

            Klaus

            1. Hallo PAF,

              das mit dem Stuhl unterm Hintern wegziehen hat mich dann doch noch
              beschäftigt. Hab's im Frameset mal ganz brutal ausprobiert:

              window.setTimeout("check()",5000);
                function check()
                {if (self != top) top.location.href=self.location.href;};

              die 5 sec reichen lokal/offline aus um alles sicher zu laden.

              So hab' ich keinen einzigen Absturz mehr hingekriegt!
              Die 5 sec muß ich aber stillhalten.
              Nehm ich's raus, ist es wie vorher.

              Erklärungsversuch: der Netsi gibt schon mal das Laden aller Frameinhalte
              parallel in Auftrag, kriegt aber nicht mit, daß die (href)-Basis zwischenzeitlich
              ausgetauscht wurde (sie sogar selbst ausgetauscht hat) und teert das
              ankommende Zeugs hin wo nix mehr zum Hinteeren ist.

              Das ist nur ein Test, eine praktische Strategie müßte anders aussehen.

              Klaus

              1. Hallo Klaus!

                window.setTimeout("check()",5000);
                  function check()
                  {if (self != top) top.location.href=self.location.href;};

                die 5 sec reichen lokal/offline aus um alles sicher zu laden.

                Danke, es klappt auch mit einem Timeout von nur einer Sekunde:

                http://www.atomic-eggs.com/temp/frameset.html

                Bis auf Weiteres lasse ich es erstmal so.

                Bis danndann

                PAF (patrickausfrankfurt)

      3. Re hallo!

        Ich muss was hinzufügen...

        Sowohl mit diesem COde:

        if(top.frames.length > 0)
          top.location.href=self.location;

        als mit diesem hier:

        function standalone() {
             return (self == top);
             }

        if (!standalone()) top.location.href = top.location.href;

        der in einer Framesetdefinition steht, verabschiedet sich Netscape (Absturz) wenn man die Datei mit der Framesetdefinition in einem fremden Frame laden will....

        Ich  bastle noch schnell ein Beispiel, das ich online stelle (zur Demo)

        Bis danndann
        PAF (patrickausfrankfurt)

        1. Re re!

          if (!standalone()) top.location.href = top.location.href;

          Sollte übrigens heissen:
          if (!standalone()) top.location.href = self.location.href; (Copy&Paste-Fehler)

          Ich  bastle noch schnell ein Beispiel, das ich online stelle (zur Demo)

          Hier ist sie:
          http://www.atomic-eggs.com/temp/frameset.html

          Ein Framset mit Framekillerscript in einem Frameset laden zu wollen.... scheinbar ist es zuviel für unseren lieben Netsi. Da drehen die Zahnräder durch!

          Bis danndann

          PAF (self = patrickausfrankfurt)

          1. Re re re!

            Ein Framset mit Framekillerscript in einem Frameset laden zu wollen.... scheinbar ist es zuviel für unseren lieben Netsi. Da drehen die Zahnräder durch!

            Irgendwie komisch... offline stürzt er IMMER ab, online bei diesem Beispiel nur manchmal...

            Bis danndann

            PAF (self = patrickausfrankfurt)

            1. Hallo PAF,

              mir ging gerade durch den Kopf, ob man den pfiffigen Vergleich (self != top)
              nicht auch straflos per onLoad aufrufen/abfragen könnte.
              Die Frames gehen ja im Frameset nicht, klar, aber evtl. dieses?
              Wenn der Frameset ganz geladen ist, könnte es vielleicht schon etwas
              geordneter im Netsie zugehen.
              Insgesamt wäre das besser an den Ablauf der Sache angepasst
              als ein stereotypes Timeout.

              Klaus

          2. Hallo Patrick!

            Hier ist sie:
            http://www.atomic-eggs.com/temp/frameset.html

            Ein Framset mit Framekillerscript in einem Frameset laden zu wollen.... scheinbar ist es zuviel für unseren lieben Netsi. Da drehen die Zahnräder durch!

            NS4.5 bei 10 Versuchen 0 Absturz.

            Grüße
            Thomas

            1. Hallo Thomas,

              NS4.5 bei 10 Versuchen 0 Absturz.

              War das die Fassung mit oder ohne Timeout?
              Dem Zeitpunkt des Postings nach wohl eher mit.

              Klaus

            2. Hallo Thomas!

              Hier ist sie:
              http://www.atomic-eggs.com/temp/frameset.html

              Ein Framset mit Framekillerscript in einem Frameset laden zu wollen.... scheinbar ist es zuviel für unseren lieben Netsi. Da drehen die Zahnräder durch!

              NS4.5 bei 10 Versuchen 0 Absturz.

              Kein Wunder, habe ich doch, wie Klaus vermutet, den von ihm vorgeschlagenen TimeOut eingebaut.... Aber probier's mal jetzt (obwohl wie in einem der Postings erzählt, der Absturz bei mir nur offline passiert: deckt sich mit Klaus Erklärung:"Erklärungsversuch: der Netsi gibt schon mal das Laden aller Frameinhalte
              parallel in Auftrag, kriegt aber nicht mit, daß die (href)-Basis zwischenzeitlich
              ausgetauscht wurde (sie sogar selbst ausgetauscht hat) und teert das
              ankommende Zeugs hin wo nix mehr zum Hinteeren ist.")
              !

              Bis danndann

              PAF (patrickausfrankfurt)