javascript定时循环w / setTimeout不工作

时间:2012-02-24 19:33:40

标签: javascript loops timer

我正在尝试编写一个脚本来每秒更新一次iframe。这是我到目前为止,由于某种原因它加载了一段时间,然后显示数字14541 +/- 50左右。 “东西”和“其他东西”这两个词也从未出现在屏幕上。

是否因为某些内置的浏览器防范无限循环或某事而停在14541?为什么定时器无法正常工作?

var c = 0;
var t;
timer();
document.write("something");
function timer(){
    if(t) { window.clearTimeout(t) }
    update_preview();
    c++;
    t=setTimeout(timer(), 1000);
    document.write("something else");
}
function update_preview(){
    prev = window.open("","preview");
    prev.document.open();
    prev.document.writeln("<html><head><title>live preview window</title></head><body>");
    prev.document.writeln(c);
    prev.document.writeln("</body></html>");
    prev.document.close();
}

6 个答案:

答案 0 :(得分:1)

使用此,

t=setTimeout(function(){timer();}, 1000);

t=setTimeout(timer, 1000);

t=setTimeout("timer()", 1000);

最后一个是不应使用的选项。

答案 1 :(得分:0)

删除()之后的timer

通过添加timer(),您立即调用timer函数并指定返回值undefined,因为您没有return该函数中的任何内容)是计时器用完时执行的函数。

相反,你应该放timer。这会将函数本身而不是其返回值传递给定时器用完时调用的函数。

另外,为清楚起见,我建议将function timer() {...}放在初始调用之前timer()。 JavaScript会自动为您执行此操作(称为“提升”),但如果您自己首先放置函数定义,则更容易理解。

答案 2 :(得分:0)

在这一行t=setTimeout(timer(), 1000);上,您没有将timer传递给setTimout,而是传递timer的结果。您应该使用t=setTimeout(timer, 1000);代替。

答案 3 :(得分:0)

您不能将方法计时器作为功能计时器的参数调用。您必须作为参数函数计时器传递:

的setTimeout(定时器,1000);

不要使用document.write已过时。查看DOM和jQuery,以便动态地操作页面。

答案 4 :(得分:0)

“其他东西”未显示的原因是因为当您调用setTimeout并传入函数时,timer函数会立即处理。在函数内部也发生了同样的事情。因此,您正在创建一个非终止无限递归循环,这将使您的浏览器无响应。

由于每次运行setTimeout函数(每1秒)而不是timer运行timer时,setTimeout运行setInterval,您应该{ {1}}。

所以你的代码看起来像这样:

var c = 0;
var t;
timer();

// call setInterval here to run the timer function every 1 second
t=setInterval('timer()', 1000);

document.write("something");
function timer(){
    if(t) { window.clearTimeout(t) }
    update_preview();
    c++;
    document.write("something else");
}
function update_preview(){
    prev = window.open("","preview");
    prev.document.open();
    prev.document.writeln("<html><head><title>live preview window</title></head><body>");
    prev.document.writeln(c);
    prev.document.writeln("</body></html>");
    prev.document.close();
}

所以现在不是每隔1秒运行一次setTimeout,而是运行setInterval一次,它将每1秒处理一次。

答案 5 :(得分:0)

最好使用setInterval而不是setTimeout。