본문 바로가기
JS

230106 JS 인터벌 실습-타이머 만들기

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .hide {
            display: none;
        }

        .show {
            display: inline;
        }
    </style>
</head>

<body>
    <h3>네이버 타이머 도전하기</h3>
    select태그는 시간:99 or 분:60 or 초:60으로 화면이 생성될 때 엘리먼트 생성기법으로 처리합니다.<br>
    시간설정 버튼을 클릭하면 시간이 세팅됩니다.<br>
    타이머시작버튼은 토글형태로 타이머가 동작중이라면 일시정지 버튼으로 활성화 됩니다<br>
    사용자가 버튼을 잘못클릭하는 경우를 고려하여, 어떠한 경우라도 중복으로 타이밍이 발생되면 안됩니다.



    <h3>시간을 선택하세요</h3>
    <select id="hour"></select>
    <select id="minute"></select>
    <select id="second"></select>

    <button id="setTime">시간설정</button>
    <div class="show">
        <button id="startTime" class="hide show">타이머시작</button>
        <button id="stopTime" class="hide">일시정지</button>
    </div>

    <div class="content">
        <h3></h3>
    </div>

    <script>
        var hour = document.querySelector("#hour");
        var minute = document.querySelector("#minute");
        var second = document.querySelector("#second");

        for (var i = 0; i <= 99; i++) {
            var hourin = document.createElement("option");
            hourin.innerHTML = i;
            hourin.value = i;
            hour.appendChild(hourin);
        }

        for (var i = 0; i < 60; i++) {
            var minutein = document.createElement("option");
            minutein.innerHTML = i;
            minutein.vlaue = i;
            minute.appendChild(minutein);
        }

        for (var i = 0; i < 60; i++) {
            var secondin = document.createElement("option");
            secondin.innerHTML = i;
            secondin.value = i;
            second.appendChild(secondin);
        }

        ////////////////////////
        var setTime = document.querySelector("#setTime");
        var startTime = document.querySelector("#startTime");
        var stopTime = document.querySelector("#stopTime");
        var content = document.querySelector(".content>h3");

        setTime.onclick = function () {
            var H = hour.value;
            var M = minute.value;
            var S = second.value;

            if (M < 10) {
                M = "0" + M;
            }
            if (S < 10) {
                S = "0" + S;
            }
            if(H<10){
                H="0"+H;
            }
            content.innerHTML = H + ":" + M + ":" + S;
        }
        /////////////
        startTime.addEventListener("click", function () {
            clock = setInterval(cur, 1000);
            startTime.classList.toggle("show");
            stopTime.classList.toggle("show");
            setTime.disabled = true;

        });

        function cur() {
            var str = content.innerHTML.split(":");
            var H = str[0];
            var M = str[1];
            var S = str[2];

            S -= 1;
            if (S < 0) {

                if (H > 0) {
                    if (M > 0) {
                        M -= 1;
                        S = 59;
                    } else if (M <= 0) {
                        H -= 1;
                        M = 59;
                        S = 59;
                    }
                } else {
                    if (M > 0) {
                        M -= 1;
                        S = 59;
                    } else if (M <= 0) {
                        alert('끝');
                        clearInterval(clock);
                        setTime.disabled = false;
                        startTime.classList.toggle("show");
                        stopTime.classList.toggle("show");
                        return;
                    }
                }

            }



            content.innerHTML = H.toString().padStart(2,'0') + ":" + M.toString().padStart(2,'0') + ":" + S.toString().padStart(2,'0');

        }

        var clock;

        stopTime.addEventListener("click", function () {
            clearInterval(clock);
            startTime.classList.toggle("show");
            stopTime.classList.toggle("show");
            setTime.disabled = false;
        })



    </script>



</body>

</html>

시간설정 버튼을 누르면 innerHTML을 통해 그림
타이머 시작을 누르면 버튼이 비활성화/display를 통해 버튼이 바뀜. 멈춘 상태에서 다시 타이머를 시작하거나 시간을 바꿀 수 있음. 화면에 나온 그 시간에 맞춰 타이머가 동작함. 
타이머가 끝나면 알람창이 뜨고 버튼이 처음과 같이 활성화됨. select의 값도 바꾸고 싶으면 각select.value를 변경해주면 된다.

padStart(2,'0')을 하면 두자리수에서 빈 자리수를 앞에서부터 0으로 채움. 

단, 문자열에서 동작하는 함수다. 변수-=1을 한 뒤에 변수를 toString을 한 뒤 padStart를 해주어야 한다.