HTML
<div class="parent"> <!-- 주석 --> <div class="child">1</div> 텍스트1 <div class="child">2</div> 텍스트2 </div>
JS
const parent = document.querySelector('.parent') //부모 요소의 모든 자식 노드 확인 console.log(parent.childNodes) //부모 요소의 모든 자식 요소 확인 console.log(parent.children)
출력결과
- 노드를 확인하면 요소 + 주석이나 일반 텍스트도 자식으로 확인되는 반면, 요소를 확인하면 HTML 태그로 작성되어있는 요소만 확인할 수 있다.
➡️ 즉, 노드는 요소보다 상위 개념이다.
null
을 반환HTML
<div class="parent"> <!-- 주석 --> <div class="child">1</div> 텍스트1 <div id="child2" class="child">2</div> 텍스트2 </div>
JS
const el = document.getElementById('child2') console.log(el) //<div id="child2" class="child">2</div>
null
을 반환const el = document.querySelector('.child:first-child')
console.log(el) //<div class="child">1</div>
.forEach()
사용 가능const nodeList = document.querySelectorAll('.child')
console.log(nodeList)
//<div class="child">1</div>
//<div id="child2" class="child">2</div>
nodeList.forEach(el => console.log(el.textContent))
//1
//2
N
은 노드를 의미const el = document.querySelector('.child')
console.log(el.parentElement)
//<div class="parent">
// <!-- 주석 -->
// <div class="child">1</div>
// 텍스트1
// <div id="child2" class="child">2</div>
// 텍스트2
//</div>
E
은 노드를 의미null
을 반환const el = document.querySelector('.child')
console.log(el.closest('div')) //<div class="child">1</div>
console.log(el.closest('body')) //<body> ... </body>
console.log(el.closest('.hello')) //null
const el = document.querySelector('.child')
console.log(el.previousSibling) //#text (줄바꿈)
console.log(el.nextSibling) //"텍스트1"
const el = document.querySelector('.child')
console.log(el.previousElementSibling) //null
console.log(el.nextElementSibling) //<div id="child2" class="child">2</div>
const parent = document.querySelector('.parent')
console.log(parent.children)
//HTMLCollection [
//<div class="child">1</div>
//<div id="child2" class="child">2</div>
//]
const parent = document.querySelector('.parent')
console.log(parent.firstElementChild)//<div class="child">1</div>
console.log(parent.firstElementChild)//<div id="child2" class="child">2</div>
const divEl = document.createElement('div')
const inputEl = document.createElement('input')
const parentEl = document.querySelector('.parent')
const el = document.createElement('div')
el.textContent = 'HELLO~'
parentEl.prepend(new Comment(' 주석 '))
parentEl.append(el)
parentEl.append('Text!')
// parentEl.append(el, 'Text!')
// 동일한 메소드를 사용하면 한 번에 작성할 수도 있다.
const el = document.querySelector('.child')
el.remove()
ㄴ 이때, child 클래스를 갖는 요소 중 가장 먼저 찾은 요소만 삭제된다.
대상 요소.insertAdjacentElement('위치', 새로운 요소)
위치
<--! beforebegin --> <div class="child"> <--! afterbegin --> Content! <--! beforeend --> </div> <--! afterend -->
JS
const childEl = document.querySelector('.child') const newEl = document.createElement('span') newEl.textContent='Hello~' childEl.insertAdjacentElement('beforebegin', newEl) //newEl는 <div clas='child'> 태그의 시작 전에 삽입된다.
출력 결과
E.insertAdjacentElement()
를 쓰지 않고 prepend()
, append()
를 사용할 수도 있음.부모 요소.insertBefore(노드, 참조 노드)
const parentEl = document.querySelector('.parent')
const childEl = document.querySelector('.child')
const newEl = document.createElement('span')
newEl.textContent='Hello~'
parentEl.insertBefore(newEl, childEl)
//newEl는 <div clas='child'> 태그의 시작 전에 삽입된다.
const el = document.querySelector('.child');
console.log(el.textContent) //"1"
el.textContent = '7';
console.log(el.textContent) //"7"
' '따옴표
혹은 백틱
으로 묶어줘야 함!!!!const el = document.querySelector('.parent');
console.log(el.innerHTML)
//<div class="child">1</div>
// <div id="child2" class="child">2</div>
el.innerHTML = '<span style="color : red;">HELLO~</span>';
console.log(el.textContent) //HELLO~
JSON.stringify()
메소드를 사용해서 저장해야 데이터가 망가지지 않고 저장된다. 추후에 다시 해당 데이터를 사용할 때는 JSON.parse()
메소드를 사용하면 된다.const el = document.querySelector('.child');
const str = 'Hello World';
const obj = { 'a' : 1, 'b' : 2 };
el.dataset.helloWorld = str;
el.dataset.object = JSON.stringify(obj);
console.log(el.dataset.helloWorld); //'Hello World' 문자열로 출력
console.log(el.dataset.object); //'{ 'a' : 1, 'b' : 2 }' 문자열로 출력
console.log(JSON.parse(el.dataset.object)); //{ 'a' : 1, 'b' : 2 } 객체로 출력
const parentEl = document.querySelector('.parent');
const childEl = document.querySelector('.child');
const el = document.createElement('span');
console.log(parentEl.tagName); //DIV
console.log(childEl.tagName); //DIV
console.log(el.tagName); //SPAN
console.log(document.body.tagName); //BODY
const el = document.querySelector('.child');
console.log(el.id); //'' 빈 문자 = 아무런 내용이 출력되지 않음
el.id = 'child1';
console.log(el.id); //'child1'
classList 메소드
를 더 많이 사용하게 될 것const el = document.querySelector('.child');
console.log(el.className); //'child'
el.className += ' child1 active';
console.log(el.className); //'child child1 active'
.add()
: 새로운 값 추가.remove()
: 기존 값 제거.toggle()
: 해당하는 값이 있으면 제거, 없으면 추가.contains()
: 값이 있는지 확인const el = document.querySelector('.child');
el.classList.add('active');
console.log(el.classList.contains('active')); //true
el.classList.remove('active');
console.log(el.classList.contains('active')); //false
el.addEventListener('click', () => {
el.classList.toggle('active');
console.log(el.classList.contains('active'));
});
//el 요소를 클릭했을 때 이벤트를 발생시킬건데 그 내용은
//el 요소에 active 클래스가 있으면 해당 클래스를 제거하고, 콘솔에 active 라는 클래스가 있는지 없는지를 불린형으로 반환해라.
//만약 el 요소를 여러 번 클릭하면 active 클래스가 생겼다 없어졌다를 반복할거고, 콘솔에도 true/false 값이 번갈아가며 출력되겠지.
const el = document.querySelector('.child');
//개별 지정
el.style.width = '100px';
el.style.fontSize = '20px';
el.style.backgroundColor = 'green';
//한 번에 지정
Object.assign (el.style, {
width = '100px',
fontSize = '20px',
backgroundColor = 'green'
})
Object.assign() 메소드
사용해서 객체 데이터 방식으로 작성할 수 있다.const el = document.querySelector('child');
const styles = window.getComputedStyle(el);
console.log(styles.width); //100px
console.log(styles.fontSize); //20px
console.log(styles.backgroundColor); //rgb(0, 128, 0)
console.log(styles); //el 요소에 적용된 모든 css 내용이 출력
const el = document.querySelector('child');
el.setAttribute('title', 'Hello World');
console.log(el.getAttribute('title')); //'Hello World'
const el = document.querySelector('child');
console.log(el.hasAttribute('class'); //true
el.removeAttribute('class');
console.log(el.hasAttribute('class'); //false
console.log(window.innerWidth); //977
console.log(window.innerHeight); //626
console.log(window.scrollX); //0
console.log(window.scrollY); //216
대상.scrollTo(x좌표, y좌표)
대상.scrollTo({ left : X, top : Y, behavior : 'smooth' })
const parentEl = document.querySelector('.parent');
setTimeOut(() => {
parentEl.scrollTo({
left : 0,
top : 500,
behavior : 'smooth'
})
}, 1000)
window.parentEl = document.querySelector('.parent');
//const 변수가 아닌 window 객체의 속성으로 값을 할당하는 이유는 window가 전역객체이기 때문이다
//화면(뷰포트)에서 parnet 요소에 접근하려면 해당 요소를 window 객체에 연결해주어야 한다.
console.log(parentEl.scrollLeft, parentEl.scrollTop); //0
const parentEl = document.querySelector('.parent');
const childEl = document.querySelector('.child');
console.log(parentEl.getBoundingClientRect());
console.log(childEl.getBoundingClientRect());