part.1에 이어서 또 다른예제로 DOM공부를 해보자
<body>
<h2>DOM API 사용하기:노드의 위치 바꾸기</h2>
<fieldset style="width:60%">
<legend>메뉴 위치 변경하기</legend>
<ul>
<li>메뉴1</li>
<li>메뉴2</li>
<li>메뉴3</li>
<li>메뉴4</li>
<li>메뉴5</li>
<li>메뉴6</li>
</ul>
<button class="up">위로</button>
<button class="down">아래로</button>
</fieldset>
</body>

▲ 위 body태그의 상태이며 우리의 목표는 메뉴 중 하나를 선택하고 위로 또는 아래로 버튼을 눌렀을 때 해당 메뉴탭이 위 또는 아래로 움직이는 기능을 구현하는 것이다.
head태그안에 script태그를 넣을 것이기 때문에 window.addEventListener를 사용할 것이다.
<script>
window.addEventListener("load",function()
{
var ul = document.querySelector('ul');
var up = document.querySelector('.up');
var down = document.querySelector('.down');
var li = null;
//li의 부모인 ul에 이벤트 바인딩
ul.onclick=function(e){
console.log(e.target.nodeName);
if(e.target.nodeName==='LI'){
if(li !=null) li.style.backgroundColor='white';
//클릭한 li의 배경색 설정
e.target.style['background-color']='lightgray';
li = e.target;
}
};
up.onclick=function(){
if(li===null){
alert('메뉴를 선책하세요?');
return;
}
var previous=li.previousElementSibling;
console.log('previous:',previous);
if(previous===null){
alert('이전 메뉴가 없습니다');
return;
}
li.insertAdjacentElement('afterend',previous);
};
down.onclick=function(){
if(li===null){
alert('메뉴를 선책하세요?');
return;
}
var next=li.nextElementSibling;
if(next===null){
alert('다음 메뉴가 없습니다');
return;
}
li.insertAdjacentElement('beforebegin',next);
};
});
</script>
또 다른 예제를 보자
<body>
<h2>DOM API 사용하기:노드복제 하기</h2>
<fieldset>
<legend>데이타 뿌려주기(복제할 행이 있는 경우)</legend>
<input type="button" class="btnData" value="데이타 넣기" />
<hr />
<table style="text-align:center;background-color: black;border-spacing:1px;width:70%">
<thead>
<tr style="background-color: white;">
<th style="width:5%">번호</th>
<th>제목</th>
<th style="width:15%">작성일</th>
<th style="width:15%">작성자</th>
<th style="width:8%">조회수</th>
</tr>
</thead>
<tbody>
<tr style="background-color: white;">
<td>1</td>
<td style="text-align:left">제목1</td>
<td>2022-09-01</td>
<td>가길동</td>
<td>20</td>
</tr>
</tbody>
</table>
</fieldset>
<fieldset>
<!----------------------------------------------------------------------------->
<legend>데이타 뿌려주기(복제할 행이 없는 경우)</legend>
<input type="button" class="btnData" value="데이타 넣기" />
<hr />
<template>
<tr style="background-color: white;">
<td>1</td>
<td style="text-align:left">제목1</td>
<td>2022-09-01</td>
<td>가길동</td>
<td>20</td>
</tr>
</template>
<table style="text-align:center;background-color: black;border-spacing:1px;width:70%">
<thead>
<tr style="background-color: white;">
<th style="width:5%">번호</th>
<th>제목</th>
<th style="width:15%">작성일</th>
<th style="width:15%">작성자</th>
<th style="width:8%">조회수</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</fieldset>
</body>

▲ 이번예제는 게시판에 글을 추가하였을 때 해당 형식에 맞춰서 게시판에 추가되는 기능을 간단하게 구현해보려고 한다. 케이스는 두 가지로 하나는 게시판에 기존 데이터가 있는 경우와 없는 경우로 나누어서 연습을 해보자.
첫번째로 게시판에 데이터가 존재하는 경우부터 보자.
<script>
window.addEventListener("load", function () {
var data = [
{ no: 2, title: "제목2", postDate: "2022-01-01", writer: "김길동1", hit: 10 },
{ no: 3, title: "제목 입니다", postDate: "2022-02-03", writer: "박길동2", hit: 5 },
{ no: 4, title: "내일 공약사항을 발표하겠습니다", postDate: "2022-05-03", writer: "박길동3", hit: 15 },
{ no: 5, title: "축하드립니다", postDate: "2022-11-15", writer: "박길동4", hit: 25 },
];
▲ 게시판에 추가할 데이터들을 담은 배열이다.
기존데이터가 있는 경우에는 기존 데이터의 형식을 복사(cloning)하여 사용할 수 있다.
우리가 body태그안에 tbody가 두개인점을 먼저 상기하고 진행하여야 할 것이다.
//노드 생성후 생성된 각 노드를 append()함수로 추가하여 구현하지 않고
//cloneNode()를 사용해 노드를 복제하여 구현하자
var tbodys = document.querySelectorAll('tbody');
var btnDatas = document.querySelectorAll(".btnData");
var tr = tbodys[0].querySelector('tr');
btnDatas[0].onclick = function () {
data.forEach(function (item, index) {
var clone = tr.cloneNode(true);
var tds = clone.querySelectorAll('td');
tds[0].textContent = data[index].no;
tds[1].textContent = data[index]["title"];
tds[2].textContent = data[index].postDate;
tds[3].textContent = data[index]["writer"];
tds[4].textContent = data[index].hit;
//방법1
//tbodys[0].append(clone);
//방법2
//append()대신 insertAdjacentElement()사용
tr.insertAdjacentElement('afterend', clone);
tr = clone;//복제한 클론으로 갱신
});
};

두번째 케이스(복제할 데이터가 없는경우)를 해보자. 이 경우에는 템플릿을 가져와서 추가하는 방식이다.
//복제할 행이 없는 경우
var template = document.querySelector('template');
btnDatas[1].onclick = function () {
data.forEach(function (item, index) {
var clone = document.importNode(template.content, true);
var tds = clone.querySelectorAll('td');
tds[0].textContent = data[index].no;
tds[1].textContent = data[index]["title"];
tds[2].textContent = data[index].postDate;
tds[3].textContent = data[index]["writer"];
tds[4].textContent = data[index].hit;
tbodys[1].append(clone);
});
};
▲template에 있는 형식을 가져와서 그 형식에 데이터들을 넣고 그것을 tbody에 append함으로써 구현된다.

'JavaScript > Javascript_Advanced' 카테고리의 다른 글
| [JS]BOM(Browser Object Model) part.1 (0) | 2022.04.15 |
|---|---|
| [JS]DOM(Document Object Model) part.3 (0) | 2022.04.15 |
| [JS]DOM(Document Object Model) part.1 (0) | 2022.04.13 |
| [JS]Function(함수) part.4 (0) | 2022.04.12 |
| [JS]Function(함수) part.3 (0) | 2022.04.12 |