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

Beitrag lesen

Hallo XodoX,

<script type="text/javascript">

function rand(min,max)
{
var wert =  min + Math.ceil(Math.random() * 1000) % (max-min) + 1;
return wert;
}

Zunächst mal: Diese Implementierung ist nicht sehr elegant, sie funktioniert ja nur halbwegs, wenn (max-min) << 1000 ist.
Wenn (max - min) kein Teiler von 1000 ist, treten ja nicht alle Reste gleich häufig auf. Bei kleinen Zahlen wirkt sich das nicht so aus, aber wenn man Beispielsweise (max - min) == 400 hat, so kommen die Reste 0 bis 199  ja 3 und die anderen 2 mal auf.

Besser ist sowas:
[code lang=javascript]
function randInt(min, max) {
  return Math.ceil(min + Math.random() * (max - min));
}

  

> function asb\_loadingEnd()  
> {  
>  document.getElementById("asb\_loading").innerHTML='normal';  
> }  
>   
> function loadData()  
> {  
>  document.getElementById("asb\_loading")  
>  setTimeout('asb\_loadingEnd();',rand(5,35)\*100);  
> }  
  

> Wie erreiche ich das am elegantesten?  

Zunächst mal musst Du das gewünschte Verhalten unabhängig vom konkreten Objekt formulieren:  
~~~javascript
  
function setLoading(elem) {  
  elem.innerHTML = 'normal';  
  setTimeout(function() {setNormal(elem)}, randInt(1000, 30000));  
}  
  
function setNormal(elem) {  
  elem.innerHTML='<img src=\"loading.gif\">';  
  setTimeout(function(setLoading(elem)) {}, randInt(1000, 30000));  
}  

Dann musst Du das nur noch für jedes Element anstoßen:

  
window.onload = function() {  
  var ids = new Array("foo", "bar", "baz");  
  for (var i = 0; i < ids.length; ++i) {  
    setNormal(document.getElementById(ids[i]));  
  }  
};  

Das ist alles ungetestet, kann also noch ein paar Flüchtigkeitsfehler enthalten.

Grüße

Daniel