Camping_RIDER: setInterval

Beitrag lesen

Aloha ;)

function start(endlaenge) {
   code wird bearbeitet
   laenge = laenge + 1;
   if(laenge >= endlaenge) {
       window.clearInterval(interval);
       }
   }

function {
   var laenge = 0;
   interval = window.setInterval(function() { start(100); }, 50);
   var laenge = 0;
   interval = window.setInterval(function() { start(500); }, 50);
   }

  
Du scheinst hier grundsätzlich etwas falsch verstanden zu haben. In deiner Intervallfunktion start willst du auf laenge zugreifen, das in der zweiten Funktion (warum hat diese eigentlich keinen Namen oder Parameterklammern? Wahrscheinlich ein Tippfehler) als laenge = 0 definiert wurde. Das kann so nicht funktionieren. laenge = 0 ist im Scope der zweiten Funktion, die Funktion start 'kennt' diese nicht. Dir wird auch auffallen, dass die Variable interval aus dem selben Grund gar nicht definiert ist. Du musst also insgesamt was am Funktionsdesign ändern.  
  
Möglichkeit 1: globale Variablen  
  
~~~javascript
  
function start(endlaenge,index) {  
   *code wird bearbeitet*  
   laengen[index] = laengen[index] + 1;  
   if(laengen[index] >= endlaenge) {  
       window.clearInterval(intervals[index]);  
       }  
   }  
  
var laengen = [];  
var intervals = [];  
  
function blabla() {  
   laengen[laengen.length] = 0;  
   intervals[laengen.length-1] = window.setInterval(function() { start(100,laengen.length-1); }, 50);  
   laengen[laengen.length] = 0;  
   intervals[laengen.length-1] = window.setInterval(function() { start(500,laengen.length-1); }, 50);  
   }  
  
blabla();  

Möglichkeit 2: setTimeout - würde ich deutlich bevorzugen

  
function start(laenge,endlaenge,step) {  
   *code wird bearbeitet*  
   laenge = laenge + 1;  
   if(laenge < endlaenge) {  
       window.setTimeout(function() { start(laenge,endlaenge,step); },step);  
   }  
  
function blabla() {  
   window.setTimeout(function() { start(0,100,50); }, 50);  
   window.setTimeout(function() { start(0,500,50); }, 50);  
   }  
  
blabla();  

Noch ein paar Worte zu Argumenten innerhalb anonymer Funktionen in window.setTimeout...

Hier habe ich das so gelöst:

window.setTimeout(function() { start(laenge,endlaenge,step); },step);

Das ist dann problematisch, wenn laenge, endlaenge oder step nach Aufruf von setTimeout geändert würden. Hier werden nämlich die aktuellsten Werte übergeben. Es gibt zwei andere, teils nicht weniger problematische Möglichkeiten.

window.setTimeout("start("+laenge+","+endlaenge+","+step+")",step);

Da du nur Zahlen übergibst, ist auch das eine Möglichkeit, die die o.g. Nachteile nicht hat. Du solltest dann aber vor jedem Aufruf prüfen, ob laenge, endlaenge und step tatsächlich Zahlen sind. Ansonsten besteht die potenzielle Gefahr einer Code-Injection. (Die aber auch vernachlässigbar wäre, da JavaScript per Konsole sowieso jederzeit ausführbar ist). Der tatsächliche Problemfaktor ist hier die Performance, da die per String übergebene Funktion intern zunächst mit eval ausgewertet werden muss.

window.setTimeout(start,step,laenge,endlaenge,step);

Das ist bei weitem die beste (und modernste) Möglichkeit. Ohne bisher genannte Nachteile. Jetzt kommt das große Aber: es funktioniert im IE erst ab Version 10. Da IE 10 für Vista leider nicht verfügbar ist, werden wir damit wohl warten müssen, bis Microsoft den Support für Vista einstellt.

Grüße,

RIDER

--
Camping_RIDER a.k.a. Riders Flame a.k.a. Janosch Zoller
ch:? rl:| br:> n4:? ie:% mo:| va:) js:) de:> zu:) fl:( ss:| ls:[