
1. To Do List에 값 삭제하기
- <li> 태그안에 X 버튼 추가하기
- todo.js
const toDoForm = document.getElementById("todo-form"); const toDoInput = toDoForm.querySelector("input"); const toDoList = document.getElementById("todo-list"); function paintToDo(newToDo) { const li = document.createElement("li"); // li 요소 만들기 const span = document.createElement("span"); // span 요소 만들기 span.innerText = newToDo; // li 내부에 텍스트 설정하기 const button = document.createElement("button") // button 요소 만들기 button.innerText = "❌"; li.appendChild(span); // span 요소에 li 추가하기 li.appendChild(button); // span 요소에 button 추가하기 toDoList.appendChild(li); } function handleToDoSubmit(event) { event.preventDefault(); // 새로고침 막기 const newToDo = toDoInput.value; // 입력 필드의 값 저장 paintToDo(newToDo); // 저장된 값을 paintToDo 함수로 전달 toDoInput.value = ""; // 입력 필드 비우기 } toDoForm.addEventListener("submit", handleToDoSubmit);

- 클릭 이벤트 추가하기
- todo.js
const toDoForm = document.getElementById("todo-form"); const toDoInput = toDoForm.querySelector("input"); const toDoList = document.getElementById("todo-list"); function deleteToDo() { console.log("X버튼을 눌렀어요"); } function paintToDo(newToDo) { const li = document.createElement("li"); // li 요소 만들기 const span = document.createElement("span"); // span 요소 만들기 span.innerText = newToDo; // li 내부에 텍스트 설정하기 const button = document.createElement("button") // button 요소 만들기 button.innerText = "❌"; button.addEventListener("click", deleteToDo); li.appendChild(span); // span 요소에 li 추가하기 li.appendChild(button); // span 요소에 button 추가하기 toDoList.appendChild(li); } function handleToDoSubmit(event) { event.preventDefault(); // 새로고침 막기 const newToDo = toDoInput.value; // 입력 필드의 값 저장 paintToDo(newToDo); // 저장된 값을 paintToDo 함수로 전달 toDoInput.value = ""; // 입력 필드 비우기 } toDoForm.addEventListener("submit", handleToDoSubmit);

- event 내부 확인해보기
- todo.js
const toDoForm = document.getElementById("todo-form"); const toDoInput = toDoForm.querySelector("input"); const toDoList = document.getElementById("todo-list"); function deleteToDo(event) { console.log(event); } function paintToDo(newToDo) { const li = document.createElement("li"); // li 요소 만들기 const span = document.createElement("span"); // span 요소 만들기 span.innerText = newToDo; // li 내부에 텍스트 설정하기 const button = document.createElement("button") // button 요소 만들기 button.innerText = "❌"; button.addEventListener("click", deleteToDo); li.appendChild(span); // span 요소에 li 추가하기 li.appendChild(button); // span 요소에 button 추가하기 toDoList.appendChild(li); } function handleToDoSubmit(event) { event.preventDefault(); // 새로고침 막기 const newToDo = toDoInput.value; // 입력 필드의 값 저장 paintToDo(newToDo); // 저장된 값을 paintToDo 함수로 전달 toDoInput.value = ""; // 입력 필드 비우기 } toDoForm.addEventListener("submit", handleToDoSubmit);

- 클릭된 요소 확인하기
- todo.js
const toDoForm = document.getElementById("todo-form"); const toDoInput = toDoForm.querySelector("input"); const toDoList = document.getElementById("todo-list"); function deleteToDo(event) { console.dir(event.target); // 어떤 요소가 클릭되었는지 확인하기 } function paintToDo(newToDo) { const li = document.createElement("li"); // li 요소 만들기 const span = document.createElement("span"); // span 요소 만들기 span.innerText = newToDo; // li 내부에 텍스트 설정하기 const button = document.createElement("button") // button 요소 만들기 button.innerText = "❌"; button.addEventListener("click", deleteToDo); li.appendChild(span); // span 요소에 li 추가하기 li.appendChild(button); // span 요소에 button 추가하기 toDoList.appendChild(li); } function handleToDoSubmit(event) { event.preventDefault(); // 새로고침 막기 const newToDo = toDoInput.value; // 입력 필드의 값 저장 paintToDo(newToDo); // 저장된 값을 paintToDo 함수로 전달 toDoInput.value = ""; // 입력 필드 비우기 } toDoForm.addEventListener("submit", handleToDoSubmit);

- 클릭된 해당 요소 찾기!
- todo.js
const toDoForm = document.getElementById("todo-form"); const toDoInput = toDoForm.querySelector("input"); const toDoList = document.getElementById("todo-list"); function deleteToDo(event) { console.dir(event.target.parentElement); // 어떤 요소가 클릭되었는지 확인하기 } function paintToDo(newToDo) { const li = document.createElement("li"); // li 요소 만들기 const span = document.createElement("span"); // span 요소 만들기 span.innerText = newToDo; // li 내부에 텍스트 설정하기 const button = document.createElement("button") // button 요소 만들기 button.innerText = "❌"; button.addEventListener("click", deleteToDo); li.appendChild(span); // span 요소에 li 추가하기 li.appendChild(button); // span 요소에 button 추가하기 toDoList.appendChild(li); } function handleToDoSubmit(event) { event.preventDefault(); // 새로고침 막기 const newToDo = toDoInput.value; // 입력 필드의 값 저장 paintToDo(newToDo); // 저장된 값을 paintToDo 함수로 전달 toDoInput.value = ""; // 입력 필드 비우기 } toDoForm.addEventListener("submit", handleToDoSubmit);


- innerText로 확인하기
const toDoForm = document.getElementById("todo-form"); const toDoInput = toDoForm.querySelector("input"); const toDoList = document.getElementById("todo-list"); function deleteToDo(event) { console.dir(event.target.parentElement.innerText); // 어떤 요소가 클릭되었는지 확인하기 } function paintToDo(newToDo) { const li = document.createElement("li"); // li 요소 만들기 const span = document.createElement("span"); // span 요소 만들기 span.innerText = newToDo; // li 내부에 텍스트 설정하기 const button = document.createElement("button") // button 요소 만들기 button.innerText = "❌"; button.addEventListener("click", deleteToDo); li.appendChild(span); // span 요소에 li 추가하기 li.appendChild(button); // span 요소에 button 추가하기 toDoList.appendChild(li); } function handleToDoSubmit(event) { event.preventDefault(); // 새로고침 막기 const newToDo = toDoInput.value; // 입력 필드의 값 저장 paintToDo(newToDo); // 저장된 값을 paintToDo 함수로 전달 toDoInput.value = ""; // 입력 필드 비우기 } toDoForm.addEventListener("submit", handleToDoSubmit);

- 해당 요소 삭제하기
- todo.js
const toDoForm = document.getElementById("todo-form"); const toDoInput = toDoForm.querySelector("input"); const toDoList = document.getElementById("todo-list"); function deleteToDo(event) { const li = event.target.parentElement.innerText; li.remove(); } function paintToDo(newToDo) { const li = document.createElement("li"); // li 요소 만들기 const span = document.createElement("span"); // span 요소 만들기 span.innerText = newToDo; // li 내부에 텍스트 설정하기 const button = document.createElement("button") // button 요소 만들기 button.innerText = "❌"; button.addEventListener("click", deleteToDo); li.appendChild(span); // span 요소에 li 추가하기 li.appendChild(button); // span 요소에 button 추가하기 toDoList.appendChild(li); } function handleToDoSubmit(event) { event.preventDefault(); // 새로고침 막기 const newToDo = toDoInput.value; // 입력 필드의 값 저장 paintToDo(newToDo); // 저장된 값을 paintToDo 함수로 전달 toDoInput.value = ""; // 입력 필드 비우기 } toDoForm.addEventListener("submit", handleToDoSubmit);


2. To Do List에 값 저장하기
- local Storage 에 저장하기
- newToDo로 toDo가 추가 될 때마다 toDos라는 배열에 추가하기
- todo.js
const toDoForm = document.getElementById("todo-form"); const toDoInput = toDoForm.querySelector("input"); const toDoList = document.getElementById("todo-list"); const toDos = []; function deleteToDo(event) { const li = event.target.parentElement; li.remove(); } function paintToDo(newToDo) { const li = document.createElement("li"); // li 요소 만들기 const span = document.createElement("span"); // span 요소 만들기 span.innerText = newToDo; // li 내부에 텍스트 설정하기 const button = document.createElement("button") // button 요소 만들기 button.innerText = "❌"; button.addEventListener("click", deleteToDo); li.appendChild(span); // span 요소에 li 추가하기 li.appendChild(button); // span 요소에 button 추가하기 toDoList.appendChild(li); } function handleToDoSubmit(event) { event.preventDefault(); // 새로고침 막기 const newToDo = toDoInput.value; // 입력 필드의 값 저장 toDoInput.value = ""; // 입력 필드 비우기 toDos.push(newToDo); // 배열에 추가하기 paintToDo(newToDo); // 저장된 값을 paintToDo 함수로 전달 } toDoForm.addEventListener("submit", handleToDoSubmit);

- local Storage에는 텍스트만 저장할 수 있음
const toDoForm = document.getElementById("todo-form"); const toDoInput = toDoForm.querySelector("input"); const toDoList = document.getElementById("todo-list"); const toDos = []; function saveToDos() { localStorage.setItem("todos", toDos); } function deleteToDo(event) { const li = event.target.parentElement; li.remove(); } function paintToDo(newToDo) { const li = document.createElement("li"); // li 요소 만들기 const span = document.createElement("span"); // span 요소 만들기 span.innerText = newToDo; // li 내부에 텍스트 설정하기 const button = document.createElement("button") // button 요소 만들기 button.innerText = "❌"; button.addEventListener("click", deleteToDo); li.appendChild(span); // span 요소에 li 추가하기 li.appendChild(button); // span 요소에 button 추가하기 toDoList.appendChild(li); } function handleToDoSubmit(event) { event.preventDefault(); // 새로고침 막기 const newToDo = toDoInput.value; // 입력 필드의 값 저장 toDoInput.value = ""; // 입력 필드 비우기 toDos.push(newToDo); // 배열에 추가하기 paintToDo(newToDo); // 저장된 값을 paintToDo 함수로 전달 } toDoForm.addEventListener("submit", handleToDoSubmit);

- 기존의 toDos를 화면에 표시하기
- local Storage에 배열로 변경하기
JSON.stringify(user) // string으로 만들어줌

const toDoForm = document.getElementById("todo-form"); const toDoInput = toDoForm.querySelector("input"); const toDoList = document.getElementById("todo-list"); const toDos = []; function saveToDos() { localStorage.setItem("todos", JSON.stringify(toDos)); } function deleteToDo(event) { const li = event.target.parentElement; li.remove(); } function paintToDo(newToDo) { const li = document.createElement("li"); // li 요소 만들기 const span = document.createElement("span"); // span 요소 만들기 span.innerText = newToDo; // li 내부에 텍스트 설정하기 const button = document.createElement("button") // button 요소 만들기 button.innerText = "❌"; button.addEventListener("click", deleteToDo); li.appendChild(span); // span 요소에 li 추가하기 li.appendChild(button); // span 요소에 button 추가하기 toDoList.appendChild(li); } function handleToDoSubmit(event) { event.preventDefault(); // 새로고침 막기 const newToDo = toDoInput.value; // 입력 필드의 값 저장 toDoInput.value = ""; // 입력 필드 비우기 toDos.push(newToDo); // 배열에 추가하기 paintToDo(newToDo); // 저장된 값을 paintToDo 함수로 전달 saveToDos(); // local Storage에 저장하기 } toDoForm.addEventListener("submit", handleToDoSubmit);

- 배열로 저장된 값을 String으로 바꿔서 가져오기


3. ToDo List 목록 표시하기
- local storage에 저장된 값 가져오기
- todo.js
const toDoForm = document.getElementById("todo-form"); const toDoInput = toDoForm.querySelector("input"); const toDoList = document.getElementById("todo-list"); const TODOS_KEY = "todos"; const toDos = []; function saveToDos() { localStorage.setItem(TODOS_KEY, JSON.stringify(toDos)); } function deleteToDo(event) { const li = event.target.parentElement; li.remove(); } function paintToDo(newToDo) { const li = document.createElement("li"); // li 요소 만들기 const span = document.createElement("span"); // span 요소 만들기 span.innerText = newToDo; // span 내부에 텍스트 설정하기 const button = document.createElement("button"); // button 요소 만들기 button.innerText = "❌"; button.addEventListener("click", deleteToDo); li.appendChild(span); // span을 li에 추가하기 li.appendChild(button); // button을 li에 추가하기 toDoList.appendChild(li); } function handleToDoSubmit(event) { event.preventDefault(); // 새로고침 막기 const newToDo = toDoInput.value; // 입력 필드의 값 저장 toDoInput.value = ""; // 입력 필드 비우기 toDos.push(newToDo); // 배열에 추가하기 paintToDo(newToDo); // 저장된 값을 paintToDo 함수로 전달 saveToDos(); // localStorage에 저장하기 } toDoForm.addEventListener("submit", handleToDoSubmit); // 저장된 todos 불러오기 const saveToDos = localStorage.getItem(TODOS_KEY); if (saveToDos !== null) { const parsedToDos = JSON.parse(saveToDos); console.log(parsedToDos); }

- 저장된 todos 불러오기
const toDoForm = document.getElementById("todo-form"); const toDoInput = toDoForm.querySelector("input"); const toDoList = document.getElementById("todo-list"); const TODOS_KEY = "todos"; const toDos = []; function saveToDos() { localStorage.setItem(TODOS_KEY, JSON.stringify(toDos)); } function deleteToDo(event) { const li = event.target.parentElement; li.remove(); } function paintToDo(newToDo) { const li = document.createElement("li"); // li 요소 만들기 const span = document.createElement("span"); // span 요소 만들기 span.innerText = newToDo; // span 내부에 텍스트 설정하기 const button = document.createElement("button"); // button 요소 만들기 button.innerText = "❌"; button.addEventListener("click", deleteToDo); li.appendChild(span); // span을 li에 추가하기 li.appendChild(button); // button을 li에 추가하기 toDoList.appendChild(li); } function handleToDoSubmit(event) { event.preventDefault(); // 새로고침 막기 const newToDo = toDoInput.value; // 입력 필드의 값 저장 toDoInput.value = ""; // 입력 필드 비우기 toDos.push(newToDo); // 배열에 추가하기 paintToDo(newToDo); // 저장된 값을 paintToDo 함수로 전달 saveToDos(); // localStorage에 저장하기 } toDoForm.addEventListener("submit", handleToDoSubmit); // 저장된 todos 불러오기 const savedToDos = localStorage.getItem(TODOS_KEY); if (savedToDos !== null) { const parsedToDos = JSON.parse(savedToDos); console.log(parsedToDos); }

- forEach 이용하기
- 각 item당 1번씩 함수가 실행됨
- todo.js
const toDoForm = document.getElementById("todo-form"); const toDoInput = toDoForm.querySelector("input"); const toDoList = document.getElementById("todo-list"); const TODOS_KEY = "todos"; const toDos = []; function saveToDos() { localStorage.setItem(TODOS_KEY, JSON.stringify(toDos)); } function deleteToDo(event) { const li = event.target.parentElement; li.remove(); } function paintToDo(newToDo) { const li = document.createElement("li"); // li 요소 만들기 const span = document.createElement("span"); // span 요소 만들기 span.innerText = newToDo; // span 내부에 텍스트 설정하기 const button = document.createElement("button"); // button 요소 만들기 button.innerText = "❌"; button.addEventListener("click", deleteToDo); li.appendChild(span); // span을 li에 추가하기 li.appendChild(button); // button을 li에 추가하기 toDoList.appendChild(li); } function handleToDoSubmit(event) { event.preventDefault(); // 새로고침 막기 const newToDo = toDoInput.value; // 입력 필드의 값 저장 toDoInput.value = ""; // 입력 필드 비우기 toDos.push(newToDo); // 배열에 추가하기 paintToDo(newToDo); // 저장된 값을 paintToDo 함수로 전달 saveToDos(); // localStorage에 저장하기 } toDoForm.addEventListener("submit", handleToDoSubmit); function sayHello() { console.log("Hello"); } // 저장된 todos 불러오기 const savedToDos = localStorage.getItem(TODOS_KEY); if (savedToDos !== null) { const parsedToDos = JSON.parse(savedToDos); parsedToDos.forEach(sayHello); // array 아이템들에 대해 1개의 함수만 실행 }

const toDoForm = document.getElementById("todo-form"); const toDoInput = toDoForm.querySelector("input"); const toDoList = document.getElementById("todo-list"); const TODOS_KEY = "todos"; const toDos = []; function saveToDos() { localStorage.setItem(TODOS_KEY, JSON.stringify(toDos)); } function deleteToDo(event) { const li = event.target.parentElement; li.remove(); } function paintToDo(newToDo) { const li = document.createElement("li"); // li 요소 만들기 const span = document.createElement("span"); // span 요소 만들기 span.innerText = newToDo; // span 내부에 텍스트 설정하기 const button = document.createElement("button"); // button 요소 만들기 button.innerText = "❌"; button.addEventListener("click", deleteToDo); li.appendChild(span); // span을 li에 추가하기 li.appendChild(button); // button을 li에 추가하기 toDoList.appendChild(li); } function handleToDoSubmit(event) { event.preventDefault(); // 새로고침 막기 const newToDo = toDoInput.value; // 입력 필드의 값 저장 toDoInput.value = ""; // 입력 필드 비우기 toDos.push(newToDo); // 배열에 추가하기 paintToDo(newToDo); // 저장된 값을 paintToDo 함수로 전달 saveToDos(); // localStorage에 저장하기 } toDoForm.addEventListener("submit", handleToDoSubmit); // 저장된 todos 불러오기 const savedToDos = localStorage.getItem(TODOS_KEY); if (savedToDos !== null) { const parsedToDos = JSON.parse(savedToDos); parsedToDos.forEach(paintToDo); }

- 이전 값 복원시켜주기
- todo.js
- 새로운 값이 중복된 값이라도 입력됨
const toDoForm = document.getElementById("todo-form"); const toDoInput = toDoForm.querySelector("input"); const toDoList = document.getElementById("todo-list"); const TODOS_KEY = "todos"; let toDos = []; // 비어있는 배열의 상태로 시작 function saveToDos() { localStorage.setItem(TODOS_KEY, JSON.stringify(toDos)); } function deleteToDo(event) { const li = event.target.parentElement; li.remove(); } function paintToDo(newToDo) { const li = document.createElement("li"); // li 요소 만들기 const span = document.createElement("span"); // span 요소 만들기 span.innerText = newToDo; // span 내부에 텍스트 설정하기 const button = document.createElement("button"); // button 요소 만들기 button.innerText = "❌"; button.addEventListener("click", deleteToDo); li.appendChild(span); // span을 li에 추가하기 li.appendChild(button); // button을 li에 추가하기 toDoList.appendChild(li); } function handleToDoSubmit(event) { event.preventDefault(); // 새로고침 막기 const newToDo = toDoInput.value; // 입력 필드의 값 저장 toDoInput.value = ""; // 입력 필드 비우기 toDos.push(newToDo); // 배열에 추가하기 paintToDo(newToDo); // 저장된 값을 paintToDo 함수로 전달 saveToDos(); // localStorage에 저장하기 } toDoForm.addEventListener("submit", handleToDoSubmit); // 저장된 todos 불러오기 const savedToDos = localStorage.getItem(TODOS_KEY); if (savedToDos !== null) { const parsedToDos = JSON.parse(savedToDos); toDos = parsedToDos; parsedToDos.forEach(paintToDo); }

4. 삭제 버튼을 누르면 local Storage에도 적용하기
- local Storage는 toDos(DB 역할)를 복사 해놓는 곳이기에 toDos와 다름
- toDos에게 랜덤한 id 주기
Date.now() // 밀리초(1000분의 1초), 거의 랜덤임

const toDoForm = document.getElementById("todo-form"); const toDoInput = toDoForm.querySelector("input"); const toDoList = document.getElementById("todo-list"); const TODOS_KEY = "todos"; let toDos = []; function saveToDos() { localStorage.setItem(TODOS_KEY, JSON.stringify(toDos)); } function deleteToDo(event) { const li = event.target.parentElement; li.remove(); } function paintToDo(newToDo) { const li = document.createElement("li"); const span = document.createElement("span"); span.innerText = newToDo; const button = document.createElement("button"); button.innerText = "❌"; button.addEventListener("click", deleteToDo); li.appendChild(span); li.appendChild(button); toDoList.appendChild(li); } function handleToDoSubmit(event) { event.preventDefault(); const newToDo = toDoInput.value; toDoInput.value = ""; const newTodoObj = { text: newToDo, id: Date.now(), } toDos.push(newTodoObj); // 배열에 추가하기 paintToDo(newTodoObj); // 저장된 값을 paintToDo 함수로 전달 saveToDos(); } toDoForm.addEventListener("submit", handleToDoSubmit); const savedToDos = localStorage.getItem(TODOS_KEY); if (savedToDos !== null) { const parsedToDos = JSON.parse(savedToDos); toDos = parsedToDos; parsedToDos.forEach(paintToDo); }


- id를 HTML에 두기
- todo.js
const toDoForm = document.getElementById("todo-form"); const toDoInput = toDoForm.querySelector("input"); const toDoList = document.getElementById("todo-list"); const TODOS_KEY = "todos"; let toDos = []; function saveToDos() { localStorage.setItem(TODOS_KEY, JSON.stringify(toDos)); } function deleteToDo(event) { const li = event.target.parentElement; li.remove(); } function paintToDo(newToDo) { const li = document.createElement("li"); li.id = newToDo.id; // io 기져오기 const span = document.createElement("span"); span.innerText = newToDo.text; // 객체를 text로 나타내기 const button = document.createElement("button"); button.innerText = "❌"; button.addEventListener("click", deleteToDo); li.appendChild(span); li.appendChild(button); toDoList.appendChild(li); } function handleToDoSubmit(event) { event.preventDefault(); const newToDo = toDoInput.value; toDoInput.value = ""; const newTodoObj = { text: newToDo, id: Date.now(), } toDos.push(newTodoObj); // 배열에 추가하기 paintToDo(newTodoObj); // 저장된 값을 paintToDo 함수로 전달 saveToDos(); } toDoForm.addEventListener("submit", handleToDoSubmit); const savedToDos = localStorage.getItem(TODOS_KEY); if (savedToDos !== null) { const parsedToDos = JSON.parse(savedToDos); toDos = parsedToDos; parsedToDos.forEach(paintToDo); }

- 어떤 id를 삭제할 것인지 확인하기
- 삭제하면 해당 id 출력하기
- todo.js
const toDoForm = document.getElementById("todo-form"); const toDoInput = toDoForm.querySelector("input"); const toDoList = document.getElementById("todo-list"); const TODOS_KEY = "todos"; let toDos = []; function saveToDos() { localStorage.setItem(TODOS_KEY, JSON.stringify(toDos)); } function deleteToDo(event) { const li = event.target.parentElement; console.log(li.id); li.remove(); } function paintToDo(newToDo) { const li = document.createElement("li"); li.id = newToDo.id; // id 가져오기 const span = document.createElement("span"); span.innerText = newToDo.text; // 객체를 text로 나타내기 const button = document.createElement("button"); button.innerText = "❌"; button.addEventListener("click", deleteToDo); li.appendChild(span); li.appendChild(button); toDoList.appendChild(li); } function handleToDoSubmit(event) { event.preventDefault(); const newToDo = toDoInput.value; toDoInput.value = ""; const newTodoObj = { text: newToDo, id: Date.now(), } toDos.push(newTodoObj); // 배열에 추가하기 paintToDo(newTodoObj); // 저장된 값을 paintToDo 함수로 전달 saveToDos(); } toDoForm.addEventListener("submit", handleToDoSubmit); const savedToDos = localStorage.getItem(TODOS_KEY); if (savedToDos !== null) { const parsedToDos = JSON.parse(savedToDos); toDos = parsedToDos; parsedToDos.forEach(paintToDo); }

- filter 이용하기
- 배열의 요소를 조건에 따라 걸러내어 새로운 배열을 만드는 메서드
- 원래의 배열은 변하지 않고, 조건에 맞는 요소들만으로 구성된 새로운 배열을 반환
- 각 item마다 filter를 호출하고 true를 반환하면 배열에 유지되고 false를 반환하면 제외됨
- JS가 아이템을 보내겠지만 우리는 true를 반환하니 신경안써도 됨
- false를 반환하면 제외됨
- 배열에서 삭제하고 싶으면 해당 item만 false를 반환하고 나머지는 true를 반환하면 됨
- 해당 id의 item만 false로 반환하여 배열에서 지우기
- filter의 매개변수 명은 아무거나 와도 됨
- 결과는 같음
- todo.js
- id는 숫자인데 li.id는 string이기에 변형이 필요함





const toDoForm = document.getElementById("todo-form"); const toDoInput = toDoForm.querySelector("input"); const toDoList = document.getElementById("todo-list"); const TODOS_KEY = "todos"; let toDos = []; function saveToDos() { localStorage.setItem(TODOS_KEY, JSON.stringify(toDos)); } function deleteToDo(event) { const li = event.target.parentElement; li.remove(); toDos = toDos.filter(toDo => toDo.id !== parseInt(li.id)); // 삭제하려는 id를 제외한 배열 만들기 saveToDos(); // 새 배열 저장하기 } function paintToDo(newToDo) { const li = document.createElement("li"); li.id = newToDo.id; const span = document.createElement("span"); span.innerText = newToDo.text; const button = document.createElement("button"); button.innerText = "❌"; button.addEventListener("click", deleteToDo); li.appendChild(span); li.appendChild(button); toDoList.appendChild(li); } function handleToDoSubmit(event) { event.preventDefault(); const newToDo = toDoInput.value; toDoInput.value = ""; const newTodoObj = { text: newToDo, id: Date.now(), } toDos.push(newTodoObj); paintToDo(newTodoObj); saveToDos(); } toDoForm.addEventListener("submit", handleToDoSubmit); const savedToDos = localStorage.getItem(TODOS_KEY); if (savedToDos !== null) { const parsedToDos = JSON.parse(savedToDos); toDos = parsedToDos; parsedToDos.forEach(paintToDo); }

Share article