• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung

[Javascript] Komische While Schleife

Mini-Leopard

Rhode Island Greening
Registriert
20.03.08
Beiträge
476
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
 

torben1

Celler Dickstiel
Registriert
05.08.08
Beiträge
798
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.
 

gKar

Maunzenapfel
Registriert
25.06.08
Beiträge
5.362
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.
 

Mini-Leopard

Rhode Island Greening
Registriert
20.03.08
Beiträge
476
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);
    }
}
 

gKar

Maunzenapfel
Registriert
25.06.08
Beiträge
5.362
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.
 

_linx_

Kleiner Weinapfel
Registriert
04.01.09
Beiträge
1.125
[...], 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...
 

Mini-Leopard

Rhode Island Greening
Registriert
20.03.08
Beiträge
476
Wie dem auch sei.
Ich bin jedenfalls total happy, dass es jetzt funktioniert :)
 

madmaurice

Jamba
Registriert
05.03.11
Beiträge
59
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.
 

Mini-Leopard

Rhode Island Greening
Registriert
20.03.08
Beiträge
476
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