我正在使用下面的JavaScript时钟来记录时间。我将在单击按钮时启动此时钟。现在,如果此时钟未运行,我需要提醒用户。如何检查时钟的运行状态?
function markPresent() {
window.markDate = new Date();
updateClock();
}
function updateClock() {
var currDate = new Date();
var diff = currDate - markDate;
document.getElementById("test").innerHTML = format(diff / 1000);
setTimeout(function () { updateClock() }, 1000);
}
function format(seconds) {
var numhours = parseInt(Math.floor(((seconds % 31536000) % 86400) / 3600), 10);
var numminutes = parseInt(Math.floor((((seconds % 31536000) % 86400) % 3600) / 60), 10);
var numseconds = parseInt((((seconds % 31536000) % 86400) % 3600) % 60, 10);
return ((numhours < 10) ? "0" + numhours : numhours)
+ ":" + ((numminutes < 10) ? "0" + numminutes : numminutes)
+ ":" + ((numseconds < 10) ? "0" + numseconds : numseconds);
}
<div id="divtimer" style="text-align:center">
<p id="test"></p>
<button type="button" class="btn btn-success" onclick=" markPresent()">Start</button>
</div>
答案 0 :(得分:3)
好吧,我认为您的问题很简单,但是在查看您的代码时,我发现了其他我想提及的问题,因此您可以提高JavaScript技能。
使用JavaScript时请始终牢记这一点,因为先定义好以后在代码中使用的是一种好习惯。您的代码没有此代码,因此如果出于某种原因需要在其他地方实现它,则可能会遇到麻烦。
由于我们的HTML不会发生太大变化,因此请保持清晰,我们的HTML将是这样:
<div id="divtimer" style="text-align:center">
<p id="test"></p>
<button type="button" class="btn btn-success" id="clock">Start</button>
</div>
HTML的唯一更改是在按钮上添加了id="clock"
属性。
例如,让我们定义我们将使用的每个DOM元素,首先定义时钟处理程序和控制变量:
var clockDiv = document.querySelector("#test"),
button = document.querySelector("#clock"),
clock = null, //Define a global variable for the clock
isRunning = false, //You can view if clock is running from every scope
initTime = null;// Initial time of the clock
为确保应用程序功能和应用程序性能之间的平衡,我们需要为setInterval()
函数定义一个变量,以便您可以随时停止它,而不是即使您停止了时钟也要保持该函数运行
为了防止在DOM未准备好时执行代码,我们可以在已经为时钟按钮定义的全局变量上调用事件侦听器:
button.addEventListener("click",Clock);
是的,就这么简单。每次单击按钮都会调用Clock()
函数。
这就是我在说的。由于我们已经定义了其余代码(全局变量)中需要使用的内容,因此我们现在可以仅检查Clock()
函数中clock===null
的值:
function Clock() {
console.log("Called clock");
if (clock != null) {
//Clock is running
console.log("Stopping clock");
clearInterval(clock);
clock = null;
button.innerText = "Start";
clockDiv.innerText = "";
isRunning = false;
} else {
//Clock is not running
console.log("Starting clock");
setInitialTime();
clock = setInterval(updateClock, 1000); // Starts calling updateClock, which should do what your need with the clock.
button.innerText = "Stop"; //Changes the clock button text
updateClock();
isRunning = true;
}
}
该按钮只有两个功能。停止并开始。因此,我们可以使用if
语句来检查时钟是否已经启动,并执行相反的操作。 (如果停止,则启动它。否则,如果停止,则停止它。)
不要使用innerHTML。
这在JavaScript中是非常糟糕的做法,因为使用innerHTML会将字符串中的所有内容解析为HTML并将其放置在DOM上。在小型应用程序中,效果可能不会很大,但在生产中使用innerHTML
可能会破坏应用程序功能和应用程序性能之间的平衡。
推荐使用:innerText。
启动时钟时,我们调用了一个名为setInitialTime()
的函数,它的唯一作用是在单击按钮之前将全局变量initTime
定义为:
function setInitialTime() {
initTime = new Date().getTime();
}
现在,要更新时钟,我们唯一需要做的就是比较给定的两个时间戳并计算两者之间的差:
function updateClock() {
console.log("Clock update");
let currTime = new Date().getTime(),
diff = currTime - initTime;
console.log(format(diff / 1000));
clockDiv.innerText = format(diff / 1000);
}
您的format()
函数保持不变:
function format(seconds) {
var numhours = parseInt(Math.floor(((seconds % 31536000) % 86400) / 3600), 10);
var numminutes = parseInt(Math.floor((((seconds % 31536000) % 86400) % 3600) / 60), 10);
var numseconds = parseInt((((seconds % 31536000) % 86400) % 3600) % 60, 10);
return ((numhours < 10) ? "0" + numhours : numhours) + ":" + ((numminutes < 10) ? "0" + numminutes : numminutes) + ":" + ((numseconds < 10) ? "0" + numseconds : numseconds);
}
因此,您可以找到具有我所做的必要更改和建议的代码。它的工作原理相同,但是效果不错。
注意: 现在,您可以在其中查看变量
isRunning
,以检查时钟是否在运行。
var clockDiv = document.querySelector("#test"),
button = document.querySelector("#clock"),
clock = null, //Define a global variable for the clock
isRunning = false,
initTime = null;
button.addEventListener("click", Clock);
function Clock() {
console.log("Called clock");
if (clock != null) {
//Clock is running
console.log("Stopping clock");
clearInterval(clock);
clock = null;
button.innerText = "Start";
clockDiv.innerText = "";
isRunning = false;
} else {
//Clock is not running
console.log("Starting clock");
setInitialTime();
clock = setInterval(updateClock, 1000); // Starts calling updateClock, which should do what your need with the clock.
button.innerText = "Stop"; //Changes the clock button text
updateClock();
isRunning = true;
}
}
function setInitialTime() {
initTime = new Date().getTime();
}
function updateClock() {
console.log("Clock update");
let currTime = new Date().getTime(),
diff = currTime - initTime;
console.log("Actual time is " + currTime);
console.log("Time inited was " + initTime);
console.log(format(diff / 1000));
clockDiv.innerText = format(diff / 1000);
}
function format(seconds) {
var numhours = parseInt(Math.floor(((seconds % 31536000) % 86400) / 3600), 10);
var numminutes = parseInt(Math.floor((((seconds % 31536000) % 86400) % 3600) / 60), 10);
var numseconds = parseInt((((seconds % 31536000) % 86400) % 3600) % 60, 10);
return ((numhours < 10) ? "0" + numhours : numhours) + ":" + ((numminutes < 10) ? "0" + numminutes : numminutes) + ":" + ((numseconds < 10) ? "0" + numseconds : numseconds);
}
<div id="divtimer" style="text-align:center">
<p id="test"></p>
<button type="button" class="btn btn-success" id="clock">Start</button>
</div>
答案 1 :(得分:0)
setTimeout(function () { checkClock() }, 2000);
var lastDiff = null;
function checkClock() {
let currDiff = document.getElementById("test").innerHTML;
if (currDiff == lastDiff) {
alert('Clock is not running!');
} else {
lastDiff = currDiff;
setTimeout(function () { checkClock() }, 2000);
}