JS : Node 생성/추가/삭제/변경/복제

*  HTML 준비

<header style="height:50px"></header>
<main>
	<p class="target1">*기준1*</p>
	<p class="target2">*기준2*</p>
</main>
<footer style="height:50px"></footer>

 

* JS DOM준비

const main = document.querySelector('main')
const target1 = document.querySelector('.target1')
const target2 = document.querySelector('.target2')

 

 

 

 

 

Node생성

const create_p = document.createElement('p')

* p 요소를 생성한다.

* 생성 후 노드에 삽입하는 자바스크립트의 모든 명령어가 가능하다.

 

응용1. 생성 후 텍스트노드 삽입형태

create_p.innerHTML = 'test'

 


 

Node추가(자식노드)

main.append('0')
main.append('1')

* 부모노드.append()

* 부모노드의 마지막 자식 노드 추가

* 문자열, 숫자 등 데이터타입 제한 없이 삽입 가능

 


main.appendChild(target1)

* 부모노드.appendChild()

* 노드객체만 삽입할 수 있다.(문자열 데이터 불가)

* 기존 노드를 삽입할 경우 노드 복제가 되지 않고 위치가 변경된다.

* 일반적으로 신규생성한 노드를 삽입하는 것이 좋다.

 

const create_p = document.createElement('p') //p태그생성
create_p.innerHTML = 'test' //p태그 내 내용 삽입

main.appendChild(create_p) //생성노드객체 마지막자식노드추가

 


 

main.insertBefore(create_p, target1)

* 부모노드.이전위치노드생성(생성대상, 기준위치)

* target1 위치 기준 이전 위치에 create_p를 생성한다.

* prepend는 jquery명령으로 공식 javascript는 존재하지 않는다. (append와 연결하여 생각하지 않기!)

 

 


 

Node제거

main.remove()

* 노드.remove()

* 노드를 제거한다.

 


main.removeChild(target1)

* 부모노드.removeChild(제거할자식노드)

* 부모노드의 자식노드를 제거한다.

* 부모노드를 찾지 않고 제거는 불가능하다.

 

 

 


 

Node 선택(부모)

console.log(target1.parentNode)
console.log(target1.parentElement)
console.log(target1.parentNode.parentNode)
console.log(target1.parentElement.parentElement)

* 자식노드.parentNode  => 텍스트노드 등 요소가 아니어도 대상을 반환한다.

* 자식노드.parentElement => 요소 노드만 선택하여 대상을 반환한다.

* 특정 자식의 부모를 선택한다.

* 부모속성을 연속으로 작성하여 조상노드까지 찾을 수 있다.


target1.parentNode.remove()
target1.parentElement.remove()

* 자식노드.parentNode.remove()

* 특정 자식의 부모노드 제거

 


target1.parentNode.removeChild(target2)

* 기준자식.parentNode.removechild(제거할자식노드)

* 특정 기준자식노드를 잡고 해당 부모의 또 다른 자식을 선택하여 제거할 수 있다.

 


Node 교체

main.replaceChild(create_p, target1)

* 부모노드.replaceChild(변경노드, 기준노드)

* 기준노드(target1)가 변경노드(create_p)로 교체된다.

 


 

Node 형제

console.log(target1.nextElementSibling)
console.log(target2.previousElementSibling)

* 기준형제노드.nextElementSibling 

* 기준형제의 다음 형제노드를 반환한다.

 

* 기준형제노드.previousElementSibling

* 기준형제의 이전 형제노드를 반환한다.


응용1. 다음 형제 제거

target1.nextElementSibling.remove()

 

응용2. 다음형제의 자식 추가

target1.nextElementSibling.appendChild(create_p)

 

응용3. 부모의 다음형제 스타일 제어

target1.parentElement.nextElementSibling.style.backgroundColor='yellow'

 

응용4. 부모의 이전형제 스타일 제어

target1.parentElement.previousElementSibling.style.backgroundColor='red'

 


Node 자식 유무 확인/자식 개수 확인

console.log(main.hasChildNodes())
console.log(main.childElementCount)

 * 부모노드.hasChildNodes() 

* 부모노드의 자식이 있으면 true, 없으면 false를 반환한다.

 

* 부모노드.childElementCount

* 부모노드의 자식 수를 반환한다. (1부터 시작)


응용1. 조건문 활용

if(main.hasChildNodes()==true){
	alert('자식 노드가 있다')
}

 

 

응용2. 반복문 활용 모든 자식 노드 제거하기

노드.childElementCount 활용

while(main.childElementCount){ //카운트 수가 0이 되면 while은 종료된다.
	main.removeChild(main.firstElementChild) //첫번째 자식 제거
}

 


Node 복제

console.log(target1.cloneNode())
console.log(target1.cloneNode(true))

* 복제대상.cloneNode()  노드 객체만 복제한다.

* 복제대상.cloneNode(true) 노드 객체와 자식 노드까지 복제한다.

 

 

응용1. 부모노드 마지막 자식 위치에 복제 노드 추가

const clone = target1.cloneNode(true)
main.appendChild(clone)

 

 

  Comments,     Trackbacks