javascript, jQuery, DOM, CSS 활용
자바스크립트를 공부하며 간단한 달력(Calendar)을 만들어 보았습니다.
주로 자바스크립트로 생성하기 위해 HTML은 최소한으로 사용하였습니다.
아래는 전체 소스코드(간단히 메모장에 text.html로 저장해도 확인가능)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 | <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>Calendar</title> <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script> <style type="text/css"> .cal_top{ text-align: center; font-size: 30px; } .cal{ text-align: center; } table.calendar{ border: 1px solid black; display: inline-table; text-align: left; } table.calendar td{ vertical-align: top; border: 1px solid skyblue; width: 100px; } </style> </head> <body> <div class="cal_top"> <a href="#" id="movePrevMonth"><span id="prevMonth" class="cal_tit"><</span></a> <span id="cal_top_year"></span> <span id="cal_top_month"></span> <a href="#" id="moveNextMonth"><span id="nextMonth" class="cal_tit">></span></a> </div> <div id="cal_tab" class="cal"> </div> <script type="text/javascript"> var today = null; var year = null; var month = null; var firstDay = null; var lastDay = null; var $tdDay = null; var $tdSche = null; $(document).ready(function() { drawCalendar(); initDate(); drawDays(); $("#movePrevMonth").on("click", function(){movePrevMonth();}); $("#moveNextMonth").on("click", function(){moveNextMonth();}); }); //calendar 그리기 function drawCalendar(){ var setTableHTML = ""; setTableHTML+='<table class="calendar">'; setTableHTML+='<tr><th>SUN</th><th>MON</th><th>TUE</th><th>WED</th><th>THU</th><th>FRI</th><th>SAT</th></tr>'; for(var i=0;i<6;i++){ setTableHTML+='<tr height="100">'; for(var j=0;j<7;j++){ setTableHTML+='<td style="text-overflow:ellipsis;overflow:hidden;white-space:nowrap">'; setTableHTML+=' <div class="cal-day"></div>'; setTableHTML+=' <div class="cal-schedule"></div>'; setTableHTML+='</td>'; } setTableHTML+='</tr>'; } setTableHTML+='</table>'; $("#cal_tab").html(setTableHTML); } //날짜 초기화 function initDate(){ $tdDay = $("td div.cal-day") $tdSche = $("td div.cal-schedule") dayCount = 0; today = new Date(); year = today.getFullYear(); month = today.getMonth()+1; firstDay = new Date(year,month-1,1); lastDay = new Date(year,month,0); } //calendar 날짜표시 function drawDays(){ $("#cal_top_year").text(year); $("#cal_top_month").text(month); for(var i=firstDay.getDay();i<firstDay.getDay()+lastDay.getDate();i++){ $tdDay.eq(i).text(++dayCount); } for(var i=0;i<42;i+=7){ $tdDay.eq(i).css("color","red"); } for(var i=6;i<42;i+=7){ $tdDay.eq(i).css("color","blue"); } } //calendar 월 이동 function movePrevMonth(){ month--; if(month<=0){ month=12; year--; } if(month<10){ month=String("0"+month); } getNewInfo(); } function moveNextMonth(){ month++; if(month>12){ month=1; year++; } if(month<10){ month=String("0"+month); } getNewInfo(); } function getNewInfo(){ for(var i=0;i<42;i++){ $tdDay.eq(i).text(""); } dayCount=0; firstDay = new Date(year,month-1,1); lastDay = new Date(year,month,0); drawDays(); } </script> </body> </html> | cs |
HTML
<body> 부분 html은 DOM을 사용하기 위한 id와 class 그리고 월 이동을 위한 부분을 작성
1 2 3 4 5 6 7 8 | <div class="cal_top"> <a href="#" id="movePrevMonth"><span id="prevMonth" class="cal_tit"><</span></a> <span id="cal_top_year"></span> <span id="cal_top_month"></span> <a href="#" id="moveNextMonth"><span id="nextMonth" class="cal_tit">></span></a> </div> <div id="cal_tab" class="cal"> </div> | cs |
<Script>
<div id="cal_tab"> 부분에 Calendar의 밑그림을 그린다.
'cal-day'는 날짜를 적어놓기 위한 div, 'cal-schedule'은 스케쥴을 표시하기위해 임의로 생성해 두었다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | //calendar 그리기 function drawCalendar(){ var setTableHTML = ""; setTableHTML+='<table class="calendar">'; setTableHTML+='<tr><th>SUN</th><th>MON</th><th>TUE</th><th>WED</th><th>THU</th><th>FRI</th><th>SAT</th></tr>'; for(var i=0;i<6;i++){ setTableHTML+='<tr height="100">'; for(var j=0;j<7;j++){ setTableHTML+='<td style="text-overflow:ellipsis;overflow:hidden;white-space:nowrap">'; setTableHTML+=' <div class="cal-day"></div>'; setTableHTML+=' <div class="cal-schedule"></div>'; setTableHTML+='</td>'; } setTableHTML+='</tr>'; } setTableHTML+='</table>'; $("#cal_tab").html(setTableHTML); } | cs |
밑그림이 그려진 Calendar에 날짜를 표시
이 코드는 자바스크립트 즉 클라이언트에서 날짜를 가져와 사용하고있다. today = new Date();
개인적인 웹 페이지에서는 상관이 없으나 날짜 데이터가 정확히 기록되어야 하는 웹에서는 today 데이터를 서버단에서 받아와야 한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | var today = null; var year = null; var month = null; var firstDay = null; var lastDay = null; var $tdDay = null; var $tdSche = null; //날짜 초기화 function initDate(){ $tdDay = $("td div.cal-day") $tdSche = $("td div.cal-schedule") dayCount = 0; today = new Date(); year = today.getFullYear(); month = today.getMonth()+1; firstDay = new Date(year,month-1,1); lastDay = new Date(year,month,0); } //calendar 날짜표시 function drawDays(){ $("#cal_top_year").text(year); $("#cal_top_month").text(month); for(var i=firstDay.getDay();i<firstDay.getDay()+lastDay.getDate();i++){ $tdDay.eq(i).text(++dayCount); } for(var i=0;i<42;i+=7){ $tdDay.eq(i).css("color","red"); } for(var i=6;i<42;i+=7){ $tdDay.eq(i).css("color","blue"); } } | cs |
월 변경시 변수 값을 바꾸고 일자를 새로고침
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | //calendar 월 이동 function movePrevMonth(){ month--; if(month<=0){ month=12; year--; } if(month<10){ month=String("0"+month); } getNewInfo(); } function moveNextMonth(){ month++; if(month>12){ month=1; year++; } if(month<10){ month=String("0"+month); } getNewInfo(); } function getNewInfo(){ for(var i=0;i<42;i++){ $tdDay.eq(i).text(""); } dayCount=0; firstDay = new Date(year,month-1,1); lastDay = new Date(year,month,0); drawDays(); } | cs |
페이지가 정리된 후 실행되는 ready함수
밑그림을 DOM을 사용하여 그렸기 때문에 초기화 순서를 맞춰줄 필요가 있다.
1 2 3 4 5 6 7 | $(document).ready(function() { drawCalendar(); initDate(); drawDays(); $("#movePrevMonth").on("click", function(){movePrevMonth();}); $("#moveNextMonth").on("click", function(){moveNextMonth();}); }); | cs |
----- 2019.08.27 수정 -----
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 | <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>Calendar</title> <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script> <style type="text/css"> .cal_top{ text-align: center; font-size: 30px; } .cal{ text-align: center; } table.calendar{ border: 1px solid black; display: inline-table; text-align: left; } table.calendar td{ vertical-align: top; border: 1px solid skyblue; width: 100px; } </style> </head> <body> <div class="cal_top"> <a href="#" id="movePrevMonth"><span id="prevMonth" class="cal_tit"><</span></a> <span id="cal_top_year"></span> <span id="cal_top_month"></span> <a href="#" id="moveNextMonth"><span id="nextMonth" class="cal_tit">></span></a> </div> <div id="cal_tab" class="cal"> </div> <script type="text/javascript"> var today = null; var year = null; var month = null; var firstDay = null; var lastDay = null; var $tdDay = null; var $tdSche = null; var jsonData = null; $(document).ready(function() { drawCalendar(); initDate(); drawDays(); drawSche(); $("#movePrevMonth").on("click", function(){movePrevMonth();}); $("#moveNextMonth").on("click", function(){moveNextMonth();}); }); //Calendar 그리기 function drawCalendar(){ var setTableHTML = ""; setTableHTML+='<table class="calendar">'; setTableHTML+='<tr><th>SUN</th><th>MON</th><th>TUE</th><th>WED</th><th>THU</th><th>FRI</th><th>SAT</th></tr>'; for(var i=0;i<6;i++){ setTableHTML+='<tr height="100">'; for(var j=0;j<7;j++){ setTableHTML+='<td style="text-overflow:ellipsis;overflow:hidden;white-space:nowrap">'; setTableHTML+=' <div class="cal-day"></div>'; setTableHTML+=' <div class="cal-schedule"></div>'; setTableHTML+='</td>'; } setTableHTML+='</tr>'; } setTableHTML+='</table>'; $("#cal_tab").html(setTableHTML); } //날짜 초기화 function initDate(){ $tdDay = $("td div.cal-day") $tdSche = $("td div.cal-schedule") dayCount = 0; today = new Date(); year = today.getFullYear(); month = today.getMonth()+1; if(month < 10){month = "0"+month;} firstDay = new Date(year,month-1,1); lastDay = new Date(year,month,0); } //calendar 날짜표시 function drawDays(){ $("#cal_top_year").text(year); $("#cal_top_month").text(month); for(var i=firstDay.getDay();i<firstDay.getDay()+lastDay.getDate();i++){ $tdDay.eq(i).text(++dayCount); } for(var i=0;i<42;i+=7){ $tdDay.eq(i).css("color","red"); } for(var i=6;i<42;i+=7){ $tdDay.eq(i).css("color","blue"); } } //calendar 월 이동 function movePrevMonth(){ month--; if(month<=0){ month=12; year--; } if(month<10){ month=String("0"+month); } getNewInfo(); } function moveNextMonth(){ month++; if(month>12){ month=1; year++; } if(month<10){ month=String("0"+month); } getNewInfo(); } //정보갱신 function getNewInfo(){ for(var i=0;i<42;i++){ $tdDay.eq(i).text(""); $tdSche.eq(i).text(""); } dayCount=0; firstDay = new Date(year,month-1,1); lastDay = new Date(year,month,0); drawDays(); drawSche(); } //2019-08-27 추가본 //데이터 등록 function setData(){ jsonData = { "2019":{ "07":{ "17":"제헌절" } ,"08":{ "7":"칠석" ,"15":"광복절" ,"23":"처서" } ,"09":{ "13":"추석" ,"23":"추분" } } } } //스케줄 그리기 function drawSche(){ setData(); var dateMatch = null; for(var i=firstDay.getDay();i<firstDay.getDay()+lastDay.getDate();i++){ var txt = ""; txt =jsonData[year]; if(txt){ txt = jsonData[year][month]; if(txt){ txt = jsonData[year][month][i]; dateMatch = firstDay.getDay() + i -1; $tdSche.eq(dateMatch).text(txt); } } } } </script> </body> </html> | cs |
하단에 setData(), drawSche() 추가하였습니다.
데이터를 추가하는방법은 여러 방법이 있을 테지만 단일파일로 작성한다는 전제하에 setData처럼 json형태를 임의로 넣었습니다.
DB에서 데이터를 받아오거나 혹은 xml파일을 추가해 데이터를 얻어와 뿌리는 방식이 더 효율적일겁니다.
drawSche()함수는 일자와 같이 데이터를 그려주지만
오류를 없애주기 위해 위와같은 조건을 두었습니다.
'Front-End > JavaScript' 카테고리의 다른 글
[JavaScript] IE에서 Audio 사용하기 (0) | 2019.05.21 |
---|---|
[JavaScript] 이미지 파일 리사이징 (0) | 2018.10.08 |