这是我以前的代码,运行良好:
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);
}
}
不幸的是,代码给了我一堆 undefined 错误。
未捕获的TypeError:无法设置未定义的属性'date'
我做错了什么,如何解决这个以及我的代码出错的其他问题?
答案 0 :(得分:1)
您将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);
},
它应该工作(这仍然是你的代码,没有检查可能存在的任何其他错误)