如何停止 JavaScript 定时器?

How to stop JavaScript Timer?

我有一个简单的 Bootstrap 页面,其中包含一个 45 秒倒计时计时器和一个按钮,我打算稍后将其包含在一个更大的项目中。倒数计时器将在单击按钮时启动。

我想做的是,当我在 45 秒倒计时间隔内再次单击按钮时,计数器将重置。我做不到。我试图做的是在 errorTimer 函数的最开始使用 clearInterval 函数。但是,它没有用。

这是我的代码:

// Timer for error message - 45 seconds. 
function startTimer(duration, display) {
  var timer = duration,
    minutes, seconds;
  setInterval(function() {
    minutes = parseInt(timer / 60, 10)
    seconds = parseInt(timer % 60, 10);

    minutes = minutes < 10 ? "0" + minutes : minutes;
    seconds = seconds < 10 ? "0" + seconds : seconds;

    display.textContent = minutes + ":" + seconds;
    if (--timer < 0) {
      timer = duration;
    }
  }, 1000);
}

function errorTimer() {
  var fortyFiveSeconds = 60 * .75,
    display = document.querySelector('#time');
  startTimer(fortyFiveSeconds, display);
};
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.2.1/css/bootstrap.min.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.2.1/js/bootstrap.min.js"></script>


<div class="container-fluid">

  <div class="row">
    <div class="col-md-12 mt-5">&nbsp;</div>
  </div>
  <div class="row">
    <div class="col-md-4"></div>
    <div class="col-md-4 text-center">
      <p id="time"></p>
    </div>
    <div class="col-md-4"></div>
  </div>
</div>

<button type="button" class="btn btn-info" onclick="errorTimer()">Submit  Button</button>

如@Shidersz 所述,您需要存储与时间间隔关联的 ID,并在重置时钟之前使用该 ID 清除时间间隔。

// Timer for error message - 45 seconds. 
var id = null;

function startTimer(duration, display) {
  if (id !== null) {
    clearInterval(id);
    id = null;
  }

  var timer = duration,
    minutes, seconds;
  id = setInterval(function() {
    minutes = parseInt(timer / 60, 10)
    seconds = parseInt(timer % 60, 10);

    minutes = minutes < 10 ? "0" + minutes : minutes;
    seconds = seconds < 10 ? "0" + seconds : seconds;

    display.textContent = minutes + ":" + seconds;
    if (--timer < 0) {
      timer = duration;
    }
  }, 1000);
}

function errorTimer() {
  var fortyFiveSeconds = 60 * .75,
    display = document.querySelector('#time');
  startTimer(fortyFiveSeconds, display);
};
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.2.1/css/bootstrap.min.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.2.1/js/bootstrap.min.js"></script>


<div class="container-fluid">

  <div class="row">
    <div class="col-md-12 mt-5">&nbsp;</div>
  </div>
  <div class="row">
    <div class="col-md-4"></div>
    <div class="col-md-4 text-center">
      <p id="time"></p>
    </div>
    <div class="col-md-4"></div>
  </div>
</div>

<button type="button" class="btn btn-info" onclick="errorTimer()">Submit  Button</button>

您可以通过清除间隔来停止计时器:

// Timer for error message - 45 seconds.    
function startTimer(duration, display) {
var timer = duration, minutes, seconds;
var interval = setInterval(function () {
    minutes = parseInt(timer / 60, 10)
    seconds = parseInt(timer % 60, 10);

    minutes = minutes < 10 ? "0" + minutes : minutes;
    seconds = seconds < 10 ? "0" + seconds : seconds;

    display.textContent = minutes + ":" + seconds;
    if (--timer < 0) {
        timer = duration;
    }
}, 1000);
    return function(){ clearInterval(interval); };
}

function errorTimer () {
    var fortyFiveSeconds = 60 * .75,
    var display = document.querySelector('#time');
    var stopper = startTimer(fortyFiveSeconds, display);
    setTimeout(stopper, 20 * 1000); // stop timer 20 seconds later.
};

我使用了 startTimer 函数返回的一个简单函数,稍后可用于清除间隔。

像这样使用 clearInterval

...
    // Timer for error message - 45 seconds.    
    var timerId;
    function startTimer(duration, display) {
    var timer = duration, minutes, seconds;
    if(timerId != undefined) {
        clearInterval(timerId)
    }
    timerId = setInterval(function () {
        minutes = parseInt(timer / 60, 10)
        seconds = parseInt(timer % 60, 10);

        minutes = minutes < 10 ? "0" + minutes : minutes;
        seconds = seconds < 10 ? "0" + seconds : seconds;

        display.textContent = minutes + ":" + seconds;
        if (--timer < 0) {
            timer = duration;
        }
    }, 1000);
    }

    function errorTimer () {
        var fortyFiveSeconds = 60 * .75,
        display = document.querySelector('#time');
    startTimer(fortyFiveSeconds, display);
    };
    ...