JavaScript中的循环计时器


73

我需要每2000毫秒执行一段JavaScript代码。

setTimeout('moveItem()',2000)

上面的代码将在2000毫秒后执行一个函数,但不会再次执行。

所以在我的moveItem函数中,我有:

function moveItem() {
    jQuery(".stripTransmitter ul li a").trigger('click');
    setInterval('moverItem()',2000);
}

这是行不通的,因为我想每隔2000毫秒执行一次触发器单击jQuery代码,但是现在一直在调用它,并且脚本需要中断。除此之外,我觉得这是非常糟糕的编码质量……你们将如何解决?


何时必须中断脚本?
Natrium 2010年

1
嗨,我永远不会打扰它。
Marcos Buarque 2010年

Answers:


192

请注意,setTimeoutsetInterval是非常不同的功能:

  • setTimeout超时后将执行一次代码。
  • setInterval将在提供的超时间隔内永久执行代码。

这两个函数都返回一个计时器ID,您可以使用该ID终止超时。您要做的就是将该值存储在变量中,并将其分别用作clearTimeout(tid)或的参数clearInterval(tid)

因此,根据您要执行的操作,您有两个有效的选择:

// set timeout
var tid = setTimeout(mycode, 2000);
function mycode() {
  // do some stuff...
  tid = setTimeout(mycode, 2000); // repeat myself
}
function abortTimer() { // to be called when you want to stop the timer
  clearTimeout(tid);
}

要么

// set interval
var tid = setInterval(mycode, 2000);
function mycode() {
  // do some stuff...
  // no need to recall the function (it's an interval, it'll loop forever)
}
function abortTimer() { // to be called when you want to stop the timer
  clearInterval(tid);
}

两者都是实现相同目标的非常常见的方式。


与第一个一起去。更好 只需让超时功能为其自身创建一个新的超时调用即可。
a432511 2010年

2
您显然让我明白了setTimeout和之间的关系setInterval ,谢谢@Miguel Ventura
Frank Myat Thu

@ a432511它们对我来说似乎略有不同,但是我不确定实现方式。在setInterval中,它是在开始还是结束时启动计时器?如果它在最后启动计时器,则实际延迟是给定的延迟+执行代码的时间。我认为setInterval对于您提供的延迟会更准确。
Cruncher

6
setInterval(moveItem, 2000);

是每2秒执行一次功能方式moveItem。代码中的主要问题是您是setInterval在回调内部而不是外部进行调用。如果我了解您要执行的操作,则可以使用以下方法:

function moveItem() {
    jQuery('.stripTransmitter ul li a').trigger('click');
}

setInterval(moveItem, 2000);

注意:不要将字符串传递给setTimeoutsetInterval-最佳做法是传递匿名函数或函数标识符(如我上面所述)。另外,请注意不要混用单引号和双引号。选择一个并坚持下去。



2

它应该是:

function moveItem() {
  jQuery(".stripTransmitter ul li a").trigger('click');
}
setInterval(moveItem,2000);

setInterval(f, t)ft毫秒调用一次参数函数。


0

这里有带有html代码的自动循环功能。我希望这对某人可能有用。

<!DOCTYPE html>
<html>
<head>
<style>
div {
position: relative;
background-color: #abc;
width: 40px;
height: 40px;
float: left;
margin: 5px;
}
</style>
<script src="http://code.jquery.com/jquery-latest.js"></script>
</head>
<body>
<p><button id="go">Run »</button></p>
<div class="block"></div>
<script>

function test() {
$(".block").animate({left: "+=50", opacity: 1}, 500 );
   setTimeout(mycode, 2000);
};
$( "#go" ).click(function(){
test();
});
</script>
</body>
</html>

小提琴:演示


-2

您应该尝试这样的事情:

 function update(){
    i++;
    document.getElementById('tekst').innerHTML = i;
    setInterval(update(),1000);
    }

这意味着您必须创建一个函数,在其中您需要做的事情,并确保它会以您喜欢的间隔调用自身。在您的体内onload首次调用该函数,如下所示:

<body onload="update()">

1
代码已损坏。您将传递undefined给setInterval并update()永久递归调用而不会暂停。(提示:update()的返回值是您传递给setInterval的值)
slebetman 2010年

1
-1您每次调用此函数时都会创建一个新的重复间隔..它的纯错误..并具有与OP寻求帮助相同的问题..
Gabriele Petrioli 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.