2011-06-21 110 views
0

所以我认为下面的代码将非常简单,但已成为一个很头痛的问题。它应该是一个循环,它会改变对象的不透明度并使其消失。JavaScript for循环和setTimeout问题

function doSomething() 
{ 
    var i = 10; 
    for(i = 10; i >=0; i = i - 1) 
    { 
     setTimeout("setOpacity('t1',"+ i +")", 100*i); 
     WRITE 1 
    } 
} 

function setOpacity(elem, hmm) 
{ 
    WRITE 2 
    document.getElementById(elem).style.opacity = (10 - hmm)/10; 
    document.getElementById(elem).style.filter = 'alpha(opacity=' + (10 - hmm)*10 + ')'; 
} 

所以问题是,for循环从10倒数到0,这已经由位于WRITE 1.然而,在接收数字的setOpacity方法打印声明证实是从0开始计数到10,这已经通过打印语句在写入2确认。

我想知道为什么会发生这种情况以及如何修复它。我相信这跟在循环结束后执行方法调用的setTimeout调用有关,但是如果是这样,那么为什么值传递给setOpacity递增?

任何帮助,非常感谢。

+0

我不看不出是什么问题,它的工作方式应该如何。如果它首先执行10 - 0,则会淡入元素。 –

+0

啊,是的,截至目前,它正在工作,因为我实施的工作。如果你查看setOpacity函数,我从10中减去hmm,这样数字就是我想要的值。但是这并不能改变数字没有被正确传递的事实。解决方法给了我正确的功能,但我有兴趣在实现此代码时没有解决方法。 –

+1

帮你一个忙 - 使用[jQuery](http://docs.jquery.com/Downloading_jQuery) - 它有['fadeIn()'](http://api.jquery.com/fadeIn/)/ [' fadeOut()'](http://api.jquery.com/fadeOut/) - 其他有用的东西 – mkilmanas

回答

3

传递给setOpacity的值正在增加,因为您正在传递不同的超时。您的循环的结果基本上如下:

setTimeout("setOpacity('t1', '10')", 1000) 
setTimeout("setOpacity('t1', '9')", 900) 
setTimeout("setOpacity('t1', '8')", 800) 
.... 
setTimeout("setOpacity('t1', '0')", 0) 

结果是,它们是以相反的顺序根据时间调用的。所以,最后的呼叫会在0毫秒(函数结束后)执行,导致0作为hmm,其次是1,2,3 ...

要解决这个问题,你需要改变100*i100 * (10 - i)

+0

是的,你和凯尔都有正确的答案。感谢您的帮助 –