关闭计时器倒计时javascript

时间:2016-08-19 00:03:52

标签: javascript

我正在使用倒数计时器:The simplest possible JavaScript countdown timer?

我正在为代码添加重置,暂停和恢复功能。

  //=================== Timer class ==============================
function CountDownTimer(duration, granularity) {
  this.duration = duration
  this.granularity = granularity || 1000;
  this.tickFtns = [];
  this.running = false;
  this.resetFlag = false;
}

CountDownTimer.prototype.start = function() {
  console.log('calling start');

  if (this.running) {
    return;
  }
  this.running = true;
  var start = Date.now(),
      that = this,
      diff, obj,
      timeoutID;

  (function timer() {
    diff = that.duration - (((Date.now() - start) / 1000) | 0);

    if (that.resetFlag) {
        console.log('Reset inside closure');
        clearTimeout(timeoutID);
        diff = 0;
        that.resetFlag = false;
        that.running = false;
        return;
    }

    console.log(diff);

    if (diff > 0) {
      timeoutID = setTimeout(timer, that.granularity);
    } else {
      diff = 0;
      that.running = false;
    }

    obj = CountDownTimer.parse(diff);
    that.tickFtns.forEach(function(ftn) {
      ftn.call(this, obj.minutes, obj.seconds);
    }, that);
  }());
};

CountDownTimer.prototype.onTick = function(ftn) {
  if (typeof ftn === 'function') {
    this.tickFtns.push(ftn);
  }
  return this;
};

CountDownTimer.prototype.expired = function() {
  return !this.running;
};

CountDownTimer.prototype.setTime = function(secs) {
    this.duration = secs;
}

CountDownTimer.prototype.reset = function() {
    this.resetFlag = true;
}

CountDownTimer.parse = function(seconds) {
  return {
    'minutes': (seconds / 60) | 0,
    'seconds': (seconds % 60) | 0
  };
};

window.onload = function () {

    timer = new CountDownTimer(25);
    timer.start();

    $('#button').click(function() {
         console.log("before reset");
         console.log(timer);
         console.log("after reset");
         timer.reset();
         console.log(timer);
         // timer.setTime(10);
         timer.start();
    })
}

用于测试的HTML,检查控制台的输出。

<script src="main.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>

<button id='button'> </button>

1)函数timer()是否在启动闭包?

2)我在start函数中添加了resetFlag,reset方法和resetFlag检查。我可以立即停止计时器,但之后无法启动它。如何修复错误?

25
24
23
main.js:64 Reset inside closure

(它应该从25倒数到0,当我按#button时,定时器复位并应从10到0计数。

================================ EDITS ============== ============================:

添加running = false后,它仍无效。

before reset
main.js:128 CountDownTimer {duration: 25, granularity: 1000, tickFtns: Array[0], running: true, resetFlag: false}
main.js:129 after reset
main.js:131 CountDownTimer {duration: 25, granularity: 1000, tickFtns: Array[0], running: true, resetFlag: true}
calling start
main.js:64 Reset inside closure

重置定时器似乎有些滞后? (复位内部闭合​​支持在复位后出现。

0 个答案:

没有答案