자바스크립트 스탑워치
조회수 828회
큐브 타이머(스탑워치)를 만들던 도중에 아무리 생각해도 모르겠어서 올립니다. 제 목표는 다음입니다!
- 마우스를 눌렀다 때는 순간 실행됩니다(
mouseup
orclick
). - 시작되고 나서 마우스를 누르는 순간 멈춥니다.(
mousedown
), - 멈추고 나서 마우스를 땔 때는 실행되지 않습니다. <-다른건 구현이 됬는데 이게 문제입니다...
HTML
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-eOJMYsd53ii+scO/bJGFsiCZc+5NDVN2yr8+0RDqr0Ql0h+rP48ckxlpbzKgwra6" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-icons/1.4.1/font/bootstrap-icons.min.css" integrity="sha512-YBSrHBAMjFhWHodf0RF58XB/x9lmuwBtyJv1LWDHQa1nOaWNXfG3Etc/lEXfW+qBx8ne79JnzccDs59je/ccVA==" crossorigin="anonymous">
<link rel="stylesheet" href="style.css">
<title>Cubimer</title>
</head>
<body>
<div class="position-absolute top-50 start-50 translate-middle">
<span class="font-big font-monospace user-select-none" id="time">0.00</span>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta3/dist/js/bootstrap.bundle.min.js" integrity="sha384-JEW9xMcG8R+pH31jmWH6WWP0WintQrMb4s7ZOdauHnUtxwoG2vI5DkLtS3qm9Ekf" crossorigin="anonymous"></script>
<script src="script.js"></script>
</body>
</html>
Javascript
const timeDisplay = document.getElementById("time");
var isRunning = false;
var isStopped = false;
var time = 0.00;
window.setInterval(function() {
if (isRunning) {
time += 0.01;
timeDisplay.innerText = time.toFixed(2);
}
}, 1);
window.addEventListener("mouseup", function() {
time = 0.00;
if (!isRunning) {
isRunning = true;
}
});
window.addEventListener("mousedown", function() {
if (isRunning) {
isRunning = false;
}
});
1 답변
-
시작과 정지 동작의 이벤트를 꼭 나눠야 한다면 아래처럼 하면 될 것 같아요.
window.addEventListener("mouseup", function () { if (justStopped) { justStopped = false; return; } time = 0.0; if (!isRunning) { isRunning = true; } }); window.addEventListener("mousedown", function () { if (isRunning) { isRunning = false; justStopped = true; } });
그런데 저라면 이렇게 할 것 같아요.
var startTime; var isRunning2 = false; var time2El = document.getElementById('time2'); window.addEventListener('click', () => { if (isRunning2) { isRunning2 = false; } else { startTime = new Date().getTime(); isRunning2 = true; } }); function drawTime() { if (isRunning2) { var time = ((new Date().getTime() - startTime) / 1000).toFixed(2); time2El.innerText = time; } requestAnimationFrame(drawTime); } drawTime();
왜냐면
- 이벤트를 나눠서 불필요한 상태(justStopped)가 필요해지고
- setInterval 은 정확한 간격을 보장하지 않아서 시간이 정확하지 않기 때문입니다.
댓글 입력