Robert Allerstorfer: top.frames.length

Hi,

leider linken viele webseiten von einem frame aus zu einer fremden site und bedenken nicht, dass diese site wieder aus frames bestehen kann (man sollte daher, wenn man von einem frame aus auf fremde seiten linkt, immer 'target=_top' oder 'target=_blank' verwenden, mein ich.

eine seite, die ich betreue, besteht aus 2 frames und ich will nun ein neues frameset (mit 'top.location.href="http://url.des.startframes/"' ) immer dann erzwingen, wenn die hauptseite erkennt, dass im browser insgesamt nicht genau 2 frames vorhanden sind.

top.frames.length gibt aber immer 2 (also eigentlich parent.frames.length) aus, auch wenn es tatsächlich 3 frames gibt (die 2 meines framesets und ein fremder)! Ist das normal, das diese JavaScript-eigenschaft einen falschen wert zurückgibt bzw. gibts ne möglichkeit, dieses problem zu lösen?

thanks,
robert

  1. Hallo,

    top.frames.length gibt aber immer 2 (also eigentlich parent.frames.length) aus, auch wenn es tatsächlich 3 frames gibt (die 2 meines framesets und ein fremder)! Ist das normal, das diese JavaScript-eigenschaft einen falschen wert zurückgibt bzw. gibts ne möglichkeit, dieses problem zu lösen?

    top.frames.length liefert 2 zurück, wenn in der Frame-Definition zwei Frames stehen, also z.B. "Menu" und "Haupt" - unabhängig davon, wie viele Frames in "Haupt" stehen. Du kannst aber beispielsweise auf den Namen der Frames prüfen, diese sollten nur bei Dir auftauchen.

    Wenn ich mich richtig erinnere, wirft top.location.href eine Fehlermeldung aus, wenn die URL von einer anderen Domain kommt als das aufrufende Dokument (Deins). So kannst Du also z.B. mit

    x = window.setTimeout("top.location.href=http://DeineURL",1000);
    if (top.location.href == "http://DeineURL") window.clearTimeout(x);

    eine relativ sichere Umgehung programmieren. In der zweiten Zeile solltest Du aber auch darauf achten, daß man Deine Homepage auch mit "/index.html" aufrufen kann, also solltest Du etwas mit indexOf und/oder substring rumspielen!

    Cheatah

    P.S.: Dieser Trick mit setTimeout ist mir gerade spontan eingefallen, ich weiß also nicht genau ob er funktioniert. Prüfe ihn also mit möglichst vielen Browsern!

    1. Hallo,

      top.frames.length liefert 2 zurück, wenn in der Frame-Definition zwei Frames stehen, also z.B. "Menu" und "Haupt" - unabhängig davon, wie viele Frames in "Haupt" stehen. Du kannst aber beispielsweise auf den Namen der Frames prüfen, diese sollten nur bei Dir auftauchen.

      Ja.

      Wenn ich mich richtig erinnere, wirft top.location.href eine Fehlermeldung aus, wenn die URL von einer anderen Domain kommt als das aufrufende Dokument (Deins).

      Ja.

      So kannst Du also z.B. mit
      x = window.setTimeout("top.location.href=http://DeineURL",1000);
      if (top.location.href == "http://DeineURL") window.clearTimeout(x);
      eine relativ sichere Umgehung programmieren.

      Und jetzt habe ich einen Aussetzer(?).
      Was soll das bewirken?
      Ich steige nicht dahinter.
      Der unzulaessige Zugriff auf top.location.href ist doch noch immer drin?

      Zur Ursprungsfrage:
      Es geht, so lese ich, lediglich darum, rauszukriegen, ob eine netter Zeitgenosse die Seiten in seinen Frame gequetscht hat.

      Schau mal in die FAQ von de.comp.lang.javascript http://irb-www.informatik.uni-dortmund.de/~sm/aw/js/faq/ unter "Wie stelle ich fest, ob meine Seite in einem Frame geladen wurde?"
      Die Loesung dort ist bestimmt auch fuer Dich ein gangbarer Weg.

      Christine

      1. Hi,

        x = window.setTimeout("top.location.href=http://DeineURL",1000);
        if (top.location.href == "http://DeineURL") window.clearTimeout(x);

        Der unzulaessige Zugriff auf top.location.href ist doch noch immer drin?

        ja, aber nach der Fehlermeldung müßte das setTimeout noch laufen und die Seite auf die orig. URL weiterleiten! Ich hoffe jedenfalls, das das funktioniert, weil der vorherige Befehl eigentlich nicht abgebrochen werden dürfte...

        Cheatah

        1. x = window.setTimeout("top.location.href=http://DeineURL",1000);
          if (top.location.href == "http://DeineURL") window.clearTimeout(x);
          Der unzulaessige Zugriff auf top.location.href ist doch noch immer drin?
          ja, aber nach der Fehlermeldung müßte das setTimeout noch laufen und die Seite auf die orig.

          Uff!
          Ich bin bestimmt nicht schlecht in verrueckten Ideen. Aber da kann ich nicht mithalten.
          Noch ein    self.onerror = null;      davor,
          und zumindest die Browser, die damit was anfangen koenne, bringen nicht mal einen Fehler.
          Vielleicht funktioniert das sogar. Ich habe es nicht probiert.
          Aber sei mir nicht boese, so richtig anfreunden kann ich mich mit der Idee eben doch nicht.

          Christine

          1. Hi Christine,

            Ich bin bestimmt nicht schlecht in verrueckten Ideen. Aber da kann ich nicht mithalten.

            :-)))

            Noch ein    self.onerror = null;      davor,

            Stimmt! Da ich normalerweise JavaScript nur benutze, wenn ich von der Fehlerfreiheit überzeugt bin, denke ich nicht an diesen Befehl... hier ist er aber sehr sinnvoll!

            Aber sei mir nicht boese, so richtig anfreunden kann ich mich mit der Idee eben doch nicht.

            Ich auch nicht (war ja auch nur ein spontaner Gedanke), aber wahrscheinlich werde ich es mal in eine Testversion meiner Homepage einbeziehen... Wenn's mit vielen Browsern fehlerfrei läuft, wäre das ja ein recht kurzes Script hoher Effektivität, also etwas für die BestOf?

            Cheatah

            1. Aber sei mir nicht boese, so richtig anfreunden kann ich mich mit der Idee eben doch nicht.
              Ich auch nicht (war ja auch nur ein spontaner Gedanke), aber wahrscheinlich werde ich es mal in eine Testversion meiner Homepage einbeziehen... Wenn's mit vielen Browsern fehlerfrei läuft, wäre das ja ein recht kurzes Script hoher Effektivität, also etwas für die BestOf?

              Na ja, ob da nicht bekannten (weniger phantasievollen <g>) Loesungen, z.B. die aus JavaScript-FAQ http://www.informatik.uni-dortmund.de/~sm/aw/js/faq/ auch reichen?
              Dumm, ich merke gerade, der Server in Dortmund scheint sich ein Wochenende zu goennen.
              Na ja, ihr habt ja alle laengst das zip-File zum kostenguenstigen Studium runtergeladen ;-)))

              Christine

              1. Na ja, ob da nicht bekannten (weniger phantasievollen <g>) Loesungen, z.B. die aus JavaScript-FAQ http://www.informatik.uni-dortmund.de/~sm/aw/js/faq/ auch reichen?
                Dumm, ich merke gerade, der Server in Dortmund scheint sich ein Wochenende zu goennen.
                Na ja, ihr habt ja alle laengst das zip-File zum kostenguenstigen Studium runtergeladen ;-)))

                Christine

                Liebe Christine,

                danke für deine Info über die JavaScript-FAQ. Mir ging es wirklich nur darum, zu verhindern, dass irgendwer in eines seiner frames ein fremdes (mein) frameset reinquetscht. interessant, dass sich daraus ne diskussion entwickelt hat, wie man irgendwelche fehlermeldungen unterdrücken kann, mir is nicht ganz klar, wie Cheatah darauf gekommen ist..

                leider ist der link zur uni dortmund derzeit tot, könntest du mir das zip evt. mailen, falls es nicht zu gross ist?

                lg,
                robert

                1. Hallo,

                  danke für deine Info über die JavaScript-FAQ.

                  dito!

                  Mir ging es wirklich nur darum, zu verhindern, dass irgendwer in eines seiner frames ein fremdes (mein) frameset reinquetscht. interessant, dass sich daraus ne diskussion entwickelt hat, wie man irgendwelche fehlermeldungen unterdrücken kann,

                  Das geht meistens ganz harmlos los...

                  mir is nicht ganz klar, wie Cheatah darauf gekommen ist..

                  Tja, das macht wohl mein positronisches Gehirn, ich bin doch schließlich ein Parano... äh... Android *grins* :-)

                  leider ist der link zur uni dortmund derzeit tot, könntest du mir das zip evt. mailen, falls es nicht zu gross ist?

                  Mir auch bitte!

                  Cheatah

                  1. Hallo,

                    leider ist der link zur uni dortmund derzeit tot, könntest du mir das zip evt. mailen, falls es nicht zu gross ist?

                    Ich nehme mal an, dass der Server morgen zum Montag wieder brav seinen Dienst tut.

                    Christine