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.
Ergebnis 1 bis 9 von 9
- 07.03.2011, 07:34 #1Finkenwerder 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?!
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.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); }
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.
- 07.03.2011, 08:15 #2
- 07.03.2011, 09:27 #3
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)
- 07.03.2011, 14:49 #4Finkenwerder 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.
- 07.03.2011, 19:44 #5
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)
- 08.03.2011, 22:51 #6
- 08.03.2011, 22:57 #7Finkenwerder 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.
- 15.03.2011, 17:35 #8Jamba
- Registriert
- 03.2011
- Beiträge
- 57
möglich wäre auch sowas
sry, dass ich den code nicht eingerückt habe, aber er müsste verständlich sein.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); } }
- 15.03.2011, 18:38 #9Finkenwerder 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:
Ist super easy.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); } }
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
JuMini-Leo
You can only take what you can carry.


Zitieren



