繁体   English   中英

循环和setTimeout问题的Javascript

[英]Javascript for loop and setTimeout issue

因此,我认为下面的代码确实很简单,但是却变得很头疼。 它应该是一个循环,它将改变和对象的不透明度,从而使其消失。

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,并且已经由WRITE 2上的打印声明确认。

我想知道为什么会这样以及如何解决。 我相信这与在循环结束后执行方法调用的setTimeout调用有关,但是如果是这样,那么为什么将值传递给setOpacity递增呢?

任何帮助深表感谢。

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

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

结果是,它们会根据时序以相反的顺序被调用。 因此,最后一次调用将在0ms(函数完成后)内执行,结果为0为hmm ,后跟1,2,3 ...

要解决此问题,您需要将100*i更改为100 * (10 - i)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM