Ringer: Schleifenprobleme (kein Java sondern ein JavaScript Problem!)

Hallo Zusammen,

ich habe ein Problem mit dem setTimeout-Befehl! Auf meiner Seite lade ich in einen verdeckten frame eine Seite und hole mir von dort Variablen! Welche ich dann an ein ActiveX-Control übergebe. Den Timeout brauche ich da das laden der Seite in den verdekten frame auch eine gewisse Zeit braucht und es daher manchmal Probleme mit der Übergabe gab.

Hier die funktionierende Variante:

function load (){
  document.all.activex.panel=parent.Auswahl.seite;
  parent.frames.verdeckt.location.href = parent.Auswahl.seite;
  setTimeout("timer()",100);
                }
function timer(){
  if (parent.verdeckt.test=="richtig")
         {
  var s=parent.verdeckt.var1.innerText;
  s=s+','+parent.verdeckt.var2.innerText;
  s=s+','+parent.verdeckt.var3.innerText;
  s=s+','+parent.verdeckt.var4.innerText;
  s=s+','+parent.verdeckt.var5.innerText;
  document.all.activex.fuellen=s;
  }
}

Nun will ich aber mehrere Seiten auslesen. Dazu habe ich eine for Schleife genutzt. Leider kann ich da aber den Timer nicht einbauen.

Problem:

function test()
{
  for (i=1;i<3;i++)
    {
   parent.frames.verdeckt.location.href="seite"+i+".html";
   setTimeout("timerzwei()",100);
                  }
function timerzwei(){
      if (parent.verdeckt.test=="richtig")
        {
        var s=parent.verdeckt.var1.innerText;
        s=s+','+parent.verdeckt.var2.innerText;
        s=s+','+parent.verdeckt.var3.innerText;
        s=s+','+parent.verdeckt.var4.innerText;
        s=s+','+parent.verdeckt.var5.innerText;
        document.all.activex.variable=s;
        }
      }
}

Das Problem ist das ich eine Funktion in ein for-Schleife stecke! Wenn ich die Funktion schließen will um den Timer zu nutzen schließe ich die for-Schleife! Also ich hoffe ihr versteht mein Problem. ich selbst bin mit meinen doch begrenzten Wissen am Ende!

Gruß

Ringer

  1. Nun will ich aber mehrere Seiten auslesen. Dazu habe ich eine for Schleife genutzt. Leider kann ich da aber den Timer nicht einbauen.

    ich versteh nicht genau was du machen willst. Mir scheint aber das es so wie du es dir vorstellst es nicht funktioniert.

    »

    function test()
    {
      for (i=1;i<3;i++)
        {
       parent.frames.verdeckt.location.href="seite"+i+".html";
       setTimeout("timerzwei()",100);
                      }

    damit veränderst du dreimal das Frame und setzt drei timer. Da die Schleife aber so schnell abgearbeitet wird, das die Seiten 1 und 2 nie geladen werden, würd  es ausreichen zu schreiben:
    parent.frames.verdeckt.location.href="seite3.html";

    die 100ms für den Timer sind problematisch, weil....

    function timerzwei(){
          if (parent.verdeckt.test=="richtig")

    die Variabel 'verdeckt' mit Sicherheit nicht nach 100ms geladen ist.

    {
            var s=parent.verdeckt.var1.innerText;

    Und das die Variabel 'verdeckt' ein Objekt 'var1' hat mit einer Eigenschaft 'innerText' halte ich ebenso für zweifelhaft. innerText ist soweit ich weiss auch nur IE only.

    s=s+','+parent.verdeckt.var2.innerText;

    einfacher:

    s += 'text den du Anhängen willst'

    • 'mehr Text'
    • 'noch mehr Text'
      ;

    document.all.activex.variable=s;

    Das klingt auch obskur. Allerdigs ist ohne Information, was du da genau verändern willst die kaum zu helfen.

    Struppi.

    1. ich versteh nicht genau was du machen willst. Mir scheint aber das es so wie du es dir vorstellst es nicht funktioniert.

      Ich will wie geschrieben mehrere Seiten in einen verdeckten frame laden und dann von jeder Seite ein paar Werte einlesen. Diese will ich dann an mein ActiveX Control übergeben!

      function test()

      {
         for (i=1;i<3;i++)
           {
          parent.frames.verdeckt.location.href="seite"+i+".html";
          setTimeout("timerzwei()",100);
                         }

      damit veränderst du dreimal das Frame und setzt drei timer. Da die Schleife aber so schnell abgearbeitet wird, das die Seiten 1 und 2 nie geladen werden, würd  es ausreichen zu schreiben:
      parent.frames.verdeckt.location.href="seite3.html";

      Das ist genau mein Problem! Ich will jede Seite einzeln laden und mir dann die Werte holen, übergeben und dann nächste Seite.

      die 100ms für den Timer sind problematisch, weil....

      function timerzwei(){
            if (parent.verdeckt.test=="richtig")

      die Variabel 'verdeckt' mit Sicherheit nicht nach 100ms geladen ist.

      Dann machen wir halt 1000 aber es findet alles in einen lokalen Netz statt so müßte die Zeit reichen.

      {
              var s=parent.verdeckt.var1.innerText;

      Und das die Variabel 'verdeckt' ein Objekt 'var1' hat mit einer Eigenschaft 'innerText' halte ich ebenso für zweifelhaft. innerText ist soweit ich weiss auch nur IE only.

      Da ich es eh nur in einen interen Netz nutzen will (wo jeder IE hat) ist die kein Problem!

      document.all.activex.variable=s;

      Das klingt auch obskur. Allerdigs ist ohne Information, was du da genau verändern willst die kaum zu helfen.

      Das stimmt schon ;-). Ist die Übergabe an mein ActiveX-Control!

      Ringer

      1. ich versteh nicht genau was du machen willst. Mir scheint aber das es so wie du es dir vorstellst es nicht funktioniert.

        Ich will wie geschrieben mehrere Seiten in einen verdeckten frame laden und dann von jeder Seite ein paar Werte einlesen. Diese will ich dann an mein ActiveX Control übergeben!

        geht das so? ich hab keine Ahnung von ActiveX.

        Das ist genau mein Problem! Ich will jede Seite einzeln laden und mir dann die Werte holen, übergeben und dann nächste Seite.

        dazu musst du die Seite laden lassen und warten bis alles passiert ist was du machen willst und dann erst weiter gehen.

        die 100ms für den Timer sind problematisch, weil....

        function timerzwei(){
              if (parent.verdeckt.test=="richtig")

        die Variabel 'verdeckt' mit Sicherheit nicht nach 100ms geladen ist.

        Dann machen wir halt 1000 aber es findet alles in einen lokalen Netz statt so müßte die Zeit reichen.

        100ms sind auch in einem lokalen Netz zu kurz, selbst eine sekunde kann mit einem ActiveX Kontrol zu kurz sein. Alllgemein gibt es den onload event, der für sowas zuständig ist. (wobei ich keine Erfahrung hab, ob der auch das laden und starten von Plugins berücksichtigt)

        entweder du baust in seiteX.html im body tage ein onload="opener.functionsaufruf()" ein oder probier nach der Zuweisung der neuen URL:

        parent.frames.verdeckt.onload = fertig;

        function fertig()
        {
            alert(this + ' is fertig');

        }

        Struppi.

        1. entweder du baust in seiteX.html im body tage ein onload="opener.functionsaufruf()" ein oder probier nach der Zuweisung der neuen URL:

          parent.frames.verdeckt.onload = fertig;

          function fertig()

          {
               alert(this + ' is fertig');

          }

          Schöne Idee! Aber dann habe ich immernoch das alte Problem! Ich habe meine for-Schleife, welche die seite1.html, seite2.html... lädt und in dieser eine Funktion (fertig). Ja und das geht nicht! Klar ich könnte einfach alles nacheinander hinschreiben aber die Schleife wäre schon schön!

          Ringeer

          1. Schöne Idee! Aber dann habe ich immernoch das alte Problem! Ich habe meine for-Schleife, welche die seite1.html, seite2.html... lädt und in dieser eine Funktion (fertig). Ja und das geht nicht! Klar ich könnte einfach alles nacheinander hinschreiben aber die Schleife wäre schon schön!

            Denkfehler!

            Du kannst nicht drei Seiten gleichzeitig in ein und dasselbe Frame laden und dann auch noch gleichzeitig in allen irgendwas tun. Nimm drei Frames.

            Struppi.

            1. Schöne Idee! Aber dann habe ich immernoch das alte Problem! Ich habe meine for-Schleife, welche die seite1.html, seite2.html... lädt und in dieser eine Funktion (fertig). Ja und das geht nicht! Klar ich könnte einfach alles nacheinander hinschreiben aber die Schleife wäre schon schön!

              Denkfehler!

              Das weiß ich auch deshalb erfolgt das Laden und dann das auslesen nacheinander!

              Hier nochmal das ganze mit einer Seite (funktioniert super!):

              function load (){
                document.all.activex.panel=parent.Auswahl.seite;
                parent.frames.verdeckt.location.href = parent.Auswahl.seite;
                setTimeout("timer()",100);
                              }
              function timer(){
                if (parent.verdeckt.test=="richtig")
                       {
                var s=parent.verdeckt.var1.innerText;
                s=s+','+parent.verdeckt.var2.innerText;
                s=s+','+parent.verdeckt.var3.innerText;
                s=s+','+parent.verdeckt.var4.innerText;
                s=s+','+parent.verdeckt.var5.innerText;
                document.all.activex.fuellen=s;
                }
              }

              Nun will ich aber nicht wie hier nur von einer Seite Werte laden sondern dies von X-Seiten (seiteX.html).
              Daher habe ich mir die Schleife gebaut (welche nicht funktioniert?!).

              Gruß

              Ringer

              1. Das weiß ich auch deshalb erfolgt das Laden und dann das auslesen nacheinander!

                Na, dann mach das doch.

                Hier nochmal das ganze mit einer Seite (funktioniert super!):

                function load (){
                  document.all.activex.panel=parent.Auswahl.seite;
                  parent.frames.verdeckt.location.href = parent.Auswahl.seite;
                  setTimeout("timer()",100);
                                }

                100ms, halte ich wie gesagt für nicht praktikabel, dass es funktioniert kann daran liegen das die Seite bei dir auf der Fetsplatte liegt (Cache)
                aber selbst im Intranet sind solch kurze Zeiten (vermutlich) nicht realistisch.
                Sinnvoll ist immer das onload event in so einem Falle.

                also in etwa so:
                parent.frames.verdeckt.onload = timer;
                parent.frames.verdeckt.location.href = parent.Auswahl.seite;

                function timer(){
                  if (parent.verdeckt.test=="richtig")
                         {
                  var s=parent.verdeckt.var1.innerText;
                  s=s+','+parent.verdeckt.var2.innerText;
                  s=s+','+parent.verdeckt.var3.innerText;
                  s=s+','+parent.verdeckt.var4.innerText;
                  s=s+','+parent.verdeckt.var5.innerText;
                  document.all.activex.fuellen=s;
                  }
                }

                Nun will ich aber nicht wie hier nur von einer Seite Werte laden sondern dies von X-Seiten (seiteX.html).
                Daher habe ich mir die Schleife gebaut (welche nicht funktioniert?!).

                weil du ja immer die seite überschreibst / neu lädst.

                Du willst entweder X Frmaes, oder du musst halt warten, bis deine Aktion gelaufen ist und dann weiter machen. Das hängt aber dann an deinem ActiveX Control.

                Struppi.

                1. Sinnvoll ist immer das onload event in so einem Falle.

                  Ok, ich werde deinen Tipp beherzigen!

                  also in etwa so:
                  parent.frames.verdeckt.onload = timer;
                  parent.frames.verdeckt.location.href = parent.Auswahl.seite;

                  function timer(){
                    if (parent.verdeckt.test=="richtig")
                           {
                    var s=parent.verdeckt.var1.innerText;
                    s=s+','+parent.verdeckt.var2.innerText;
                    s=s+','+parent.verdeckt.var3.innerText;
                    s=s+','+parent.verdeckt.var4.innerText;
                    s=s+','+parent.verdeckt.var5.innerText;
                    document.all.activex.fuellen=s;
                    }
                  }

                  Das sieht zwar gut aus ist aber wie gesagt das alte Problem!

                  Ich habe meine for-Schleife, welche die Seite hochzählt und in dieser Schleife kann ich keine andere Funktion stecken!

                  for (i=1;i<5;i++)
                  {
                  parent.frames.verdeckt.onload = timer;
                  parent.frames.verdeckt.location.href = parent.Auswahl.seite+i+; //geht vielleicht nicht geht aber ums Prinzip!

                  function timer(){
                    if (parent.verdeckt.test=="richtig")
                            {
                     var s=parent.verdeckt.var1.innerText;
                     s=s+','+parent.verdeckt.var2.innerText;
                     s=s+','+parent.verdeckt.var3.innerText;
                     s=s+','+parent.verdeckt.var4.innerText;
                     s=s+','+parent.verdeckt.var5.innerText;
                     document.all.activex.fuellen=s;
                     }
                   }
                   }

                  weil du ja immer die seite überschreibst / neu lädst.

                  Das will ich ja auch machen! Ich will die Seite laden mit meinen Control auslesen. Dann überschreiben und wieder laden und auslesen...

                  Du willst entweder X Frmaes, oder du musst halt warten, bis deine Aktion gelaufen ist und dann weiter machen. Das hängt aber dann an deinem ActiveX Control.

                  Das Control ist super fix! Das macht wenigstens kein Problem!

                  Ringer

                  1. Sinnvoll ist immer das onload event in so einem Falle.

                    Ok, ich werde deinen Tipp beherzigen!

                    tja, grad hab ich mal ein bisschen rumprobiert und bei mir funktioniert das so nicht :-(

                    also doch eine schleife:

                    var seite = 1;
                    function load()
                    {
                    if(seite > anzahl) return;
                    parent.verdeckt.location.href = 'seite' + seite + '.html';
                    warte();
                    }

                    function warte()
                    {

                    if(parent.verdeckt.document.var1) timer()
                    else setTimeout('warte()', 100);

                    }

                    function timer(){
                    if (parent.verdeckt.test=="richtig")

                    var s = parent.verdeckt.var1.innerText

                    • ',' + parent.verdeckt.var2.innerText
                    • ',' + parent.verdeckt.var3.innerText
                    • ',' + parent.verdeckt.var4.innerText
                    • ',' + parent.verdeckt.var5.innerText
                      ;

                    document.all.activex.fuellen = s;

                    und hier geht's weiter, falls du abschätzen kannst wie lang die Aktion dauert mit einem Timer:

                    seite++;
                    setTimeout('load()', 500);

                    }
                    }

                    HTH Struppi.

                    1. Hallo,

                      erstmal danke für deine Mühe!!

                      Habe gerade mal deinen Programm getestet und es funktioniert nicht!

                      if(seite > anzahl) return;
                      parent.verdeckt.location.href = 'seite' + seite + '.html';
                      warte();
                      }

                      es stört sich an dieser Funktion! Ich weiß ehrlich gesagt auch nicht was das return nach der if-Anweisung bedeutet. Auch verstehe ich diese Funktion nicht so richtig!

                      function warte()
                      {
                      if(parent.verdeckt.document.var1) timer()
                      else setTimeout('warte()', 100);
                      }

                      Aber ich werde auch nochmal etwas rumprobieren!

                      Gruß

                      Ringer

                      1. Hallo,

                        erstmal danke für deine Mühe!!

                        Habe gerade mal deinen Programm getestet und es funktioniert nicht!

                        if(seite > anzahl) return;

                        du musst natülich einen wet für die maximale Anzahl der Seiten hier angeben. entweder du definierst anzahl oder du trägst eine Zahl ein.

                        parent.verdeckt.location.href = 'seite' + seite + '.html';
                        warte();
                        }

                        es stört sich an dieser Funktion! Ich weiß ehrlich gesagt auch nicht was das return nach der if-Anweisung bedeutet. Auch verstehe ich diese Funktion nicht so richtig!

                        ????
                        Du weißt nicht was ein if() konstrukt macht?

                        Struppi.

  2. hi,

    bitte unterlasse in zukunft doppelpostings.
    wenn du dich bei deinem thread [pref:t=59815&m=336221] korrigieren wolltest, was den themenbereich angeht, hätte ein folgeposting im gleichnen thread, welches schon in der überschrift die sache klar stellt, wohl ausgereicht.

    gruss,
    wahsaga