【问题标题】:Loop timer in JavaScriptJavaScript 中的循环计时器
【发布时间】:2010-01-25 15:11:03
【问题描述】:

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

setTimeout('moveItem()',2000)

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

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

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

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

【问题讨论】:

  • 什么时候必须中断脚本?
  • 嗨,我永远不会打扰它。

标签: javascript jquery


【解决方案1】:

注意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);
}

// 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);
}

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

【讨论】:

  • 选择第一个。它更好。只需让超时函数为其自身创建一个新的超时调用。
  • 你让我在setTimeoutsetInterval 之间理解得很清楚,谢谢@Miguel Ventura
  • @a432511 他们似乎与我略有不同,但我不确定实施。在 setInterval 中,它是在开始还是结束时启动计时器?如果它在最后启动计时器,则真正的延迟是给定的延迟 + 执行代码的时间。我认为 setInterval 对您提供的延迟会更准确。
【解决方案2】:
setInterval(moveItem, 2000);

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

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

setInterval(moveItem, 2000);

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

【讨论】:

    【解决方案3】:

    相信你在找setInterval()

    【讨论】:

      【解决方案4】:

      应该是:

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

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

      【讨论】:

        【解决方案5】:

        这里是带有 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

        【讨论】:

          【解决方案6】:

          你应该试试这样的:

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

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

          <body onload="update()">
          

          【讨论】:

          • 代码已损坏。您将 undefined 传递给 setInterval 并在没有任何暂停的情况下永远递归调用 update()。 (提示:update() 的返回值就是您在此处传递给 setInterval 的值)
          • -1 每次调用此函数时都会创建一个新的重复间隔.. 它完全错误.. 并且有同样的问题 OP 正在寻求帮助..
          猜你喜欢
          • 1970-01-01
          • 2020-05-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-04-12
          • 2011-07-29
          相关资源
          最近更新 更多