JavaScript中的循环计时器

Mar*_*que 70 javascript jquery

我需要执行一段JavaScript代码,每个2000毫秒.

setTimeout('moveItem()',2000)
Run Code Online (Sandbox Code Playgroud)

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

所以在我的moveItem函数里面我有:

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

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

Mig*_*ura 185

请注意,setTimeoutsetInterval有很大的不同的功能:

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

这两个函数都返回一个计时器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);
}
Run Code Online (Sandbox Code Playgroud)

要么

// 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);
}
Run Code Online (Sandbox Code Playgroud)

两者都是实现同样目标的非常常见的方法.

  • 你让我明白了`setTimeout`和`setInterval`,感谢@Miguel Ventura (2认同)

Mat*_*all 6

setInterval(moveItem, 2000);
Run Code Online (Sandbox Code Playgroud)

是每2秒执行一次功能方法moveItem.您的代码中的主要问题是您在setInterval回调内部而不是在回调之外进行调用.如果我理解你要做什么,你可以使用这个:

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

setInterval(moveItem, 2000);
Run Code Online (Sandbox Code Playgroud)

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