Ergebnis 1 bis 9 von 9
  1. #1
    Finkenwerder Herbstprinz
    Themenstarter

    Registriert
    03.2008
    Ort
    Berlin, Germany, Germany
    Beiträge
    463

    Komische While Schleife

    Hallo Leute!

    Kann mir mal bitte sagen, wo hier das Problem liegt?!
    Code:
    var i = 1;
        while (i < 10)
        {
            alert(i);
            document.getElementById('text').style.visibility = "hidden";
            window.setTimeout("document.getElementById('text').style.visibility = 'visible';", 1000);
            i=(i + 1);
        }
    Wenn ich diese Funktion ausführe, bekomme ich neun mal den Alert und beim 10. Mal wird dann das entsprechende Element nur ein Mal ein- und wieder ausgeblendet.

    Wieso ist das so?!
    In der Referenz zu while steht, dass die Porgrammieranweisungen so lange wiederholt werden, bis die Bedingung erfüllt ist. Dies habe ich hier in Code geschrieben und es funktioniert einfach nicht.


    Bin für Hilfe dankbar.
    Grüße
    Mini-Leo

    You can only take what you can carry.

  2. #2
    Goldparmäne Avatar von torben1
    Registriert
    08.2008
    Ort
    Essen
    Alter
    35
    Beiträge
    560
    Dein Script macht genau das was es soll. Es wird 9 mal Deine Schleife durchlaufen. Beim letzten Durchlauf kommt nur endlich die Sekunde zu tragen. D.H. Dein Script stoppt nicht bei der Timeout-Anweisung, sondern läuft weiter und geht erneut in die Schleife.

  3. #3
    Altländer Pfannkuchenapfel Avatar von gKar
    Registriert
    06.2008
    Ort
    Wetter (Ruhr)
    Beiträge
    4.456
    Ich nehme mal an, Du möchtest, dass ein bestimmtes Element im Sekundentakt blinkt.
    Was Du brauchst, ist eine Funktion, die genau einmal das Element versteckt, falls es sichtbar ist bzw. sichtbar macht, falls es versteckt ist, und die dann einen Timer aktiviert, der nach Ablauf einer Sekunde wieder dieselbe Funktion aufruft.
    Wenn's nicht endlos blinken soll, sondern wirklich nur 9mal, dann noch einen Zähler hinzufügen und den Timer nur neu starten, wenn der Timer den Schwellwert noch nicht erreicht hat.
    * Wer nichts weiß, muss alles glauben.
    * Geduld mit der Streitsucht der Einfältigen! Es ist nicht leicht zu begreifen, dass man nicht begreift.
    Marie von Ebner-Eschenbach

    Mac-Tastaturlayout für Windows (z.B. in Bootcamp oder VM)

  4. #4
    Finkenwerder Herbstprinz
    Themenstarter

    Registriert
    03.2008
    Ort
    Berlin, Germany, Germany
    Beiträge
    463
    Danke, gKar!

    Hat jetzt doch funktioniert. Dann scheine ich den Nutzen der while-Schleife wohl vollkommen missverstanden zuhaben…
    Ich bin auf jeden Fall glücklich, dass das jetzt geht.

    Code:
    function blinkMich()
    {
        if (i > 5)
        {
            i = 0;
        }
        else
        {
            if (document.getElementById('text').style.visibility == "visible")
            {
                document.getElementById('text').style.visibility = "hidden";
            }
            else
            {
                document.getElementById('text').style.visibility = "visible";
            }
            setTimeout("blinkMich();", 100);
            i = (i + 1);
        }
    }
    Mini-Leo

    You can only take what you can carry.

  5. #5
    Altländer Pfannkuchenapfel Avatar von gKar
    Registriert
    06.2008
    Ort
    Wetter (Ruhr)
    Beiträge
    4.456
    Zitat Zitat von Mini-Leopard Beitrag anzeigen
    Dann scheine ich den Nutzen der while-Schleife wohl vollkommen missverstanden zuhaben
    Nicht so sehr den Nutzen der While-Schleife (wobei in dem Fall ohnehin eine For-Schleife das Mittel der Wahl wäre), als vielmehr den Unterschied zwischen synchroner und asynchroner Ausführung. Das Starten eines Timers ist eine asynchrone Ausführung (der Timer ist eine Art separater Thread). Etwas anderes wäre es, den Thread mit der Schleife für eine Sekunde lang anzuhalten („schlafen zu schicken“), ich vermute, dass das mit JavaScript auch ginge. Aber die Timer-Implementierung finde ich schon eleganter.
    * Wer nichts weiß, muss alles glauben.
    * Geduld mit der Streitsucht der Einfältigen! Es ist nicht leicht zu begreifen, dass man nicht begreift.
    Marie von Ebner-Eschenbach

    Mac-Tastaturlayout für Windows (z.B. in Bootcamp oder VM)

  6. #6
    Englischer Kantapfel Avatar von _linx_
    Registriert
    01.2009
    Alter
    19
    Beiträge
    1.086
    Zitat Zitat von gKar Beitrag anzeigen
    [...], ich vermute, dass das mit JavaScript auch ginge. [...]
    Du vermutest falsch, das ist mit Javascript nicht möglich. Mitunter ist da ein Grund die Auslastung des Browser - die bei einem asynchronen Timer schon genug hoch ist...

  7. #7
    Finkenwerder Herbstprinz
    Themenstarter

    Registriert
    03.2008
    Ort
    Berlin, Germany, Germany
    Beiträge
    463
    Wie dem auch sei.
    Ich bin jedenfalls total happy, dass es jetzt funktioniert
    Mini-Leo

    You can only take what you can carry.

  8. #8
    Jamba
    Registriert
    03.2011
    Beiträge
    57

    trauern

    möglich wäre auch sowas

    Code:
    function blinkOnce(i) {
    if(i%2==0) {
    document.getElementById('text').style.visibility = "hidden";
    } else {
    document.getElementById('text').style.visibility = "visible";
    }
    alert(i);
    }
    
    function blink() {
    for(var i = 0; i < 10; i++) {
    window.setTimeout("blinkOnce("+i+")",i*100);
    }
    }
    sry, dass ich den code nicht eingerückt habe, aber er müsste verständlich sein.

  9. #9
    Finkenwerder Herbstprinz
    Themenstarter

    Registriert
    03.2008
    Ort
    Berlin, Germany, Germany
    Beiträge
    463
    Hey madmaurice!

    Deine Möglichkeit mag funktionieren.
    Allerdings halte ich eine Lösung mit zwei Funktionen für ein bisschen overdressed.
    Hier ist (wie schon weiter oben beschrieben) mein Weg:
    Code:
    function blinkMich()
    {
        if (i > 5)
        {
            i = 0;
        }
        else
        {
            if (document.getElementById('text').style.visibility == "visible")
            {
                document.getElementById('text').style.visibility = "hidden";
            }
            else
            {
                document.getElementById('text').style.visibility = "visible";
            }
            setTimeout("blinkMich();", 100);
            i = (i + 1);
        }
    }
    Ist super easy.
    Wenn i 5 entspricht, wird einfach kein weiteres Mal wiederholt.
    Und zusätzlich wird i = 0 gesetzt, damit das blinken wiederholt werden kann.


    Grüße
    Ju
    Mini-Leo

    You can only take what you can carry.

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •