🔥 #17 javascript(Todo List)

박준석·2022년 9월 18일
0

javascript

목록 보기
17/22
post-thumbnail

🔥Todo List 만들기..

이번에 작성할 글은 TODO LIST를 만들어 보는 것이다. 처음 배워서 이해하기 힘들었지만. 최대한 이해하려고 노력하면 강의를 몇번이나 들었는지 모르겠다.

GIT 코드보기
TODO LIST 프로젝트보기

프로젝트 만드는 조건
1. 유저가 값을 입력한다.
2. '+' 버튼을 클릭하면, 할일이 추가된다.
3. delete 버튼을 누르면 할일이 삭제된다.
4. check 버튼을 누르면 할일이 끝나면서 밑줄이 간다.
4-1. check 버튼을 클릭하는 순간 true -> false
4-2. true 이면 끝난걸로 간주하고 밑줄보여주기
4-3. false이면 안끝난걸로 간주하고 그대로
5. 진행중 끝남 탭을 누르면, 언더바가 이동한다.
6. 끝남탭은, 끝난 아이템만, 진행중탭은 진행중인 아이템만
7. 전체탭을 누르면 다시 전체 아이템으로 돌아옴.

🐱HTML

<!DOCTYPE html>
<html lang="ko">
<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">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
    <link rel="stylesheet" href="style.css">
    <title>TODO LIST</title>
</head>
<body>
    <div class="container">
        <h1>TODO LIST</h1>
        <section class="input-area">
            <input type="text" class="inputStyle" id="input-task">
            <button id="addBtn" class="addBtn"><i class="fa-solid fa-plus"></i></button>
        </section>
        <section class="tabs-area">
            <div class="task-tabs">
                <div id="under-line"></div>
                <div id="all">
                    All
                </div>
                <div id="ongoing">
                    not Done
                </div>
                <div id="done">
                    Done
                </div>
            </div>
            <div id="text-area">

            </div>
        </section>
    </div>


    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script>
    <script src="https://kit.fontawesome.com/ce31c7bfd0.js" crossorigin="anonymous"></script>
    <script src="main.js"></script>
</body>
</html>

🐱JAVASCRIPT

// 유저가 값을 입력한다.
// + 버튼을 클릭하면, 할일이 추가된다.
// delete 버튼을 누르면 할일이 삭제된다.
// check 버튼을 누르면 할일이 끝나면서 밑줄이 간다.
// 1. check 버튼을 클릭하는 순간 true -> false
// 2. true 이면 끝난걸로 간주하고 밑줄보여주기
// 3. false이면 안끝난걸로 간주하고 그대로
// 진행중 끝남 탭을 누르면, 언더바가 이동한다.
// 끝남탭은, 끝난 아이템만, 진행중탭은 진행중인 아이템만
// 전체탭을 누르면 다시 전체 아이템으로 돌아옴.

let taskInput = document.getElementById("input-task"); // input값을 할당.
let addBtn = document.getElementById("addBtn"); // button +의 값을 할당.
let tabs = document.querySelectorAll(".task-tabs div"); //task-tabs 안에 있는 div를 전부 할당
let underLine = document.getElementById("under-line");
let taskList = []; //할일리스트 배열 할당.
let filterList =[]; //탭을 바꿀 때 taskList가 지워지지 않게 따로 배열 할당
let mode ="all"; //처음은 all 탭으로 설정.

let checkShow = document.getElementById("checkBtn"); //check 버튼 할당.

//이벤트 함수 선언
// +버튼을 누르면 리스트를 추가하는 함수 선언.
addBtn.addEventListener("click", add); 

// focus 마우스가 입력창에 커서를 올려놓을때.
taskInput.addEventListener("focus", showFocus);

// enter눌렀을 때 입력창에 있는 데이터 입력하기.
taskInput.addEventListener("keypress", function(event){
    if(event.keyCode===13){
        add();
        taskInput.value="";
    };
});

// 마우스를 눌렀을 때 입력창 값 초기화
function showFocus(){
    taskInput.value ="";
}

// all, not done, done 탭을 클릭할 때 filter(event)함수 실행.
for(let i=1; i<tabs.length; i++){
    tabs[i].addEventListener("click",function(event){
        filter(event);
    });
};

// + 버튼을 클릭하면, 할일이 추가된다.
// 버튼 추가 함수 생성
function add(){
    let task ={
        // 항목을 지울 때 컴퓨터가 어떤 것을 지울지 알아야하는데 
        // 사람처럼 주민번호가 다 있듯이 각 항목에도 id가 있어야한다.
        id : randomIDGenerate(),
        taskContent : taskInput.value,
        isComplete : false
    };
    taskList.push(task); // taskList에 task에 있는 객체 정보를 입력.

    render(); // render 함수 실행.
};

// 버튼을 눌렀을 때 추가해야할 리스트 출력 내용
function render(){
    let list=[]; //taskList안에 있는 내용이 삭제 되지 않기 위해.
    if(mode=="all"){
        list=taskList; //all탭을 선택 시 list 배열에 taskList 배열을 할당.
    } else if(mode=="ongoing"){
        list=filterList; //not done 탭을 선택 시 list 배열에 filterList 배열을 할당.
    } else if(mode=="done"){
        list=filterList; //done 탭을 선택 시 list 배열에 filterList 배열을 할당.
    }

    let resultHTML="";
    for(let i=0;i<list.length; i++){ //taskList배열안에 있는 것을 하나하나 꺼내..
        if(list[i].isComplete == true){ //list[i] 번째가 isComplete가 ture 일때 resultHTML변수에 저장.
            resultHTML+=`<div class="task">
            <div class="task-done">${list[i].taskContent}</div>
            <div class="btnArea">
                <buttontoken interpolation">${list[i].id}')" class="checkBtn"><i class="fa-solid fa-arrow-rotate-left"></i></button>
                <buttontoken interpolation">${list[i].id}')" class="trashBtn"><i class="fa-solid fa-trash"></i></button>
            </div>
        </div>`
        } else{ //list[i] 번째가 isComplete가 false 일때 resultHTML변수에 저장.
            resultHTML+=`<div class="task">
            <div class="task-ndone">${list[i].taskContent}</div>
            <div>
                <buttontoken interpolation">${list[i].id}')" class="checkBtn"><i class="fa-solid fa-check"></i></button>
                <buttontoken interpolation">${list[i].id}')" class="trashBtn"><i class="fa-solid fa-trash"></i></button>
            </div>
        </div>`
        }
    }
	//저장된 resultHTML 값을 id가 text-area인 항목에 html에 출력.
    document.getElementById("text-area").innerHTML = resultHTML;
}

// 체크버튼 누를 때 이벤트 적용
function checkBtn(id){
        for(let i=0; i<taskList.length; i++){ //i부터 i보다 taskList.length가 클 때까지 i를 하나씩 증가
            if(taskList[i].id == id){ //만약에 taskList[i]번째 id 값이 id값과 같다면 taskList[i].iscomplete를 !taskList[i].iscomplete로 바꾼다.
                taskList[i].isComplete = !taskList[i].isComplete;
                break; //하나라도 참이면 브레이크! if문을 나온다.
            }
        }
        render(); // for문이 끝나면 render() 함수 실행.
    }

// 삭제버튼 누를 때 이벤트 적용
function trashBtn(id){
    if(mode=="all"){ //만약에 all탭을 선택하면
        for(let i=0; i<taskList.length; i++){ //i가 0부터 i보다 taskList.length가 클 때 까지 i를 증가시킨다. 
            if(taskList[i].id == id){ //만약에 taskList[i]번째 id 값이 id값과 같다면 i번째 부터 1개의 리스트를 삭제한다.
                taskList.splice(i,1);
                break;//하나라도 참이면 브레이크! if문을 나온다.
            }
        }
        render(); // for문이 끝나면 render() 함수 실행.
    } else if(mode=="ongoing"||mode=="done") { //만약에 not done탭 또는 done탭을 선택하면
        for(let i=0; i< filterList.length; i++){ //i가 0부터 i보다 taskList.length가 클 때 까지 i를 증가시킨다. 
            if(filterList[i].id == id || taskList[i].id == id){ //만약에 taskList[i]번째 id 값 과 ilterList[i]번째 id 값인 둘중 하나라도 id값 같다면 i번째 부터 1개의 리스트를 삭제한다.
                filterList.splice(i,1);
                for(let i=0; i<taskList.length; i++){
                    if(taskList[i].id == id){ // all탭에 있는 태스크도 같이 지운다.
                        taskList.splice(i,1);
                        break;//하나라도 참이면 브레이크! if문을 나온다.
                    }
                }
                break;//하나라도 참이면 브레이크! if문을 나온다.
            }
        }
        render();// for문이 끝나면 render() 함수 실행.
    } 
}

function filter(event){
    mode=event.target.id; //event가 발생하는 요소 id 호출 함수.(all, ongoing, done)
    filterList= []; //  filterList 배열 초기화

    // 하단 바..
    underLine.style.transition="1s"; // underLine이 움직일 때 1초정도 느리게.
    
    underLine.style.width = event.target.offsetWidth + "px";// offsetwidth는 아이템의 가로길이
    underLine.style.left = event.target.offsetLeft + "px";// offsetleft는 아이템의 왼쪽만큼 여백
    underLine.style.top = event.target.offsetTop + (event.target.offsetHeight -4) + "px"; // offsettop은 아이템의 위쪽만큼 여백, offsetHeight는 아이템의 세로길이
    // 하단 바 끝.

    if(mode=="all"){ //all탭을 선택하면 render()함수 출력
        render();
    } else if(mode=="ongoing"){ //not done탭을 선택하면 taskList[i]의 isComplete가 false면 filterList리스트 배열의 taskList[i]번째를 추가 후 다끝났다면 render();함수 출력
        for(let i=0; i<taskList.length; i++){
            if(taskList[i].isComplete==false){
                filterList.push(taskList[i]);
            }
        }
        render();
    } else if(mode=="done"){ //done탭을 선택하면 taskList[i]의 isComplete가 true면 filterList리스트 배열의 taskList[i]번째를 추가 후 다끝났다면 render();함수 출력
        for(let i=0; i<taskList.length; i++){
            if(taskList[i].isComplete==true){
                filterList.push(taskList[i]);
            }
        }
        render();
    }
}

// 랜덤아이디 출력.
function randomIDGenerate(){
    return '_' + Math.random().toString(36).substr(2, 9);
}
profile
안녕하세요 프론트엔드 개발자입니다. 글을 이전 중입니다.

0개의 댓글