JavaScript中的循环计时器

时间:2010-01-25 15:11:04

标签: javascript jquery

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

setTimeout('moveItem()',2000)

以上将在2000毫秒后执行一个函数,但不会再执行它。

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

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

这不起作用,因为我想执行触发器单击jQuery一段代码,每个间隔2000毫秒,但是现在它一直被调用,脚本需要被中断。除此之外,我觉得这是非常差的质量编码......你们怎么解决这个问题?

6 个答案:

答案 0 :(得分:182)

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

  • setTimeout将在超时后执行代码
  • setInterval将以提供的超时间隔执行代码 forever

两个函数都返回计时器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);
}

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

答案 1 :(得分:6)

setInterval(moveItem, 2000);

是每隔2秒执行函数moveItem 方式。您的代码中的主要问题是您在回调内部而不是在回调之外调用setInterval。如果我理解你想要做什么,你可以使用它:

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

setInterval(moveItem, 2000);

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

答案 2 :(得分:2)

我相信您正在寻找setInterval()

答案 3 :(得分:2)

应该是:

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

setInterval(f, t)每隔f毫秒调用一次参数函数t

答案 4 :(得分: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>

小提琴: DEMO

答案 5 :(得分:-2)

你应该尝试这样的事情:

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

这意味着你必须创建一个函数来执行你需要做的事情,并确保它会以你喜欢的间隔调用自己。在你的身体onload中第一次调用这个函数:

<body onload="update()">