带对象的 Javascript 计时器

标签 javascript jquery html timer

我试图制作一种与我的计时器一起使用的对象。问题是,当我只有裸函数(不在对象中)时,它就可以工作。但是当我把它放在对象内部时它不起作用。

使用此代码我只能看到 00:01

当我只使用函数本身时,它工作正常,我希望将它们放在对象中,因为我的代码中将有更多函数。

感谢帮助

$(document).ready(function() {
  var Timer = {
    TimerID: null,
    elapsed: 0,
    changeTimer: function() {
      this.TimerID = setInterval(this.timerTick(), 1000);
    },
    timerTick: function() {
      this.elapsed++;
      var minutes = Math.floor(this.elapsed / 60);
      var seconds = this.elapsed - (minutes * 60);
      if (minutes < 10) minutes = "0" + minutes;
      if (seconds < 10) seconds = "0" + seconds;
      $('.timer-html').text(minutes + ":" + seconds);
    },
    stopTimer: function() {
      clearInterval(this.TimerID);
    }
  };
  console.log(Timer);
  $(".timer").click(Timer.changeTimer());
  $(".stop-timer").click(Timer.stopTimer());
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<a href="javascript:;" class="timer">start clock</a>
<a href="javascript:;" class="stop-timer">stop clock</a>
<h1 class="timer-html">00:00</h1>

最佳答案

$(document).ready(function() {

    var Timer = {
        TimerID : null,
        elapsed : 0,

        changeTimer: function () {
           //here you need to send the delegate function without ()            //.. setInterval(this.timerTick
            //this.TimerID = setInterval(this.timerTick.bind(this), 1000);
            //arrow function variant
             this.TimerID = setInterval(()=>this.timerTick(), 1000);
        },

        timerTick: function ()
        {  
            this.elapsed++;
            var elapsed =  this.elapsed;
            var minutes = Math.floor(elapsed / 60);
            var seconds = elapsed - (minutes * 60);

            if (minutes < 10)
                minutes = "0" + minutes;

            if (seconds < 10)
                seconds = "0" + seconds;

            $('.timer-html').text(minutes + ":" + seconds);
        },

        stopTimer: function () {
           clearInterval(this.TimerID);
        }
    };

    console.log(Timer);
    //here you to keep the timer context, you can use arrow function
    //.. ()=> or .bind(Timer)
    $(".timer").click(()=> Timer.changeTimer());
    $(".stop-timer").click(()=> Timer.stopTimer());
    //.bind() variant
    // $(".timer").click(Timer.changeTimer.bind(Timer));
    // $(".stop-timer").click(Timer.stopTimer.bind(Timer));
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.2.3/jquery.min.js"></script>
<a href="javascript:;" class="timer">start clock</a>
<a href="javascript:;" class="stop-timer">stop clock</a>
<h1 class="timer-html">00:00</h1>

关于带对象的 Javascript 计时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48149151/

相关文章:

javascript - Webpack Babel 加载错误 - Uncaught SyntaxError : Unexpected token import

javascript - Google Maps InfoWindow -(单击)触发 Angular 2 函数

javascript - 当我使用多个 jQuery change() 方法调用我的函数时,如何避免多次调用它?

php - 使用表单按钮提交 GET 值

javascript - 如何让 HTML 按钮依次运行三个功能

javascript - 如何使用 JavaScript 模拟 x86 无符号 32 位整数乘法?

javascript - 为什么要在这个 var 声明中将这个变量赋值给它自己?

javascript合并两个函数以检查另一个元素的节点类型

php - 如何在下拉更改事件中调用 AJAX 请求?

html - 动态 CSS 文档中的 MySQL 查询