如何停止JavaScript计时器?

时间:2019-03-01 22:06:47

标签: javascript html timer onclick clearinterval

我有一个简单的引导页面,其中包括一个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>

3 个答案:

答案 0 :(得分:1)

如@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>

答案 1 :(得分:1)

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

// 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函数返回的简单函数,该函数可以在以后清除间隔。

答案 2 :(得分:1)

像这样使用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);
    };
    ...