본문 바로가기
Study/JavaScript

JavaScript 미니 프로젝트 Todo List

by 나아가는 2023. 9. 12.
반응형

 

배운점

  • localStorage 사용하여 브라우저를 껐다가 다시 접속해도 기존에 입력된 항목이 유지될 수 있도록 설정
  • localStorage 는 key - value 형식으로 저장된다.
  • 입력값을 JSON 객체로 생성하고 JSON.stringify() 이용하여 localStorage 저장한다.
  • 저장값 불러올 때는 JSON.parse() 으로 객체화 한다.

참고 사이트

https://ko.javascript.info/localstorage

 

localStorage와 sessionStorage

 

ko.javascript.info

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Todo list</title>
  </head>
  <style>
    * {
      box-sizing: border-box;
      font-size: 20px;
    }

    h1 {
      padding: 5px;
      font-style: italic;
      background-color: peachpuff;
    }
    input {
      width: 90%;
      height: 30px;
      font-size: 20px;
    }

    /* button1 */
    .button1 {
      position: relative;
      width: 5%;
      background-color: beige;
    }

    .button1:hover,
    .button1:focus {
      background-color: #ffcfcf;
    }

    .delete {
      margin-left: 20px;
    }

    /* content */
    .content {
      /* width: max-content; */
      border-bottom: 1px dashed black;
      margin: 3px;
      padding: 4px;
      /* background-color: #d9d6b6; */
      background-color: #ffeeee;
    }
    .content:hover {
      /* background-color: rgb(255, 182, 193); */
      background-color: #ffcfcf;
      font-weight: bolder;
    }

    .content.done {
      text-decoration: line-through;
      background-color: whitesmoke;
      color: gray;
    }
  </style>
  <body>
    <h1>Todo list</h1>
    <input type="text" placeholder="to do" />
    <button class="button1">+</button>
    <div class="content-list"></div>
  </body>

  <script>
    let contentList = document.querySelector(".content-list");

    // 저장된 컨텐츠 불러오기
    let lastIdx = localStorage.length;

    let localTodos = JSON.parse(localStorage.getItem("todos"));
    console.log(localTodos);

    if (localTodos) {
      localTodos.forEach((obj) => makeContent(obj));
    }

    let input = document.querySelector("input");
    let btn = document.querySelector("button");
    btn.onclick = () => {
      makeContent({ content: input.value, done: false });
      saveTodoList();
      input.value = "";
    };

    function makeContent(obj) {
      let div = document.createElement("div");
      div.classList.add("content");
      div.textContent = obj["content"];

      if (obj && obj.done) {
        div.classList.add("done");
      }

      div.onclick = (event) => {
        // delete
        if (event.target.tagName == "BUTTON") {
          event.target.parentElement.remove();
        } else {
          // 체크 해제
          if (div.classList.contains("done")) {
            div.classList.remove("done");
            // 체크
          } else {
            div.classList.add("done");
          }
        }
        // localStorage update
        saveTodoList();
      };

      let divBtn = document.createElement("button");
      divBtn.classList.add("delete");
      divBtn.textContent = "delete";
      div.append(divBtn);
      contentList.append(div);
    }

    function saveTodoList() {
      let todos = [];
      document.querySelectorAll(".content").forEach((content) => {
        todos.push({
          content: content.firstChild.textContent,
          done: content.classList.contains("done"),
        });
      });
      localStorage.setItem("todos", JSON.stringify(todos));
    }
  </script>
</html>

 

반응형

'Study > JavaScript' 카테고리의 다른 글

JavaScript 미니 프로젝트 _ 숫자 맞추기 게임  (1) 2023.09.11
DOM 노드와 주요 프로퍼티  (0) 2023.08.30
문서 객체 모델 DOM  (0) 2023.08.29
자바 스크립트 기본  (0) 2023.08.28