DOM 관련 세번째 과제였던 달력 과제를 리뷰하겠습니다.
Todo
1. 아래 이미지의 달력과 기능 및 스타일이 최대한 일치하도록 달력을 만들시오. 과거나 미래의 연도 또한 보여줄 수 있어야 합니다.
2. 달력 아래에는 Todo List를 만들어야 합니다.
3.Todo List는 날짜별로 관리되기 때문에, 날짜를 클릭할때마다 Todo List는 클릭된 날짜에 해당하는 Todo List를 보여주어야 합니다.
아래 사항들이 충족되어야 Pass 입니다.
날짜 및 요일 확인 가능(작년, 재작년, 내년 등 모두 포함)
날짜 선택 기능
선택된 날짜 표기 기능(날짜 숫자색 변경)
날짜 선택 시, 해당 날짜에 대한 Todo List 보여주기 기능
Todo List에 Todo Item 추가 기능(해당 날짜의 Todo Item으로 추가됨)
다른 날짜 선택시, 새롭게 선택된 날짜에 대한 Todo List 보여주기 기능
Markup(마크업) 작업
body
태그 안에 컨텐츠의 최상위 태그로main
div 태그를 만들었습니다. 그 밑에content-wrap
div 태그를 만들었습니다.content-left
div 태그는 달력 왼쪽에 큰 글자와 숫자로 클릭된 날짜와 요일을 보여주고 밑에는 Todo-List가 들어갈 공간으로 만들었습니다.content-rigth
div 태그는 달력 오른쪽에 매달 달력을 출력할 공간입니다. 위에는 월과 연도를 보여주고 그 밑에는 요일을 보여줍니다.table
을 만들어tr
과td
태그를 자바스크립트로 생성해 매달 달라지는 요일과 날짜를 출력할 예정입니다. (그래서 마크업에선 빈 공간으로 두었습니다.)main-wrap
div 태그 밑에는main-day
와main-date
div 태그가 있는데 있는 큰 숫자와 글자로 클릭된 날짜와 요일을 넣을 공간입니다.todo-wrap
div 태그 밑에는todo-title
과input-wrap
div 태그가 있습니다.todo-title
은 “Todo List” 글자를 넣어 todo-list 제목을 보여주고input-wrap
에는input
태그와botton
태그를 넣어서 todo-list를 받을 예정입니다.
CSS 작업
JavaScript 작업
1.달력 출력하기
Date
객체를 이용해서 오늘의 날짜와 연도, 요일 등의 정보를 모두 담습니다.- 윤년을 체크하기 위해서
first.getFullYear() % 4 === 0
으로 체크합니다. 윤년일 경우leapYear
배열을pageYear
에 담고 아닐 경우notLeapYear
배열을pageYear
에 담습니다.leapYear
배열과notLeapYear
배열에는 각각 1월부터 12월까지 총 일수가 들어있습니다. showCalendar
함수 안에서는 for문을 두 번 돌립니다. 첫 번째 for문은 주(week)를 만들고 두 번째 for문은 일(date)을 만듭니다. 첫 번째 for문에서는 주(week)를 만들기 때문에 6번만 돌립니다.(최대 6주) 먼저document.createElement('tr');
로tr
요소를 생성합니다. 그 다음 두 번째 for문에서는i === 0 && j < first.getDay()
를 체크합니다. 이 조건은 만약 첫 번째 주라면 시작하는 요일부터 날짜를 출력하기 위해 설정한 것입니다.cnt > pageYear[first.getMonth()]
이 조건은 달력 출력 종료 조건입니다. 월마다 총 일수가 다르기 때문에 어떤 달은 30일이 마지막 날이고 어떤 달은 31일이 마지막 날입니다. 앞에 2번에서pageYear
에 월마다 총 일수를 담아 놓았기 때문에 비교해서 날짜를 출력하면 됩니다.appendChild($td)
와appendChild($tr)
로 생성된 요소들을 DOM 트리에 넣었습니다.- 추후 달력 업데이트를 위해서
removeCalendar
또한 미리 만들었습니다.
2. 이전 달과 다음 달로 이동하기
pageFirst
(월 첫번째 날에 대한 정보)와pageYear
를 업데이트합니다.prev
(이전 달로 이동하는 함수)는 1월인지를 확인해서 연도를 변경하고next
(다음 달로 이동하는 함수)는 12월인지를 확인해서 연도를 업데이트합니다.today
또한Date
객체를 새로 생성해 업데이트 해줍니다.- 마지막으로 다시
showCalendar
함수를 실행합니다.
3. 클릭해서 날짜 색상 변경 & 왼쪽 화면 변경
clickStart
함수 안에서 for문을 돌면서 모든 날에addEventListener
이벤트 처리기를 담아 놓고 클릭하면changeToday
함수 안에서는 for문을 통해서 모든 날짜에active
클래스가 있는지 확인하고 있다면active
클래스를 삭제하고e.currentTarget
을 통해서 이벤트 처리기가 달려있는 요소에active
클래스를 추가해줍니다.showMain
함수는 업데이트 된today
객체 정보를 이용해서 왼쪽 화면의 날짜와 요일을 업데이트 해줍니다.innerHTML = dayList[today.getDay()];
와innerHTML = today.getDate();
를 통해서 정보를 업데이트합니다.
4. Todo-List 입력, 체크, 삭제하기
addTodoList
함수는input
받은value
를 이용해서Todo-List
를 만듭니다.document.createElement('div');
로 div 태그를 만들어input
의value
를 담고document.createElement('button');
로 button 태그르 만들어 삭제 버튼를 만듭니다.appendChild
를 이용해서 두 태그 다inputList
에 넣어줍니다.reshowingList
함수는 업데이트된 날짜의TodoList
로 업데이트해줍니다. 먼저 forEach문으로 현재 있는 요소들은 삭제합니다.- 이후에는
todoList
배열에 담겨 있는TodoList
데이터를 이용해 다시 해당 날짜의TodoList
를 업데이트해줍니다.