Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/413.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript定时器-如何防止定时器每次都加速。单击deck?_Javascript_Jquery - Fatal编程技术网

Javascript定时器-如何防止定时器每次都加速。单击deck?

Javascript定时器-如何防止定时器每次都加速。单击deck?,javascript,jquery,Javascript,Jquery,我正在制作一个记忆卡游戏。class.deck代表一副牌。每次我点击一张卡片,计时器就会加速。如何防止计时器加速 function startTimer() { $(".deck").on("click", function () { nowTime = setInterval(function () { $timer.text(`${second}`) second = second + 1 }, 100

我正在制作一个记忆卡游戏。class.deck代表一副牌。每次我点击一张卡片,计时器就会加速。如何防止计时器加速

function startTimer() { 
    $(".deck").on("click", function () {
        nowTime = setInterval(function () {
            $timer.text(`${second}`)
            second = second + 1
        }, 1000);
    });
}

在启动新的计时器之前,您需要停止上一个计时器,因为如果不停止,则会出现多个计时器回调函数,所有这些函数都会一个接一个地执行,这会让人产生一种错觉,即您的单个计时器正在加速

function startTimer() { 
  $(".deck").on("click", function () {
    clearInterval(nowTime);  // Stop previous timer

    nowTime = setInterval(function () {
      $timer.text(`${second}`);
      second = second + 1;
    }, 1000);
  });
}
另一种处理方法是只允许在第一次单击按钮时运行
单击
事件回调:

function startTimer() { 
  $(".deck").on("click", timer);

  function timer() {
    nowTime = setInterval(function () {
      $timer.text(`${second}`);
      second = second + 1;
    }, 1000);
   $(".deck").off("click", timer); // Remove the click event handler
  }

}
function startTimer() {
    // Maybe remove old timer? Should happen somewhere in your code.
    // Possibly "stopTimer" if you have such a function.
    clearInterval(nowTime);

    let started = false;
    $(".deck").on("click", function () {
        if (started) return;

        nowTime = setInterval(function () {
            $timer.text(`${second}`)
            second = second + 1
        }, 1000);
        started = true;
    });
}

您可以启动多个间隔,每次单击一次。你也许应该开始一个。如果要为单击的第一张卡启动它:

function startTimer() { 
  $(".deck").on("click", timer);

  function timer() {
    nowTime = setInterval(function () {
      $timer.text(`${second}`);
      second = second + 1;
    }, 1000);
   $(".deck").off("click", timer); // Remove the click event handler
  }

}
function startTimer() {
    // Maybe remove old timer? Should happen somewhere in your code.
    // Possibly "stopTimer" if you have such a function.
    clearInterval(nowTime);

    let started = false;
    $(".deck").on("click", function () {
        if (started) return;

        nowTime = setInterval(function () {
            $timer.text(`${second}`)
            second = second + 1
        }, 1000);
        started = true;
    });
}
不过,这些代码应该有更多的清理。否则会积累大量死掉的事件侦听器


(此外,我认为永远不应该使用jQuery。)

它没有加速。每次单击都会启动一个新计时器,它们都在后台运行。你想做什么?我只想让一个计时器在用户点击一张牌时启动,并在点击更多的牌时让计时器继续正常计数。
clearInterval()
调用使
started
代码不相关。@ScottMarcus:No.
clearInterval
是最后一场“游戏”。虽然它可能属于另一个功能
started
存在,因此只有一个按钮启动计时器,否则许多同步计时器的原始问题仍然存在。哦,对不起,您的
clearInterval
单击事件之外。我没注意到,有道理。谢谢实际上,我不推荐第一种方法。它缩短了时间间隔并开始了新的时间间隔,导致时间不准确。@H.B.明白,但它回答了这个问题。而且,延迟可以/应该被减少,因为即使只有一个计时器,1000毫秒也会偶尔导致跳过一秒。为什么会跳过一秒?你能详细说明一下吗?延迟只是计时器“可能”运行的最短时间。这不是确切的保证。如果将其设置为1秒,很可能延迟超过1秒。所以,如果时间是0.95秒,延迟是1.06秒,你会错过1秒,直接跳到2秒。设置较小的延迟(比如200ms)可以减少(但不能消除)这种可能性。这与显示OP正在执行的时间有关。@ScottMarcus:您有这方面的来源吗?我希望回调在经过一段时间后尽快执行,即被推送到事件队列,并在轮到它时立即运行。