Daniel Thoma: Javascript-Problem / Elegante Lösung?

Beitrag lesen

Hallo XodoX,

funktioniert nicht, kommt Memory-Fehler.

Was soll ein Memory-Fehler sein? Es ist aber tatsächlich ein Syntaxfehler drin. So tut es (getestet):

  
  setTimeout(function() {setNormal(elem)}, randInt(1000, 5000));  
}  
  
function setNormal(elem) {  
  elem.innerHTML='loading';  
  setTimeout(function() {setLoading(elem)}, randInt(1000, 5000));  
}  
  
  
window.onload = function() {  
  var ids = new Array("id1", "id2", "id3");  
  for (var i = 0; i < ids.length; ++i) {  
    setNormal(document.getElementById(ids[i]));  
  }  
};  
  
</script>  
</head>  
<body>  
<p id="id1"></p>  
<p id="id2"></p>  
<p id="id3"></p>  
</body>  
</html>  

Aber der Ansatz ist gut, hab mal selbst was zusammengebastelt:
setInterval("setLoading(ids[i])",rand(1000,2000));

setTimeout(function() {setLoading(elem)}, randInt(1000, 5000));
Siehst Du den Unterschied?
Du übergibst einen String ("setLoading(ids[i])"). Wenn der ausgeführt wird, sind die Variablen ids und i nicht mehr vorhanden.
Ich übergebe eine (annonyme) Funktion. Da erkennt der Interpreter, dass ich da lokale Variablen verwende und löscht diese nicht.

Der nächste Fehler ist, dass Du direkt eine Zählervariable einer Schleife verwendest. Diese ändert ja ihren Wert, bevor der Code ausgeführt wird.
Da es in Javascript zudem keine wirklich lokalen variablen in Schleifen gibt, müsstest Du so etwas machen:

window.onload = function() {
  var ids = new Array("te", "sa", "band");
  for (var i = 0; i < ids.length; ++i) {
    function() {
      var temp = i;
      setInterval(function() {setLoading(ids[temp])},rand(1000,2000));
    }();
  }
};

Grüße

Daniel