javascript - setInterval 触发过于频繁 (Javascript)

标签 javascript jquery setinterval

我一直在尝试为一个网站编写一个简单的倒计时器代码(请看这里:sbtimescore.github.io)。不幸的是,我遇到了一个逻辑错误,我有限的知识无法解决(我是新手)。当重复按下开始/暂停时,计时器开始加速。我已经在下面发布了运行 onclick() 的代码:

function spGameClock() {
  if (gameClockRunning == false) {
    gameClockRunning = true;
  } else {
    gameClockRunning = false;
    return;
  }

  function timer() {
    if (gameCounter == 0) {
      clearInterval(interval);
      $("#GameClockText").html(secondsToText(gameCounter));
      blinkIt("GameClockBox");
    } else if (gameCounter > 0 && gameClockRunning == true) {
      $("#GameClockText").html(secondsToText(gameCounter));
      gameCounter = gameCounter - 1;
    } else if (gameCounter > 0 && gameClockRunning == false) {
      clearInterval(interval);
    } else {}
  }

  var interval = setInterval(timer, 1000);
}

我知道间隔被调用太多次,但我不知道如何修复它。如果有人有解决方案,我将不胜感激。

最佳答案

您应该将 interval 定义为 spGameClock 函数外部的变量。一个好的地方是在 jQuery ready 回调中。然后,您还可以使用该变量本身来确定时钟是否在滴答作响。

这是使用 countdownjs 的实现:

$(function () {    
    var interval = null, // define outside of spGameClock scope
        gameCounter = 10; // Some initial value

    function spGameClock() {
      // Use interval as detection:
      if (interval == null) {
        interval = setInterval(timer, 1000);
        $("#GameClockText").text(secondsToText(gameCounter));
      } else {
        clearInterval(interval);
        interval = null; // Always set to null after clearing
        $("#GameClockText").text(secondsToText(gameCounter) + " (paused)");
      }

      function timer() {
        gameCounter--;
        $("#GameClockText").text(secondsToText(gameCounter));
        // No need to test interval for null here, since it certainly is not.
        if (gameCounter <= 0) {
          clearInterval(interval);
          interval = null;
          blinkIt("GameClockBox");
        }
      }
    }

    // Attach event handler here instead of using onclick attribute
    $("#toggle").click(spGameClock);
    // Start clock now
    spGameClock();

    // Utility functions:
    function secondsToText(sec) { // Uses countdown library:
        return countdown(new Date().getTime() + 1000*sec).toString() || "Game Over!";
    }

    function blinkIt(id) {
        (function loop(times) {
            if (times) $('#' + id).fadeToggle(400, loop.bind(null, times-1));
        })(6);
    }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/countdown/2.6.0/countdown.min.js"></script>
<button type="button" id="toggle">Pause/Continue</button>

<div id="GameClockBox">
    <div id="GameClockText"></div>
</div>

关于javascript - setInterval 触发过于频繁 (Javascript),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45177168/

相关文章:

javascript - 从表格或数据表导出到 Excel

javascript - 如何在pageunload上执行一个js函数

javascript - jQuery:在继续之前可以等待 $.get 完成加载吗?

javascript - 如何使用 jquery 选择下拉列表中的第一个元素?

javascript - Shadowbox.js 隐藏了我选择的输入

javascript - 如何一次滚动绘制每个 SVG 路径(按时间顺序)?

reactjs - 如何在 React 钩子(Hook)中自动停止 setInterval?

javascript - 为什么 setInterval() 中的参数始终不发送到函数?

javascript - JQuery .load with Setinveral,在刷新时它会重置某些功能并禁用它们

javascript - 沿着路径拖动 snap.svg