프론트엔드 공부/Javascript 기초

24일차 프론트엔드 공부 - 반복문

프망생222 2024. 10. 5. 13:00

- 프론트엔드 공부 24일차 -


 

반복문

반복적인 코드의 양을 획기적으로 압축

ex)

for(최초식; 조건식; 증감문){

// 반복을 수행할 코드

}

 

while문

ex)

최초식

while( 조건식 ){

// 반복을 수행할 코드

증감식

}

 

- 최초식 : let i = 0

- 조건식 : i < 10

- 증감식 : i = i + 1

 

while문 주의사항

종료 조건을 제대로 설정하지 않으면 무한 반복이 일어남.

 

html의 head에서 script를 이용해 JS를 사용할 때 주의사항

기본적으로 html은 body 태그를 생성하기 전 head 태그의 코드부터 해석한다.

그렇기에 홈페이지가 열리면  html의 코드가 수정되게 하기위해 JS를 할 수 있는데 이 경우 html 태그를 생성하기 전에 JS를 실행하기에 수정할 태그가 존재하지 않아 오류가 발생할 수 있다. 이럴경우 script 안에 defer을 사용하면 된다. 

 

    <script src="./index.js" defer></script>

defer 란?

스크립트 태그를 해석하는 와중 html 태그를 생성한다.



카운트 다운 사이트

 

코드)

 

HTML

<!DOCTYPE html>
<html lang="ko">
  <head>
    <title>D-Day</title>
    <link rel="stylesheet" href="./index.css" />
    <script src="./index.js" defer></script>
  </head>
  <body>
    <h1>D-Day</h1>
    <div id="ddayContainer">
      <div class="ddayChildContainer">
        <span id="days">0</span>
        <span>일</span>
      </div>
      <div class="ddayChildContainer">
        <span id="hours">0</span>
        <span>시간</span>
      </div>
      <div class="ddayChildContainer">
        <span id="min">0</span>
        <span>분</span>
      </div>
      <div class="ddayChildContainer">
        <span id="sec">0</span>
        <span>초</span>
      </div>
    </div>
    <div id="ddayMessage"></div>
    <div id="targetSelctor">
      <input id="yearInput" class="date" size="5" placeholder="년" /> -
      <input id="monthInput" class="date" size="5" placeholder="월" /> -
      <input id="dayInput" class="date" size="5" placeholder="일" />
    </div>
    <button class="btn" onclick="starter()">카운트다운</button>
    <button class="btn" onclick="setClearInterval()">타이머 초기화</button>
  </body>
</html>

 

JS

const messageContainer = document.querySelector("#ddayMessage");
const container = document.querySelector("#ddayContainer");
const intervalIdArr = [];

messageContainer.innerHTML = "<h3>D-Day를 입력해주세요.</h3>";
container.style.display = "none";

const dateFormMaker = function () {
  const inputYear = document.querySelector("#yearInput").value;
  const inputMonth = document.querySelector("#monthInput").value;
  const inputDay = document.querySelector("#dayInput").value;

  // const dateFormat = inputYear + '-' + inputMonth + '-' + inputDay;
  const dateFormat = `${inputYear}-${inputMonth}-${inputDay}`;
  return dateFormat;
  // console.log(inputYear, inputMonth, inputDay)
};

const counterMaker = function () {
  const targetDateInput = dateFormMaker();
  const nowDate = new Date();
  const targetDate = new Date(targetDateInput).setHours(0, 0, 0, 0);
  const remaining = (targetDate - nowDate) / 1000;
  // remaining === 0 (남은 시간이 0)
  if (remaining <= 0) {
    messageContainer.innerHTML = "<h3>타이머가 종료되었습니다.</h3>";
    messageContainer.style.display = "flex";
    container.style.display = "none";
    setClearInterval();
    return;
  } else if (isNaN(remaining)) {
    // 만약 잘못된 날짜가 들어왔다면, 유효한 시간이 아닙니다 출력
    messageContainer.innerHTML = "<h3>유효한 시간이 아닙니다.</h3>";
    messageContainer.style.display = "flex";
    container.style.display = "none";
    setClearInterval();
    return;
  }

  const remainingObj = {
    remainingDate: Math.floor(remaining / 3600 / 24),
    remainingHour: Math.floor(remaining / 3600) % 24,
    remainingMin: Math.floor(remaining / 60) % 60,
    remainingSec: Math.floor(remaining) % 60,
  };

  const documentObj = {
    days: document.getElementById("days"),
    hours: document.getElementById("hours"),
    min: document.getElementById("min"),
    sec: document.getElementById("sec"),
  };

  const timeKeys = Object.keys(remainingObj);
  const docKeys = Object.keys(documentObj);

  for (let i = 0; i < timeKeys.length; i++) {
    documentObj[docKeys[i]].textContent = remainingObj[timeKeys[i]];
  }

  //   documentObj["days"].textContent = remainingObj["remainingDate"];
  //   documentObj["hours"].textContent = remainingObj["remainingHour"];
  //   documentObj["min"].textContent = remainingObj["remainingMin"];
  //   documentObj["sec"].textContent = remainingObj["remainingSec"];

  for (let key in documentObj) {
    documentObj.lo;
  }
};

const starter = function () {
  container.style.display = "flex";
  messageContainer.style.display = "none";
  counterMaker();
  const intervalId = setInterval(counterMaker, 1000);
  intervalIdArr.push(intervalId);
};

const setClearInterval = function () {
  container.style.display = "none";
  messageContainer.style.display = "flex";
  for (let i = 0; i < intervalIdArr.length; i++) {
    clearInterval(intervalIdArr[i]);
  }
};

 

CSS

* {
  box-sizing: border-box;
}

body {
  display: flex;
  flex-direction: column;
  align-items: center;
}

h1 {
  font-size: 3rem;
}

#ddayContainer {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  margin-bottom: 1.6rem;
}

.ddayChildContainer {
  text-align: center;
  margin-right: 1rem;
}

.ddayChildContainer span {
  font-size: 1.3rem;
}

.btn {
  margin-top: 0.5rem;
  font-size: 1.5rem;
}

 

 

 

setTimeout() 함수

setTimeout(() => {

      counterMaker();

    }, 1000 );

 

counterMaker() 라는 함수를 1초 뒤에 실행하라는 의미(지연)



setInterval() 함수

setInterval(counterMaker, 1000);

setInterval(함수, 시간)

특정 시간마다 함수를 반복 실행한다.