带 setInterval 的彩色时钟
重要性:4
首先,让我们制作 HTML/CSS。
时间的每个组件在它自己的 <span>
中看起来会很棒
<
div
id
=
"
clock"
>
<
span
class
=
"
hour"
>
hh</
span
>
:<
span
class
=
"
min"
>
mm</
span
>
:<
span
class
=
"
sec"
>
ss</
span
>
</
div
>
我们还需要 CSS 来为它们着色。
update
函数将刷新时钟,由 setInterval
每秒调用一次
function
update
(
)
{
let
clock =
document.
getElementById
(
'clock'
)
;
let
date =
new
Date
(
)
;
// (*)
let
hours =
date.
getHours
(
)
;
if
(
hours <
10
)
hours =
'0'
+
hours;
clock.
children[
0
]
.
innerHTML =
hours;
let
minutes =
date.
getMinutes
(
)
;
if
(
minutes <
10
)
minutes =
'0'
+
minutes;
clock.
children[
1
]
.
innerHTML =
minutes;
let
seconds =
date.
getSeconds
(
)
;
if
(
seconds <
10
)
seconds =
'0'
+
seconds;
clock.
children[
2
]
.
innerHTML =
seconds;
}
在代码行 (*)
中,我们每次都会检查当前日期。调用 setInterval
并不可靠:它们可能会延迟执行。
时钟管理函数
let
timerId;
function
clockStart
(
)
{
// run the clock
if
(
!
timerId)
{
// only set a new interval if the clock is not running
timerId =
setInterval
(
update,
1000
)
;
}
update
(
)
;
// (*)
}
function
clockStop
(
)
{
clearInterval
(
timerId)
;
timerId =
null
;
// (**)
}
请注意,update()
的调用不仅在 clockStart()
中被调度,而且在代码行 (*)
中立即执行。否则,访问者将不得不等到 setInterval
第一次执行。并且时钟在那之前将是空的。
同样重要的是,只有在时钟未运行时,才在 clockStart()
中设置新的间隔。否则,多次点击开始按钮将设置多个并发间隔。更糟糕的是 - 我们只会保留最后一个间隔的 timerID
,而丢失对所有其他间隔的引用。然后我们将永远无法停止时钟!请注意,我们需要在代码行 (**)
中清除 timerID
,以便在时钟停止时可以再次通过运行 clockStart()
来启动它。