기본 로직
할 일을 입력하고 + 버튼을 누르면 화면에 출력됨.
let userInput = document.getElementById("user-input")
let addBtn = document.getElementById("add-button")
// 할 일들을 저장할 변수
let myList = [];
// 버튼을 누르면 할일이 추가되도록 이벤트 리스너
addBtn.addEventListener("click", addTask)
// 할 일이 추가되는 함수
function addTask(){
myList.push(userInput.value)
// console.log(myList) -- 확인용
render(); // + 버튼을 누르면 화면에 출력되게 하는 함수 호출
}
let taskBoard = document.getElementById("task-board")
// 화면에 출력되게 할 함수
function render(){
let resultHTML = ''
for(let i = 0; i < myList.length; i++){
resultHTML +=
`<div class="task">
<span><i class="fa-regular fa-square"></i></span>
<span>${myList[i]}</span>
<span><i class="fa-regular fa-trash-can"></i></span>
</div>`
}
document.getElementById("task-board").innerHTML = resultHTML
}
추가적 기능 1
1. 체크를 누르면 효과 완료되었다는 표시 + 되돌리기 누르면 원래대로 돌아옴
2. 삭제 버튼 활성화
let userInput = document.getElementById("user-input")
let addBtn = document.getElementById("add-button")
let myList = [];
addBtn.addEventListener("click", addTask)
function addTask(){
let task = {
id : randomId(), // 완료, 삭제를 할 때 해당 task만 확인하기 위하여
taskContent : userInput.value, // input에 입력한 값
isComplete : false // 완료 여부
}
myList.push(task)
userInput.value = ""; // 할 일을 입력하고 추가하면 input창 비워짐
render();
}
// 랜덤 ID 만드는 함수
function randomId() {
return Math.random().toString(36).substring(2, 9);
}
let taskBoard = document.getElementById("task-board")
function render(){
let resultHTML = ''
for(let i = 0; i < myList.length; i++){
if(myList[i].isComplete == true) { // isComplete가 true = 완료됨
resultHTML +=
`<div class="task">
<button onclick="checkButton('${myList[i].id}')" class="buttons"><i class="fa-regular fa-square-check"></i> </button>
<span class="doneStyle">${myList[i].taskContent}</span>
<button onclick="deleteButton('${myList[i].id}')" class="buttons")"><i class="fa-regular fa-trash-can"></i></button>
</div>`
// 체크, 삭제버튼을 누르면 이벤트가 발생하는 것을 여기서 inline 형식으로 지정
// 이벤트: 함수 실행(매개변수id) id값을 확인하여 함수를 실행
} else {
resultHTML +=
`<div class="task">
<button onclick="checkButton('${myList[i].id}')" class="buttons"><i class="fa-regular fa-square"></i></button>
<span>${myList[i].taskContent}</span>
<button onclick="deleteButton('${myList[i].id}')" class="buttons"><i class="fa-regular fa-trash-can"></i></button>
</div>`
}
}
document.getElementById("task-board").innerHTML = resultHTML
}
// 체크버튼을 누르면 isComplete가 true로 바뀜
function checkButton(id) {
for(let i = 0; i < myList.length; i++){
if(myList[i].id == id) {
myList[i].isComplete = !myList[i].isComplete;
break;
}
}
console.log(myList)
render(); // 변경되었으니 화면 출력 함수 호출
}
// 삭제버튼을 누르면 삭제 -> myList에서 해당 아이디의 인덱스 삭제
function deleteButton(id) {
for(let i = 0; i < myList.length; i++){
if(myList[i].id == id) {
myList.splice(i,1)
break;
}
}
render(); // 변경되었으니 화면 출력 함수 호출
}
추가적 기능3
탭을 누르면 해당 상태의 리스트가 출력
let userInput = document.getElementById("user-input")
let addBtn = document.getElementById("add-button")
let myList = [];
addBtn.addEventListener("click", addTask)
// tab을 눌렀을 때 정보 가져오기
let tabs = document.querySelectorAll(".task-tabs div")
for(let i = 1; i < tabs.length; i++) {
tabs[i].addEventListener("click", function(event){filter(event)})
// tab을 클릭했을 때 이벤트 발생하는 함수(function(event)) -> filter(event)를 호출하는 것
}
function addTask(){
let task = {
id : randomId(),
taskContent : userInput.value,
isComplete : false
}
myList.push(task)
userInput.value = "";
render();
}
function randomId() {
return Math.random().toString(36).substring(2, 9);
}
let taskBoard = document.getElementById("task-board")
function render(){
// 필터링한 리스트로 화면에 출력
let list = [];
if(mode == "all") {
list = myList; // 만약, mode가 all이라면 화면에 출력할 리스트는 원본의 리스트
} else if(mode == "not-done" || mode == "done"){
list = filterList // 만약, mode가 not-done or done이라면 출력할 리스트는 필터링한 리스트
}
let resultHTML = ''
for(let i = 0; i < list.length; i++){
if(list[i].isComplete == true) {
resultHTML +=
`<div class="task">
<button onclick="checkButton('${list[i].id}')" class="buttons"><i class="fa-regular fa-square-check"></i> </button>
<span class="doneStyle">${list[i].taskContent}</span>
<button onclick="deleteButton('${list[i].id}')" class="buttons")"><i class="fa-regular fa-trash-can"></i></button>
</div>`
} else {
resultHTML +=
`<div class="task">
<button onclick="checkButton('${list[i].id}')" class="buttons"><i class="fa-regular fa-square"></i></button>
<span>${list[i].taskContent}</span>
<button onclick="deleteButton('${list[i].id}')" class="buttons"><i class="fa-regular fa-trash-can"></i></button>
</div>`
}
}
document.getElementById("task-board").innerHTML = resultHTML
}
function checkButton(id) {
for(let i = 0; i < myList.length; i++){
if(myList[i].id == id) {
myList[i].isComplete = !myList[i].isComplete;
break;
}
}
console.log(myList)
render();
}
function deleteButton(id) {
for(let i = 0; i < myList.length; i++){
if(myList[i].id == id) {
myList.splice(i,1)
break;
}
}
render();
}
// 필터링 해주는 함수
let mode = 'all'; // 어느 tab을 누른 것인지 정보 저장할 변수(초기값은 all로 해야 입력했을 때 보임)
let filterList = []; // 필터링한 정보를 담을 배열
function filter(event){
mode = event.target.id // event가 발생한 위치의 id값 저장
filterList = []; // tab을 누를때마다 초기화-> 안하면 누적됨
//1. mode(id)가 all일 때 -> 그냥 화면 출력
if(mode == "all") {
render()
//2. mode가 not-done or done일 때 filterList에 담음
} else if(mode == "not-done") {
for(let i = 0; i < myList.length; i++) {
if(myList[i].isComplete == false) {
filterList.push(myList[i])
}
}
} else if(mode == "done") {
for(let i = 0; i < myList.length; i++) {
if(myList[i].isComplete == true) {
filterList.push(myList[i])
}
}
}
render()
console.log(filterList)
}
기능 보완하기
1. 엔터키를 눌렀을 때 추가하기
-> window.event.key 사용
* 문제점 onkeyup을 사용하면 한글 입력 시 두 개가 입력 된다. -> onkeypress 사용
2. not-done, done 탭에서도 삭제 가능하게 하기
* 문제점
해당 탭에서 삭제를 누르면 화면에 출력은 되지 않음 그러나 all 탭에 가면 삭제되어 있음
-> 리스트에서는 삭제가 되었는데 출력이 바로 안됨.
* 해결
체크, 삭제 버튼을 눌렀을 때도 filter()를 거쳐야 한다.
깃허브
https://github.com/davin1221/ToDoList
GitHub - davin1221/ToDoList
Contribute to davin1221/ToDoList development by creating an account on GitHub.
github.com
사이트
https://dvtodolist2.netlify.app/
'JS > JavaScript' 카테고리의 다른 글
15. Spread & Rest Operator / Destructuring (0) | 2023.03.25 |
---|---|
14. 클래스 (0) | 2023.03.24 |
13. 최신 자바스크립트 기술: ES6 문법 (0) | 2023.03.04 |
12. 함수 (0) | 2023.03.04 |
11. DOM (0) | 2023.03.04 |