下面的代码执行开始按钮好像运行了30秒钟才弹出对框(时间到),setTimeout函数默认1不是代表1毫秒吗?
而1000毫秒=1秒,所以3000毫秒应当是3秒啊?不知道哪里出错,请大家批评指正。

<input type="text" value="3000" id="t" /><input type="button" value="开始" onclick="ks()">
<script language="javascript">
var obj = document.getElementById("t");
function ks()
{
setTimeout(function()
{
if(parseInt(obj.value) >0)
{
obj.value = parseInt(obj.value)-1;
setTimeout(arguments.callee,1);
}
else
{
alert("时间到");
}
},1);
}
</script>

解决方案 »

  1.   

    这个好像是跟浏览器和系统响应的精确级别有关,据说windows现在最多能精确到15毫秒左右的!所以这个值最好设置成20毫秒以上。帮你在谷歌最新版里测试了下,如果设置成20毫秒,基本就比较精确了!
      

  2.   

    在chrome下测试了下,楼主的代码执行3000次的时间平均是15030ms。我们近似看成15000ms。
    那么可以算出每5ms执行一次。那么改为5ms一次,一次减5,预期是3秒。
    测试后通过。
    总结:win7系统。chrome浏览器下的时间精确是5ms
      

  3.   

    另外。。为嘛搞两个setTimeout。一个就行了嘛
      

  4.   


    为了递归啊,不想用setInterval 哈哈
      

  5.   

    a(累加1)*3000*1首先你的代码逻辑是执行累加1 然后1毫秒后继续调用
    代码执行 代码的调用开销 还有系统调度 都有时间的 实际只是保证 至少在1毫秒后 执行 你的代码但是 桌面浏览器最小调度开销至少是 10  
    移动设备至少是 12用settime精确到1毫秒级别是没意义的更精确计算时间过渡  只有用时间差
      

  6.   

    浏览器的timer没那么高的精度的,好像是4ms以上, 参考 Nicholas C. Zakas的文章Timer resolution in browsers
    http://www.nczonline.net/blog/2011/12/14/timer-resolution-in-browsers/也可以在线测试一下
    http://jsfiddle.net/rgrove/rQtUU/embedded/result/
      

  7.   


    为了递归啊,不想用setInterval 哈哈一个setTimeout就可以递归了.最外面那个可以去掉的.不信你试试
      

  8.   

    因为js是单线程的,所以setTimeout不能保证一定就是多少毫秒,只能说是尽快执行,当然要前面的执行结束。
      

  9.   


    为了递归啊,不想用setInterval 哈哈一个setTimeout就可以递归了.最外面那个可以去掉的.不信你试试
    +1