Jan: Mehrere Pages in einem Frame hintereinander anzeigen

Hallo,

bin blutiger Anfaenger und hoffe ihr koennt mir helfen.
In einem Frame sollen hintereinander verschiedene Web Pages anzeiget werden.
Die Seiten sollen wie in einer Endlosschleife immer wieder angezeigt werden.
Ausserdem sollen die Seiten immer fuer ein bestimmtes Zeitintervall angezeigt werden.
Laesst sich sowas auch ohne Schleifen mittels Javascript realisieren.
Beispielcode waere klasse...

Vielen Dank.
Jan

  1. Laesst sich sowas auch ohne Schleifen mittels Javascript realisieren.

    Es lässt sich mit einer Schleife imho nicht vernünftig realisieren.

    Beispielcode waere klasse...

    setTimeout() und setInterval() sind hier von Interesse - versuch dich mal daran, und gib' Bescheid, wenn du hängst.

  2. Hi,

    In einem Frame sollen hintereinander verschiedene Web Pages anzeiget werden.

    da möchte ich mal zwei allgemeine Gedanken äußern.
    Erstens würde ich dir empfehlen, Frames aufgrund ihrer zahlreichen Nachteile zu meiden, wenn's geht.
    Zweitens hört sich dein Wunsch so an, als wolltest du fremde Seiten in deinem Frameset anzeigen. Ist das so? Wenn ja, erlauben die Inhaber dieser Fremdseiten das?

    Die Seiten sollen wie in einer Endlosschleife immer wieder angezeigt werden.
    Ausserdem sollen die Seiten immer fuer ein bestimmtes Zeitintervall angezeigt werden.
    Laesst sich sowas auch ohne Schleifen mittels Javascript realisieren.

    Wohl kaum. Es sei denn, die Frame-Dokumente unterliegen alle deiner Kontrolle und du kannst in deren Quellcode eingreifen. Dann wäre ein meta-Element in jedem der Dokumente vorstellbar, das nach einer bestimmten Verzögerung auf das nächste weiterleitet.

    Andernfalls sehe ich außer Javascript keine Chance. Du brauchst ein Array, in dem die gewünschten URLs und deren Anzeigedauer vermerkt sind, und eine Zähl- oder Indexvariable, die du sinnvollerweise mit 0 initialisierst. Dann eine Funktion, die aus dem aktuellen Arrayeintrag die URL liest, in location.href des Frames schreibt, und dann setTimeout() aufruft und so sich selbst nach einer definierten Verzögerung wieder aufruft, die ja auch im Array steht. Ach ja, Erhöhen der Indexvariable nicht vergessen, und wenn die maximale Zahl der Arrayeinträge erreicht ist, dann wieder auf 0 setzen.
    Ungefähr ein Vierzeiler, würde ich schätzen - plus die Definition des Arrays.

    So long,
     Martin

    --
    F: Was ist schlimmer: Alzheimer oder Parkinson?
    A: Parkinson. Lieber mal ein Bier vergessen zu zahlen, als eins verschütten.
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
  3. Hi,

    In einem Frame sollen hintereinander verschiedene Web Pages anzeiget werden.

    Hintereinander? Also da bietet sich z-index an.

    Die Seiten sollen wie in einer Endlosschleife immer wieder angezeigt werden.

    Das klingt eher nach Nacheinander.

    (wenn Dir der Unterschied nicht klar ist: Stell Dir vor, eine Dir äußerst unangenehme Person sitzt entweder hinter oder nach Dir auf der Toilette ...)

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    O o ostern ...
    Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
  4. Danke fur die raschen Antworten.
    Das habe ich bisher geschafft (im Zug) konnte es noch nicht testen...
    Das Array muss noch gefuellt werden.

      
    int i=0;  
    int interval=10000;  
    new Array arrayPages[];  
      
    function updateFrame()  
    {	  
    	if(i <= 5)  
    	{  
    	for(i <= 5)  
    	{  
    	 Frame1.location.href = arrayPages[i];  
    	 i++;  
    	 setTimeout(updateFrame(),interval);  
    	}  
    	}  
    }	  
      
    	else  
    	{  
    	 i=0;  
    	 updateFrame();  
    	}  
    
    

    Ich hab die Erlaubnis die Seiten anzuzeigen...

    Gruss
    Jan

    1. Hi,

      Das habe ich bisher geschafft (im Zug) konnte es noch nicht testen...

      also "auf dem Trockenen" geschrieben. Nun ja.
      Der Ansatz ist ja mal nicht übel, aber da sind noch ein paar Fallstricke drin. Vielleicht findest du sie selbst, wenn du nochmal in Ruhe drüber nachdenkst.

      Das Array muss noch gefuellt werden.

      Ja, allerdings. Das nehmen wir mal als gegeben an.

      int i=0;
      int interval=10000;
      new Array arrayPages[];

      Verstehe - du gehst den einfacheren Weg und nimmst für alle Seiten die gleiche Anzeigedauer. Ich hatte eine individuelle Zeit für jede Seite vor meinem geistigen Auge.

      function updateFrame()
      {
      if(i <= 5)

      Hmm. Was hat die 5 hier für eine Bedeutung? Die Anzahl der Einträge in einem Array kann man über deren length-Eigenschaft abfragen, anstatt diese Anzahl irgendwo als Konstante zu setzen.

      for(i <= 5)

      Das ist Phantasiesyntax, und zudem völlig überfüssig.

      Frame1.location.href = arrayPages[i];
      i++;
      setTimeout(updateFrame(),interval);

      Das wird so nicht funktionieren: setTimeout() erwartet als ersten Parameter entweder einen String, der Javascript-Code enthält, oder eine Funktionsreferenz (also z.B. nur den Namen einer Funktion). Du rufst aber updateFrame() sofort auf und gibst setTimeout() den Rückgabewert davon - also undefined.

      else
      {
      i=0;
      updateFrame();
      }

      Das kann man auch konsequenter machen ...

      Ich hab die Erlaubnis die Seiten anzuzeigen...

      Das ist gut. Ich wollte auch nur darauf hinweisen, weil das andernfalls Ärger geben kann.

      Ciao,
       Martin

      --
      Hannes würfelt abends immer, ob er den Abend mit seiner Frau zuhause verbringt oder in die Kneipe geht. Wenn er eine 6 würfelt, geht er in die Kneipe.
      Gestern musste er 37mal würfeln.
      Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
      1. "Verstehe - du gehst den einfacheren Weg und nimmst für alle Seiten die gleiche Anzeigedauer. Ich hatte eine individuelle Zeit für jede Seite vor meinem geistigen Auge."
        Sorry, hatte ich vergessen zu erwahnen...

        "»» else

        {
        i=0;
        updateFrame();
        }

        Das kann man auch konsequenter machen ..."

        Verraetst du mir wie?

          
          
        int i=0;  
        int interval=10000;  
        var arrayPages = new Array();  
          
        function updateFrame()  
        {	  
        	if(i <= arrayPages.length())  
        	{  
        	for(i <= arrayPages.length())  
        	{  
        	 Frame1.location.href = arrayPages[i];  
        	 i++;  
        	 setTimeout("updateFrame()",interval);  
        	}  
        	}	  
          
        	else  
        	{  
        	 i=0;  
        	 updateFrame();  
        	}  
        }  
        
        
        1. Hallo,

          "Verstehe - du gehst den einfacheren Weg und nimmst für alle Seiten die gleiche Anzeigedauer. Ich hatte eine individuelle Zeit für jede Seite vor meinem geistigen Auge."
          Sorry, hatte ich vergessen zu erwahnen...

          bitte spiel doch nicht an den Zitatmarkierungen herum, das macht es hinterher nur schwer zu erkennen, was Zitat und was neu ist.

          Das kann man auch konsequenter machen ...
          Verraetst du mir wie?

          In Pseudocode formuliert:

          --- Beginn ---
            Wenn Index > Maximalwert
               Setze Index auf 0

          Setze Frame-Adresse auf aktuell indizierten Array-Eintrag
            Erhöhe Index um 1
            Beauftrage nächsten verzögerten Funktionsaufruf
           --- Ende ---

          Konsequenter (logischer) heißt: Analysiere, welche Anweisungen immer ausgeführt werden und welche nur bedingt; ordne sie im Rahmen des korrekten Ablaufs so an, dass möglichst wenig Fallunterscheidungen nötig sind.

          if(i <= arrayPages.length())

          Die length-Eigenschaft von Arrays ist keine Funktion oder Methode!

          for(i <= arrayPages.length())

          Mir wird immer noch nicht klar, was du hier mit der for-Schleife willst, zumal sie immer noch syntaktisch falsch ist (und vom Ablauf her sowieso unsinnig). Eine for-Schleife hat drei Ausdrücke im Schleifenkopf:

          for (Initialisierung; Bedingung; Zählung)

          Üblicherweise setzt man als Initialisierung eine Schleifenvariable auf einen definierten Startwert, als Bedingung prüft man sie gegen einen Endwert, und als Zählung erhöht oder verringert man sie um 1. Wobei das nur die klassische, häufig vorkommende Verwendung ist; Variationen sind jederzeit möglich.
          In deinem Beispiel sehe ich aber überhaupt keine Anwendung für eine for-Schleife.

          Ciao,
           Martin

          --
          Zwei Freundinnen tratschen: "Du, stell dir vor, die Petra kriegt ein Kind!" - "Ich kann mir schon denken, von wem." - "Dann ruf sie mal schnell an, das würde ihr bestimmt weiterhelfen."
          Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
          1. In Pseudocode formuliert:

            --- Beginn ---
              Wenn Index > Maximalwert
                 Setze Index auf 0

            Setze Frame-Adresse auf aktuell indizierten Array-Eintrag
              Erhöhe Index um 1
              Beauftrage nächsten verzögerten Funktionsaufruf
            --- Ende ---

            Habe versucht deine Ratschlaege umzusetzen:

            int i=0;
            int interval=10000;
            var arrayPages = new Array();

            function updateFrame()
            {
            if(i > arrayPages.length)
            {
            i=0;
            }
            Frame1.location.href = arrayPages[i];
            i++;
            setTimeout("updateFrame()",interval);
            }

            Gruss
            Jan

            1. Hallo,

              Habe versucht deine Ratschlaege umzusetzen:

              sieht auch ganz gut aus - bis auf eine Kleinigkeit:

              if(i > arrayPages.length)

              Da Array-Indexe ab 0 zählen, ist der höchste erlaubte Wert nicht x.length, sondern x.length-1. Du musst also entweder auf >x.length-1 oder >=x.length prüfen, sonst läufst du "aus dem Array heraus".

              Und, schon probiert? :-)

              Ciao,
               Martin

              --
              Ich bin im Prüfungsstress, ich darf Scheiße sagen.
                (Hopsel)
              Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
              1. Hallo,

                habe eben getestet...die erste Seite im Array wird aufgerufen.
                Danach passiert nichts mehr.

                  
                var i=0;  
                var interval=5000;  
                var arrayPages = new Array();  
                  
                function updateFrame()  
                {  
                        if(i > arrayPages.length-1)  
                        {  
                         i=0;  
                        }  
                        parent.Frame2.location.href = arrayPages[i];  
                        i++;  
                        setTimeout('updateFrame()', 5000);  
                }  
                
                

                Warum wird updateFrame() nicht nach Ablauf des Timers aufgerufen?

                Gruss Jan

                1. Hi,

                  habe eben getestet...die erste Seite im Array wird aufgerufen.
                  Danach passiert nichts mehr.

                  mit welcher Fehlermeldung?

                  Warum wird updateFrame() nicht nach Ablauf des Timers aufgerufen?

                  Wie rufst du die Funktion beim ersten Mal auf? Mit dem onload-Handler?

                  Ciao,
                   Martin

                  --
                  why the heck do you jerk think, that wir ein doppelposting nicht bemerken, wenn you zwischendurch the sprache wechselst?
                    (wahsaga)
                  Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
          2. Hallo Martin,

            Wenn Index > Maximalwert
                 Setze Index auf 0

            oder den Modulo-http://de.selfhtml.org/javascript/sprache/operatoren.htm#berechnung@title=Operator benutzen.

            Gruß, Jürgen

            1. Hallo Jürgen,

              Wenn Index > Maximalwert
                   Setze Index auf 0
              oder den Modulo-http://de.selfhtml.org/javascript/sprache/operatoren.htm#berechnung@title=Operator benutzen.

              ja, daran dachte ich auch kurz. Wäre natürlich elegant; ich hatte (und habe) aber den Eindruck, dass Jan sowieso schon nahe an seiner persönlichen Grenze ist. Und die Modulo-Operation hat für die, die sie noch nicht kennen, meist etwas Mystisches an sich.

              Mindestens genauso elegant finde ich übrigens, den Index mit einer Bitmaske zu verknüpfen, wenn man dafür sorgt, dass die Anzahl der Arrayeinträge genau eine Zweierpotenz ist. Also z.B. ein Array mit 8 Elementen als a[x & 7] adressieren. Das ist de facto dasselbe wie eine Modulo-Division mit Integerwerten, nur dass sie als Bitoperation wesentlich performanter sein kann. Und für jemand wie mich, der quasi auf CPU-Ebene "denkt", sogar anschaulicher.

              Ciao,
               Martin

              --
              Zwei Freundinnen tratschen: "Du, stell dir vor, die Petra kriegt ein Kind!" - "Ich kann mir schon denken, von wem." - "Dann ruf sie mal schnell an, das würde ihr bestimmt weiterhelfen."
              Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
            2. @@JürgenB:

              nuqneH

              oder den Modulo-http://de.selfhtml.org/javascript/sprache/operatoren.htm#berechnung@title=Operator benutzen.

              Warum sollte man jedesmal eine unnütze Division durchführen? Wenn das mal nicht zu Performanzproblemen führt!

              Qapla'

              --
              Gut sein ist edel. Andere lehren, gut zu sein, ist noch edler. Und einfacher.
              (Mark Twain)
  5. Hallo,

    habe eben getestet...die erste Seite im Array wird aufgerufen.
    Danach passiert nichts mehr.

      
    var i=0;  
    var interval=5000;  
    var arrayPages = new Array();  
      
    function updateFrame()							  
    {	  
    	if(i > arrayPages.length-1)  
    	{  
    	 i=0;  
    	}  
            parent.Frame2.location.href = arrayPages[i];  
    	i++;  
    	setTimeout('updateFrame()', 5000);		  
    }  
    
    

    Warum wird updateFrame() nicht nach Ablauf des Timers aufgerufen?

    Gruss Jan

    1. Hallo Jan,

      Warum wird updateFrame() nicht nach Ablauf des Timers aufgerufen?

      wird updateFrame() denn überhaupt einmal aufgerufen? In deinem Codeschnippsel sehe ich da nichts.

      Gruß, Jürgen

      1. Hallo,

        wird updateFrame() denn überhaupt einmal aufgerufen? In deinem Codeschnippsel sehe ich da nichts.

        Ja, wird im Body aufgerufen. Die erste Seite wird auch geladen.
        Hatte ich vergessen, sorry.

        Gruss
        Jan

        1. Mahlzeit Jan,

          Ja, wird im Body aufgerufen. Die erste Seite wird auch geladen.

          Was sagt die Fehlerkonsole Deines Browsers?

          MfG,
          EKKi

          --
          sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
          1. Was sagt die Fehlerkonsole Deines Browsers?

            Es wird kein Fehler ausgegeben...

            1. Wenn ich das Intervall verkleiner und die Seite nicht komplett gelanden werden kann, funktioniert alles. Sobald ich jedoch das Intervall vergroesser und die Seite komplett geladen werden kann, bekomme ich immer nur die erste Seite geladen.

              Gruss

              1. Mit setInterval() funktioniert es. Jedoch wird die erste Seite im Array 2mal angezeigt.

                  
                var i=0;  
                var interval=10000;  
                var arrayPages = new Array("");  
                  
                setInterval("updateFrame()",interval);  
                  
                function Interval()  
                {  
                    interval=document.getElementById("TextBox1").value;  
                  
                }  
                  
                function updateFrame()							  
                {	  
                    if(i > arrayPages.length-1)  
                	{  
                	 i=0;  
                	}  
                    parent.Frame2.location.href = arrayPages[i];  
                	i++;  
                }  
                
                

                Die Funktion Interval liest den Wert aus einer TextBox aus und nach einem Klick auf den Button soll der Wert als Intervall benutzt werden.
                Der neue Wert wird in die Varaible interval geschrieben, jedoch aendert sich die Dauer des Intervalls im Browser nicht.
                wie kann ich den Wert an setInterval uebergeben?

                Gruss Jan

  6. Hallo,

    soweit funktioniert alles.

      
    var i=0;  
    var t;  
    var interval=10000;  
    var arrayPages = new Array();  
    function UpdateFrame()							  
    {	  
        if(i > arrayPages.length-1)  
    	{  
    	 i=0;  
    	}  
    	if(document.getElementById("TextBox1").value!=0)  
    	{  
    	 interval=document.getElementById("TextBox1").value*1000;  
    	}  
        parent.Frame3.location.href = arrayPages[i];  
    	i++;  
    	t=setTimeout("UpdateFrame()",interval);  
    }  
      
    function Pause()  
    {  
        clearTimeout(t);  
    }  
    
    

    Wuerde gerne noch die Funktion hinzufuegen, dass man die Reihenfolge der Seiten individuell aendern kann.
    Dazu muss ich das Arry jedes mal neu schreiben, oder?

    Viele Gruesse
    Jan