日期:2014-05-16  浏览次数:20419 次

JavaScript中setInterval不能正确延时?
新手初探JavaScript,想用setInterval配合HTML5的canvas标签来将一些表格以动画形式显示出来,这个是背景。
if(timer<=200)
{
setInterval(showcolumns(),1000);
timer++;
}
理论上讲,这个循环执行完成需要200秒,但是我用Chrome打开他时瞬间就显示到最后一个效果了(也就是timer=200时的效果)。
但是呢,如果我把代码添加一行弹窗:
if(timer<=200)
{
alert(timer);
setInterval(showcolumns(),1000);
timer++;
}
就能看到一帧一帧的效果。
请问这是什么问题导致的?我应该用怎样的方法来实现同样的效果呢?
------解决方案--------------------
首先js是单线程的,定时器做的事是阻塞线程,以达到延时的目的。
出现这种情况的关键点是,定时器只对定时的这个方法有效,包含在这个方法体外的js还是会照样执行。
这样就是形成N个定时器排队的情况。
你可以将这个循环都写入定时器,才能达到你要的效果。
------解决方案--------------------

if和for循环在执行过程中会阻塞浏览器的渲染。而setTimeout和setInterval则正是解决这个阻塞问题的方法。
如:

        //这样只看到最后结果
for(var i=0;i<1000;i++){
document.getElementsByTagName('div')[0].innerHTML=i
}

        //这样则能看到数字的变化(原因就在于每隔一段时间执行一次循环体,而不是像上面一样不间断连续执行)
       //(1)用setInterval
var i=0;
function foo(){
     if(i<1000){
         document.getElementsByTagName('div')[0].innerHTML=i;
 i++;
      }
};
        setInterval(foo,100)
       //(1)用setTimeout
var i=0;
function foo(){
     if(i<1000){
         document.getElementsByTagName('div')[0].innerHTML=i;
 i++;
                 setTimeout(foo,100)
      }
};
        setTimeout(foo,100)



PS:延时建议用setTimeout.
setInterval和setTimeout在延时机制上是不同的,在程序比较复杂的时候   setInterval在无法保证定时器的准确性。两者具体的区别楼主可以自行google一下。
------解决方案--------------------
setInterval(showcolumns,1000);

即可。
setInterval、setTimeout的第一个参数是个function,你写的showcolumns()会立即执行的。
------解决方案--------------------
19L正解。
------解决方案--------------------
19L说的对,我怎么觉得就是你逻辑写错了啊
------解决方案--------------------
setInterval("showcolumns()",1000);
------解决方案--------------------
window.setInterval("a()","5000")这个写在被调用方法的外边,第一个参数也是字符串, 第二个参数要是字符串 。
setTimeout("a()",2000)这个必须写在方法内,自己调用自己,第二个参数是整数 。


------解决方案--------------------
双引号没加,!!