循环setTimeout
我目前正试图围绕一些JavaScript。
我想要的是要在屏幕上打印的文本,然后计数到给定的数字,如下所示:
“测试”
[1秒。 暂停]
“1”
[1秒。 暂停]
“2”
[1秒。 暂停]
“3”
这是我的JS:
$(document).ready(function() { var initMessage = "Test"; var numberCount = 4; function count(){ writeNumber = $("#target"); setTimeout(function(){ writeNumber.html(initMessage); },1000); for (var i=1; i < numberCount; i++) { setTimeout(function(){ writeNumber.html(i.toString()); },1000+1000*i)}; }; count(); });
这是我的标记:
当我渲染页面时,我得到的只是“Test”,然后是“4”。
我不是JavaScript天才,所以解决方案可能相当容易。 任何关于错误的提示都受到高度赞赏。
你可以在这里玩我的例子: http : //jsfiddle.net/JSe3H/1/
你有一个可变范围问题。 循环内的计数器( i
)仅限于count
function。 当循环执行完毕时, i
的值为4.这会影响每个setTimeout
函数,这就是为什么你只看到“4”。
我会像这样重写它:
function createTimer(number, writeNumber) { setTimeout(function() { writeNumber.html(number.toString()); }, 1000 + 1000 * number) } function count(initMessage, numberCount) { var writeNumber = $("#target"); setTimeout(function() { writeNumber.html(initMessage); }, 1000); for (var i = 1; i < numberCount; i++) { createTimer(i, writeNumber); } } $(document).ready(function() { var initMessage = "Test"; var numberCount = 4; count(initMessage, numberCount); });
createTimer
函数确保使用createTimer
提供的新范围“捕获”循环内的变量。
更新示例: http : //jsfiddle.net/3wZEG/
另请查看以下相关问题:
- 引擎盖下发生了什么? 循环中的Javascript计时器
- 循环内的JavaScript闭包 - 简单实用的例子
在你的例子中,你说“从现在开始分别为2,3,4和5秒,写下i
的值”。 你的for循环将通过所有迭代,并且在前两秒之前很久就将i
的值设置为4。
您需要创建一个闭包,其中保留您要写入的值的值。 像这样的东西:
for(var i = 1; i < numberCount; i++) { setTimeout((function(x) { return function() { writeNumber.html(x.toString()); } })(i),1000+1000*i)}; }
另一种方法完全是这样的:
var i = 0; var numberCount = 4; // repeat this every 1000 ms var counter = window.setInterval(function() { writeNumber.html( (++i).toString() ); // when i = 4, stop repeating if(i == numberCount) window.clearInterval(counter); }, 1000);
希望这可以帮助:
var c = 0; var t; var timer_is_on = 0; function timedCount() { 。的document.getElementById( '目标')值= C; C = C + 1; T =的setTimeout( “timedCount()”,1000); } 函数doTimer() { if(!timer_is_on) { timer_is_on = 1; timedCount(); } }