这是我以前拥有的代码,效果很好:

var todayTime = new Date();
(function updateClock() {
    todayTime.setTime(todayTime.valueOf() + 1000);

    // In 2 digit format.
    document.getElementById("hours").innerHTML   = ("0" + todayTime.getHours()).slice(-2);
    document.getElementById("minutes").innerHTML = ("0" + todayTime.getMinutes()).slice(-2);
    document.getElementById("seconds").innerHTML = ("0" + todayTime.getSeconds()).slice(-2);

    setTimeout(updateClock, 1000);
})();


我试图将其更改为对象文字,以便可以更好地与之交互。

我要在这里执行的操作是在定义start()对象时自动执行LiveTime

还需要跟踪超时ID,以便在每次调用stop()方法时都可以使用它。

var LiveTime = {
    element: document.getElementById("current-time"),
    date: new Date(),
    timeoutId: 0,

    start: (function() {
        LiveTime.timeoutId = setTimeout(function() {
            LiveTime.date.setTime(LiveTime.date.valueOf() + 1000);

            LiveTime.element.innerHTML = ("0" + LiveTime.date.getHours()).slice(-2) + ":"
                              + ("0" + LiveTime.date.getMinutes()).slice(-2) + ":"
                              + ("0" + LiveTime.date.getSeconds()).slice(-2);
        }, 1000);
    })(),

    stop: function() {
        clearTimeout(LiveTime.timeoutId);
    }
}


不幸的是,代码给了我很多未定义的错误。


  未捕获的TypeError:无法设置未定义的属性“日期”


我在做什么错,我该如何解决以及其他任何我的代码错误呢?

最佳答案

您正在将start定义为自执行函数。这意味着在创建LiveTime对象时,start将设置为该函数的结果。但是,由于该函数在仍创建LiveTime的同时正在运行,因此LiveTime是未定义的。将开始定义更改为

start: function() {
    LiveTime.timeoutId = setTimeout(function() {
        LiveTime.date.setTime(LiveTime.date.valueOf() + 1000);

        LiveTime.element.innerHTML = ("0" + LiveTime.date.getHours()).slice(-2) + ":"
                          + ("0" + LiveTime.date.getMinutes()).slice(-2) + ":"
                          + ("0" + LiveTime.date.getSeconds()).slice(-2);
    }, 1000);
},


并且它应该可以工作(这仍然是您的代码,没有检查可能存在的任何其他错误)

关于javascript - 使我的LiveTime对象文字,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26569778/

10-09 20:04