Яваскрипт. цикл с innerHTML не обновляется во время выполнения цикла
Я пытаюсь обновить div из Javascript в каждом цикле и увидеть 1, 2, 3,.... Следующий код работает, но выводит только конечный результат (9998). Как можно отобразить все шаги? Заранее спасибо.
<html>
<head>
</head>
<body>
<div id="cadre" style="width=100%;height=100%;">
<input type="button" value="Executer" onclick="launch();"/>
<div id="result" ></div>
</div>
<script type="text/javascript">
function launch(){
for (inc=0;inc<9999;inc++){
document.getElementById('result').innerHTML = inc;
}
}
</script>
</body>
</html>
3 ответов
var i = 0;
function launch(){
var timer = window.setInterval(function(){
if( i == 9999 ){
window.clearInterval( timer );
}
document.getElementById('result').innerHTML = i++;
}, 100);
}
launch();
выполнение JavaScript и рендеринг страницы выполняются в одном потоке выполнения, что означает, что во время выполнения кода браузер не будет перерисовывать страницу. (Хотя даже если бы он перерисовывал страницу с каждой итерацией цикла for, все это было бы так быстро, что у вас не было бы времени, чтобы увидеть отдельные номера.)
вместо этого вы хотите использовать setTimeout()
или setInterval()
функции (оба метода via setTimeout()
- это очень распространенное метод.
и setTimeout()
и setInterval()
возвращает идентификатор, который по сути является ссылкой на таймер, который был установлен, который вы можете использовать с clearTimeout()
и clearInterval()
чтобы отменить любое выполнение в очереди, которое еще не произошло, поэтому другой способ реализации вашей функции заключается в следующем:
function launch() {
var inc = 0,
max = 9999;
delay = 100; // 100 milliseconds
var iID = setInterval(function() {
document.getElementById('result').innerHTML = inc;
if (++inc >= max)
clearInterval(iID);
},
delay);
}
очевидно, вы можете варьировать delay
по мере необходимости. И обратите внимание, что в обоих случаях inc
переменная должна быть определена вне функции, выполняемой таймером, но благодаря магии замыканий мы можем определить, что внутри launch()
: нам не нужны глобальные переменные.