JavaScript для проблемы цикла и setTimeout - PullRequest
0 голосов
/ 21 июня 2011

Так что я подумал, что следующий код будет действительно простым, но стал большой головной болью.Это должен быть цикл, который изменит непрозрачность объекта и объекта так, чтобы он исчезал.

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, и это было подтвержденооператор print находится в WRITE 1. Однако в методе setOpacity полученные числа начинаются с 0 и считаются до 10, и это было подтверждено оператором print в WRITE 2.

Я хотел бы знать, почему этопроисходит и как я могу это исправить.Я считаю, что это как-то связано с вызовом setTimeout, выполняющим вызов метода после окончания цикла, но если это так, то почему значения передаются в приращение setOpacity?

Любая помощь очень ценится.

1 Ответ

3 голосов
/ 21 июня 2011

Значения, передаваемые в 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 * (10 - i)

...