📚 Study/Javascript
Javascript :: 자바스크립트 table 활용 (동적 테이블, 만년 달력)
bono-hye
2023. 12. 10. 23:56
# Test024
✔ 입력받은 데이터를 테이블 형태로 붙여넣기
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Test024.html</title>
<script>
function addMember()
{
var name = document.getElementById("txtName").value; // "고길동"
var tel = document.getElementById("txtTel").value; // "010-5555-5555"
var addr = document.getElementById("txtAddr").value; // "경기도 분당"
// table 엘리먼트 접근 (#memberTbl)
var tableNode = document.getElementById("memberTbl");
// tbody 엘리먼트 접근 → 사용하지 않는 경우 생략
// ※ 주의. 브라우저에 따라 다른 결과
/*
if (tableNode.chileNodes[0].nodeType==1)
{
tbodyNode = tableNode.chileNodes[0]; // IE
}
else
{
tbodyNode = tableNode.chileNodes[1]; // CR(크롬), FF
}
*/
var trNode = document.createElement("tr"); // <tr></tr> Test024.html 문서에 tr이라는 엘리먼트가 생성
// <tr></tr> 엘리먼트 동적 생성
// <td></td> 엘리먼트 동적 생성
/* 아래 내용은 데이터가 입력되면 계속해서 실행될테니 따로 빼서 함수로 만들자!
var tdNode1 = document.createElement("td"); // <td></td>
var nameNode = document.createTextNode(name); // <td> 노드에 추가할 "고길동" 텍스트 노드 생성
var tdNode2 = document.createElement("td"); // <td></td>
var telNode = document.createTextNode(tel); // <td> 노드에 추가할 "010-5555-5555" 텍스트 노드 생성
var tdNode3 = document.createElement("td"); // <td></td>
var addrNode = document.createTextNode(addr); // <td> 노드에 추가할 "경기도 분당" 텍스트 노드 생성
tdNode1.appendChild(nameNode); // <td>"고길동"</td>
tdNode2.appendChild(telNode); // <td>"010-5555-5555"</td>
tdNode3.appendChild(addNode); // <td>"경기도 분당"</td>
*/
trNode.appendChild(createTdNode(name)); // <tr><td>"고길동"</td></tr>
trNode.appendChild(createTdNode(tel)); // <tr><td>"고길동"</td><td>"010-5555-5555"</td></tr>
trNode.appendChild(createTdNode(addr)); // <tr><td>"고길동"</td><td>"010-5555-5555"</td><td>"경기도 분당"></td></tr>
tableNode.appendChild(trNode);
}
function createTdNode(val)
{
var textNode = document.createTextNode(val);
var tdNode = document.createElement("td");
tdNode.appendChild(textNode);
return tdNode;
}
</script>
</head>
<body>
<div>
<h1>자바스크립트를 활용한 테이블 동적 생성</h1>
<hr>
</div>
<div>
<form>
이름 <input type="text" id="txtName" class="txt"><br>
전화번호 <input type="text" id="txtTel" class="txt"><br>
주소 <input type="text" id="txtAddr" class="txt"><br>
<br>
<button type="button" onclick="addMember()">회원 정보 입력</button>
<br><br><br>
<table border="1" id="memberTbl">
<tr>
<td>이름</td><td>전화번호</td><td>주소</td>
</tr>
<tr>
<td>홍길동</td><td>010-1111-1111</td><td>제주 서귀포</td>
</tr>
<tr>
<td>둘리</td><td>010-2222-22232</td><td>전남 여수</td>
</tr>
<tr>
<td>또치</td><td>010-3333-3333</td><td>경남 산청</td>
</tr>
<tr>
<td>희동이</td><td>010-4444-4444</td><td>서울 마포구</td>
</tr>
</table>
</form>
</div>
</body>
</html>
# Test025 (만년 달력 만들기)
✔ 달력 테이블을 생성하는데 3가지 방법으로 풀이 (① 기존 테이블 활용, ② tbody 활용, ③ 새로운 달력 그리기)
<script type="text/javascript">
function actionCalender()
{
// 사용자가 입력한 년, 월 가져오기
var yearStr = document.getElementById("txtYear").value;
var monthStr = document.getElementById("txtMonth").value;
// 문자열 형태로 확인해 볼 수 있는 유효성 검사 코드 삽입 가능~!!!
var year = parseInt(yearStr);
var month = parseInt(monthStr);
if (year < 1 || month < 1 || month > 12)
{
alert("입력한 년 또는 월이 유효하지 않습니다~!!!")
return;
}
// ※ 사용자가 입력한 년도, 월 → 여기에 해당하는 1일의 요일 알아내기~!!!
var total = 0;
// 1단계. 1년 1월 1일 부터... 입력 년도 기준 전년도 12월 31일 까지의 총 날짜 수 구하기
total = (year-1)*365 + parseInt((year-1)/4) - parseInt((year-1)/100) + parseInt((year-1)/400);
// 자바는 몫을 정수 형태로 반환하지만, 자바스크립트는 실수 형태로 나올 수도 있기 때문에
// parseInt / Math.floor를 사용해서 정수로 뽑아냄
// 2단계. 해당 년도의 1월 1일 부터... 해당 년도 해당 월 1일 까지의 총 날짜 수 구해서
// 1단계에 더하기
var m = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
// ⓐ
/*
for (var i = 0; i < month-1; i++)
total += m[i];
total++;
if (month >= 3 && (year%4==0) && (year%100!=0) || (year%400==0))
total++;
*/
// ⓑ
if ((year%4==0) && (year%100!=0) || (year%400==0))
m[1] = 29;
for (var i = 0; i < month-1; i++)
total += m[i];
total++;
// 3단계. 해당 년도 해당 월의 첫 날(1일)의 요일 구하기
var days = total % 7;
// 확인
//alert(days);
//--==> 5 (2024년 3월 기준) → 2024년 3월 1일은 금요일
// 2 (2023년 8월 기준) → 2023년 8월 1일은 화요일
// 4단계. 해당 년도 해당 월의 마지막 날짜 구하기
// (28일 or 29일 or 30일 or 31일)
var lastDay = m[month-1];
// 위에서 ⓐ 방식으로 처리했을 경우는 추가 연산 필요
/*
if (month==2 && ((year%4==0) && (year%100!=0) || (year%400==0)))
{
lastDay = 29;
}
*/
// 5단계. 해당 년도 해당 월 기준 달력 구성(출력, 그리기)
// 5단계는 3가지의 풀이 방식이 있음. 아래에서 확인
/*
5 단계 풀이
*/
function createTdNode(val) //"홍길동"
{
var textNode = document.createTextNode(val); // └"홍길동"
var tdNode = document.createElement("td"); // <td></td>
tdNode.appendChild(textNode); // <td></td>
// └"홍길동"
return tdNode; // <td>홍길동</td>
}
</script>
</head>
<body>
<div>
<h1>테이블 동적 생성으로 만년달력 그리기</h1>
<hr>
</div>
<div>
<form>
<input type="text" id="txtYear" class="txt"> 년
<input type="text" id="txtMonth" class="txt"> 월
<br><br>
<input type="button" class="btn" value="만년달력 그리기" onclick="actionCalender()">
<br><br>
<table border="1" id="calendarTbl">
<tr>
<th>일</th>
<th>월</th>
<th>화</th>
<th>수</th>
<th>목</th>
<th>금</th>
<th>토</th>
</tr>
</table>
<br><br>
<!-- <div id="newCalendarBox"></div> -->
</form>
</div>
</body>
</html>
① 기존 테이블 활용
<script type="text/javascript">
var tableNode = document.getElementById("calendarTbl");
// <table id = "calendarTbl">...</table>
var trNode = document.createElement("tr"); //<tr></tr>
// - 해당 월의 1일이 시작되기 전에 빈 칸 td 채우기
for (var i=0; i<days; i++)
{
trNode.appendChild(createTdNode(""));
}
// - 1일 부터... 해당 월의 마지막 날짜까지 td 채우기
var d=1;
for (d=1; d<=lastDay; d++)
{
trNode.appendChild(createTdNode(d)) // 어떤 형태인지 확인
// 일요일을 그리기 시작할 때, 기존 tr 구성을 마무리하고 다시 새로운 tr 을 구성
// check~!!! -----------------------------------------
if ((d+days)%7==0) // 일요일을 그리기 전에...
{
tableNode.appendChild(trNode); // trNode 를 tableNode 에 추가
trNode = document.createElement("tr"); // 새로운 trNode 구성
}
// check~!!! -----------------------------------------
}
// 확인
//-- 31일까지 출력한 날짜에서 확인
//alert(d);
//--==>> 32
// 그래서 아래 조건문 구성 할 때, d-1 해줌
// - 날짜 구성 이후 마지막 빈 칸 td 채우기
// (최종적으로 처리된 날짜가 일요일 개행이 적용되지 않은 경우만...)
if ( ((d-1)+days)%7 != 0 )
{
for (var i=0; i<7; i++, d++) // check~!!! 『d++』
{
trNode.appendChild(createTdNode(""));
if ((d+days)%7==0)
{
tableNode.appendChild(trNode);
break;
}
}
}
</script>
② tdody 활용하기
<script type="text/javascript">
var tableNode = document.getElementById("calendarTbl");
var tbodyNode = null;
if (tableNode.childNodes[0].nodeType==1)
tbodyNode = tableNode.childNodes[0];
else
tbodyNode = tableNode.childNodes[1];
// tbodyNode 의 기존 자식 노드 삭제 과정
for (var n=tbodyNode.childNodes.length-1; n>=0; n--) // 1 0
{
tbodyNode.removeChild(tbodyNode.childNodes[n]);
}
var trNode = document.createElement("tr"); //<tr></tr>
// 요일 이름 다시 출력하기
var dayNames = ["일요일", "월요일", "화요일", "수요일", "목요일", "금요일", "토요일"];
for (var i=0; i<dayNames.length; i++)
{
trNode.appendChild(createTdNode(dayNames[i]));
}
tbodyNode.appendChild(trNode);
var trNode = document.createElement("tr"); //<tr></tr>
// - 해당 월의 1일이 시작되기 전에 빈 칸 td 채우기
for (var i=0; i<days; i++)
{
trNode.appendChild(createTdNode(""));
}
// - 1일 부터... 해당 월의 마지막 날짜까지 td 채우기
var d=1;
for (d=1; d<=lastDay; d++)
{
trNode.appendChild(createTdNode(d)) // 어떤 형태인지 확인
// 일요일을 그리기 시작할 때, 기존 tr 구성을 마무리하고 다시 새로운 tr 을 구성
// check~!!! -----------------------------------------
if ((d+days)%7==0) // 일요일을 그리기 전에...
{
//tableNode.appendChild(trNode); // trNode 를 tableNode 에 추가
tbodyNode.appendChild(trNode);
trNode = document.createElement("tr"); // 새로운 trNode 구성
}
// check~!!! -----------------------------------------
}
// 확인
//-- 31일까지 출력한 날짜에서 확인
//alert(d);
//--==>> 32
// 그래서 아래 조건문 구성 할 때, d-1 해줌
// - 날짜 구성 이후 마지막 빈 칸 td 채우기
// (최종적으로 처리된 날짜가 일요일 개행이 적용되지 않은 경우만...)
if ( ((d-1)+days)%7 != 0 )
{
for (var i=0; i<7; i++, d++) // check~!!! 『d++』
{
trNode.appendChild(createTdNode(""));
if ((d+days)%7==0)
{
//tableNode.appendChild(trNode);
tbodyNode.appendChild(trNode);
break;
}
}
}
</script>
③ 새로운 달력 그리기
<script type="text/javascript">
var calendarBox = document.getElementById("newCalendarBox");
var tableNode = document.createElement("table"); // <table></table>
var trNode = document.createElement("tr"); // <tr></tr>
var dayNames = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
for (var i=0; i<dayNames.length; i++)
trNode.appendChild(createTdNode(dayNames[i]));
tableNode.appendChild(trNode);
var trNode = document.createElement("tr"); //<tr></tr>
// - 해당 월의 1일이 시작되기 전에 빈 칸 td 채우기
for (var i=0; i<days; i++)
{
trNode.appendChild(createTdNode(""));
}
// - 1일 부터... 해당 월의 마지막 날짜까지 td 채우기
var d=1;
for (d=1; d<=lastDay; d++)
{
trNode.appendChild(createTdNode(d)) // 어떤 형태인지 확인
// 일요일을 그리기 시작할 때, 기존 tr 구성을 마무리하고 다시 새로운 tr 을 구성
// check~!!! -----------------------------------------
if ((d+days)%7==0) // 일요일을 그리기 전에...
{
tableNode.appendChild(trNode); // trNode 를 tableNode 에 추가
trNode = document.createElement("tr"); // 새로운 trNode 구성
}
// check~!!! -----------------------------------------
}
// 확인
//-- 31일까지 출력한 날짜에서 확인
//alert(d);
//--==>> 32
// 그래서 아래 조건문 구성 할 때, d-1 해줌
// - 날짜 구성 이후 마지막 빈 칸 td 채우기
// (최종적으로 처리된 날짜가 일요일 개행이 적용되지 않은 경우만...)
if ( ((d-1)+days)%7 != 0 )
{
for (var i=0; i<7; i++, d++) // check~!!! 『d++』
{
trNode.appendChild(createTdNode(""));
if ((d+days)%7==0)
{
tableNode.appendChild(trNode);
break;
}
}
}
// check~!!!
calendarBox.appendChild(tableNode);
</script>