κ°œλ°œμΌμ§€πŸ“_09

ᴢᴬᴱᡞᴼᴼᴺ·2021λ…„ 5μ›” 26일
0
post-thumbnail

πŸ’‘ 이번 μ£Όμ—λŠ” DOM 에 λŒ€ν•΄ μ•Œμ•„λ³΄μ•˜μœΌλ©° 이벀트 ν•¨μˆ˜μ™€ 타이머 ν•¨μˆ˜μ— λŒ€ν•΄μ„œλ„ λ°°μ› λ‹€. λ˜ν•œ 배운 λ‚΄μš©μ„ μ μš©ν•˜μ—¬ Scroll To Top λ²„νŠΌκ³Ό μˆ˜ν‰ μŠ¬λΌμ΄λ”λ₯Ό κ΅¬ν˜„ν•΄λ³΄λŠ” μ‹€μŠ΅μ„ ν•˜μ˜€λ‹€.

μƒˆλ‘œ 배운 λ‚΄μš©πŸŒΌ

βœ” DOM : HTML λ¬Έμ„œμ— λŒ€ν•œ μΈν„°νŽ˜μ΄μŠ€
β–ͺ 첫째둜 λ·° ν¬νŠΈμ— 무엇을 λ Œλ”λ§ 할지 κ²°μ •ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λœλ‹€.
β–ͺ λ‘˜μ§Έλ‘œλŠ” νŽ˜μ΄μ§€μ˜ μ½˜ν…μΈ  및 ꡬ쑰, 그리고 μŠ€νƒ€μΌμ΄ μžλ°”μŠ€ν¬λ¦½νŠΈ ν”„λ‘œκ·Έλž¨μ— μ˜ν•΄ μˆ˜μ •λ˜κΈ° μœ„ν•΄ μ‚¬μš©λœλ‹€.
β–ͺ DOM은 λ¬Έμ„œλ₯Ό 논리 트리둜 ν‘œν˜„ν•œλ‹€. 트리의 각 λΈŒλžœμΉ˜λŠ” λ…Έλ“œμ—μ„œ λλ‚˜λ©°, 각 λ…Έλ“œλŠ” 객체λ₯Ό κ°–λŠ”λ‹€.
-> λ…Έλ“œ : 이벀트 μ²˜λ¦¬κΈ°λ„ 포함할 수 μžˆλ‹€. μ΄λ²€νŠΈκ°€ λ°œμƒν•œ μˆœκ°„, ν•΄λ‹Ή μ΄λ²€νŠΈμ™€ μ—°κ²°ν•œ μ²˜λ¦¬κΈ°κ°€ λ°œλ™ν•œλ‹€.

πŸ‘‰DOM은 원본 HTML λ¬Έμ„œ ν˜•νƒœμ™€ λΉ„μŠ·ν•˜μ§€λ§Œ λ‹€μŒκ³Ό 같은 차이점이 μžˆλ‹€.
1. 항상 μœ νš¨ν•œ HTML ν˜•μ‹μ΄λ‹€.
2. μžλ°”μŠ€ν¬λ¦½νŠΈμ— μˆ˜μ •λ  수 μžˆλŠ” 동적 λͺ¨λΈμ΄μ–΄μ•Ό ν•œλ‹€.
3. 가상 μš”μ†Œλ₯Ό ν¬ν•¨ν•˜μ§€ μ•ŠλŠ”λ‹€. (Ex. ::after)
4. 보이지 μ•ŠλŠ” μš”μ†Œλ₯Ό ν¬ν•¨ν•œλ‹€. (Ex. display: none)

βœ” HTML μš”μ†Œμ™€ λ…Έλ“œ 객체
HTML μš”μ†ŒλŠ” HTML λ¬Έμ„œλ₯Ό κ΅¬μ„±ν•˜λŠ” κ°œλ³„μ μΈ μš”μ†Œλ₯Ό μ˜λ―Έν•œλ‹€.
-> HTML μš”μ†ŒλŠ” λΈŒλΌμš°μ €μ˜ λ Œλ”λ§ 엔진에 μ˜ν•΄ νŒŒμ‹±λ˜μ–΄ DOM을 κ΅¬μ„±ν•˜λŠ” μš”μ†Œ λ…Έλ“œ 객체둜 λ³€ν™˜λœλ‹€. μ΄λ•Œ HTML μš”μ†Œμ˜ attributeλŠ” attribute node둜, HTML μš”μ†Œμ˜ text μ½˜ν…μΈ λŠ” text node둜 λ³€ν™˜λœλ‹€.

βœ” μš”μ†Œ λ…Έλ“œ 취득
HTML의 κ΅¬μ‘°λ‚˜ λ‚΄μš© λ˜λŠ” μŠ€νƒ€μΌ 등을 λ™μ μœΌλ‘œ μ‘°μž‘ν•˜λ €λ©΄ js νŒŒμΌμ—μ„œ λ¨Όμ € μš”μ†Œ λ…Έλ“œλ₯Ό 취득해야 ν•œλ‹€.

πŸ‘‰DOMμ—μ„œ μš”μ†Œ λ…Έλ“œλ₯Ό 취득할 수 μžˆλŠ” λ‹€μ–‘ν•œ λ©”μ„œλ“œ
β–ͺ getElementById : idλ₯Ό μ΄μš©ν•œ μš”μ†Œ λ…Έλ“œ 취득

// id 이름이 slide1인 μš”μ†Œ λ…Έλ“œλ₯Ό νƒμƒ‰ν•˜μ—¬ λ°˜ν™˜
const $elem = document.getElementById('slide1')

β–ͺ getElementsByTagName : νƒœκ·Έμ΄λ¦„μ„ μ΄μš©ν•œ μš”μ†Œ λ…Έλ“œ 취득

// νƒœκ·Έ 이름이 li인 μš”μ†Œ λ…Έλ“œλ₯Ό λͺ¨λ‘ νƒμƒ‰ν•˜μ—¬ λ°˜ν™˜
const $elems = document.getElementsByTagName('li')

β–ͺ getElementsByClassName : classλ₯Ό μ΄μš©ν•œ μš”μ†Œ λ…Έλ“œ 취득

// class 이름이 btn인 λͺ¨λ“  λ…Έλ“œλ₯Ό νƒμƒ‰ν•˜μ—¬ 객체에 λ‹΄μ•„ λ°˜ν™˜
const $elems = document.getElementsByClassName('btn')

β–ͺ queryquerySelector : CSS μ„ νƒμžλ₯Ό μ΄μš©ν•œ μš”μ†Œ λ…Έλ“œ 취득

// class 이름이 scrollToTop인 μš”μ†Œλ₯Ό νƒμƒ‰ν•˜μ—¬ λ°˜ν™˜
const scrollToTopEl = document.querySelector('.scrollToTop')

// id 이름이 slide1인 μš”μ†Œλ₯Ό νƒμƒ‰ν•˜μ—¬ λ°˜ν™˜
const firstSlide = document.querySelector('#slide1')

β–ͺ querySelectorAll : CSS μ„ νƒμžλ₯Ό μ΄μš©ν•œ λͺ¨λ“  μš”μ†Œ λ…Έλ“œ 취득

// ul μš”μ†Œμ˜ μžμ‹ μš”μ†ŒμΈ li μš”μ†Œλ₯Ό λͺ¨λ‘ νƒμƒ‰ν•˜μ—¬ λ°˜ν™˜
const $elems = document.querySelectorAll('ul > li');

βœ” DOM μ‘°μž‘
β–ͺ innerHTML ν”„λ‘œνΌν‹° : μš”μ†Œ λ…Έλ“œμ˜ HTML λ§ˆν¬μ—…μ„ μ·¨λ“ν•˜κ±°λ‚˜ λ³€κ²½ν•œλ‹€.
β–ͺ insertAdjacentHTML λ©”μ„œλ“œ : κΈ°μ‘΄ μš”μ†Œλ₯Ό μ œκ±°ν•˜μ§€ μ•ŠμœΌλ©΄μ„œ μœ„μΉ˜λ₯Ό 지정해 μƒˆλ‘œμš΄ μš”μ†Œλ₯Ό μ‚½μž…ν•œλ‹€.
β–ͺ createElement둜 μš”μ†Œ λ…Έλ“œλ₯Ό 생성, createTextNode둜 ν…μŠ€νŠΈ λ…Έλ“œλ₯Ό μƒμ„±ν•˜κ³  appendChild λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μš”μ†Œ λ…Έλ“œλ₯Ό DOM에 μΆ”κ°€ν•œλ‹€.
β–ͺ insertBefore(newNode, childNode) λ©”μ„œλ“œ : childNode μ•žμ— newNodeλ₯Ό μ‚½μž…ν•œλ‹€.
β–ͺ cloneNode([deep: true | false]) λ©”μ„œλ“œ : λ…Έλ“œμ˜ 사본을 μƒμ„±ν•˜μ—¬ λ°˜ν™˜ν•œλ‹€.
β–ͺ replaceChild(newChild, oldChild) λ©”μ„œλ“œ : oldChildλ₯Ό newChild둜 λŒ€μ²΄ν•œλ‹€.
β–ͺ removeChild(child) λ©”μ„œλ“œ : 인수둜 μ „λ‹¬ν•œ childλ₯Ό μ‚­μ œν•œλ‹€.
β–ͺ style둜 인라인 μŠ€νƒ€μΌμ„ μ‘°μž‘ν•œλ‹€.
β–ͺ className ν”„λ‘œνΌν‹° : HTML μš”μ†Œμ˜ class값을 μ·¨λ“ν•˜κ±°λ‚˜ λ³€κ²½ν•œλ‹€.
β–ͺ classList ν”„λ‘œνΌν‹° : class 정보λ₯Ό 담은 객체λ₯Ό λ°˜ν™˜ν•œλ‹€.

βœ” 이벀트
λΈŒλΌμš°μ €λŠ” 클릭, ν‚€λ³΄λ“œ μž…λ ₯, 마우슀 이동 λ“±κ³Ό 같은 사건이 λ°œμƒν•˜λ©΄ 이λ₯Ό κ°μ§€ν•˜μ—¬ 이벀트λ₯Ό λ°œμƒμ‹œν‚¨λ‹€.
β–ͺ 이벀트 νƒ€μž…

βœ” 타이머 ν•¨μˆ˜
ν•¨μˆ˜λ₯Ό 일정 μ‹œκ°„μ΄ μ§€λ‚œ 이후에 ν˜ΈμΆœν•˜κ³  싢을 λ•Œ 타이머 ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•œλ‹€.
β–ͺ μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 타이머 ν•¨μˆ˜μ—λŠ” setTimeoutκ³Ό setInterval (그리고 이 λ‘˜μ„ μ œκ±°ν•  수 μžˆλŠ” clearTimeoutκ³Ό clearInterval)이 μžˆλ‹€.

πŸ‘‰setTimeoutκ³Ό setInterval의 μ°¨μ΄λŠ” ν•¨μˆ˜ 호좜의 λ°˜λ³΅μ— μžˆλ‹€.
setTimeout ν•¨μˆ˜κ°€ μƒμ„±ν•œ νƒ€μ΄λ¨ΈλŠ” 단 ν•œ 번 λ™μž‘, setInterval ν•¨μˆ˜κ°€ μƒμ„±ν•œ ν•¨μˆ˜λŠ” 반볡 λ™μž‘ν•œλ‹€.

β–ͺ setTimeout 예제

// 첫번째 νŒŒλΌλ―Έν„°: 타이머가 만료된 이후 ν˜ΈμΆœν•˜λŠ” 콜백 ν•¨μˆ˜
// λ‘λ²ˆμ§Έ νŒŒλΌλ―Έν„°: 타이머 만료 μ‹œκ°„
// μ„Έλ²ˆμ§Έ(이상) νŒŒλΌλ―Έν„°: 
// 호좜 μŠ€μΌ€μ€„λ§ν•œ 콜백 ν•¨μˆ˜μ— 전달해야 ν•  μΈμˆ˜κ°€ μ‘΄μž¬ν•œλ‹€λ©΄ μ„Έλ²ˆμ§Έ μ΄ν›„μ˜ 인수둜 전달
setTimeout(() => console.log('1μ΄ˆκ°€ 지났닀'), 1000)

β–ͺ setInterval , clearInterval 예제

let count = 0;

// setInterval ν•¨μˆ˜μ˜ νŒŒλΌλ―Έν„°λŠ” setTimeoutκ³Ό 동일
const countToFive = setInterval(() => {
  count++;
  // console.log(count);
  
  // count값이 5κ°€ 되면 ν•¨μˆ˜ μŠ€μΌ€μ€„λ§μ„ μ·¨μ†Œ
	if (count === 5) clearInterval(countToFive);
}, 1000);

πŸ“ŒScroll To Top λ²„νŠΌ ν”„λ‘œμ νŠΈμ— μ μš©ν•΄λ³΄κΈ°


: 이번 주에 μ‹€μŠ΅ν•΄λ³Έ Scroll To Top λ²„νŠΌμ„ ν”„λ‘œμ νŠΈμ— μ μš©ν•΄λ΄€λ‹€. cssμ—μ„œλŠ” λ²„νŠΌμ΄ 보이지 μ•Šλ„λ‘ display: none;을 ν•˜μ˜€κ³  μ›Ή νŽ˜μ΄μ§€μ˜ νŠΉμ • μœ„μΉ˜μ—μ„œλΆ€ν„°λŠ” λ²„νŠΌμ΄ λ‚˜νƒ€λ‚˜λ„λ‘ ν•˜κ³  λ²„νŠΌμ„ λˆŒλ €μ„ λ•Œ νŽ˜μ΄μ§€κ°€ μƒλ‹¨μœΌλ‘œ μ΄λ™ν•˜λ„λ‘ ν•˜κΈ° μœ„ν•΄ jsμ—μ„œ 이벀트λ₯Ό μΆ”κ°€ν•˜μ˜€λ‹€.

λŠλ‚€μ 

ν‰μ†Œμ— λ‹€μ–‘ν•œ μ›Ή νŽ˜μ΄μ§€λ₯Ό μ ‘μ†ν•˜λ©΄μ„œ 자주 μ‚¬μš©ν•΄λ³΄μ•˜λ˜ Scroll To Top λ²„νŠΌμ„ λ‚΄ 클둠코딩 μ‚¬μ΄νŠΈμ— μ μš©ν•΄λ³Ό 수 μžˆμ–΄μ„œ μ’‹μ•˜λ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈ 문법에 λŒ€ν•œ κ°œλ…μ μΈ 뢀뢄은 쀑간고사 이후뢀터 계속 μ ‘ν•΄μ™”λŠ”λ° 이λ₯Ό 직접 ν΄λ‘ μ½”λ”©ν•˜λŠ”λ° 써본적이 λ§Žμ§€ μ•Šμ•„μ„œ Scroll To Top λ²„νŠΌμ„ κ΅¬ν˜„ν•΄λ‚΄λŠ”κ²Œ 쉽지 μ•Šμ•˜κ³  μ‹œκ°„λ„ κ½€ κ±Έλ Έλ‹€. μ•žμœΌλ‘œ 남은 μ‹œκ°„λ™μ•ˆ ν”„λ‘œμ νŠΈλ₯Ό μ€€λΉ„ν•˜λ©΄μ„œ μžλ°”μŠ€ν¬λ¦½νŠΈ 문법을 ν™œμš©ν•œ μ½”λ“œλ₯Ό 계속 써보며 κ°œλ…λ„ λͺ…ν™•νžˆ ν•˜κ³  μ΅μˆ™ν•΄μ§€λ„λ‘ λ…Έλ ₯ν•΄μ•Όκ² λ‹€. 타이머 ν•¨μˆ˜μ™€ μˆ˜ν‰ μŠ¬λΌμ΄λ” λ§Œλ“œλŠ” μ‹€μŠ΅λ„ μˆ˜μ—…μ‹œκ°„μ— μ‚΄νŽ΄λ³Έ λ‚΄μš©μΈλ° 이번 μ£Όμ—λŠ” μ‹œκ°„μ΄ λΆ€μ‘±ν•˜μ—¬ λ‚΄ 클둠코딩 μ‚¬μ΄νŠΈμ— 직접 μ μš©ν•΄λ³΄μ§€ λͺ»ν•œ 점이 아쉽닀. 이제 기말고사가 μ–Όλ§ˆ 남지 μ•Šμ•˜λŠ”λ° ν”„λ‘œμ νŠΈλ₯Ό 잘 μ™„μ„±μ‹œμΌœμ„œ μ œμΆœν•  수 μžˆμ„μ§€ 걱정이 λœλ‹€. 자투리 μ‹œκ°„μ„ 잘 ν™œμš©ν•΄μ•Ό κ² λ‹€:-)

0개의 λŒ“κΈ€

κ΄€λ ¨ μ±„μš© 정보