[TIL] 210908

Lee SyongΒ·2021λ…„ 9μ›” 8일
0

TIL

λͺ©λ‘ 보기
21/204
post-thumbnail

πŸ“ 였늘 ν•œ 것

  1. DOM / λ…Έλ“œ 트리 / μš”μ†Œ 선택 / μš”μ†Œμ˜ 생성, μˆ˜μ • 및 μ‚­μ œ / addEventListener() / 이벀트 λ¦¬μŠ€λ„ˆ(ν•Έλ“€λŸ¬) / 이벀트 객체의 속성 - target, currentTarget / 이벀트 캑쳐링 / 이벀트 버블링 / 이벀트 μœ„μž„ / event.stopPropagation

πŸ“– ν•™μŠ΅ 자료

  1. 사전 ν•™μŠ΅ κ°€μ΄λ“œ STEP 4 (DOM Introduction ~ Events)

  2. MDN μ‚¬μ΄νŠΈ


πŸ“š 배운 것

DOM


1. μ˜λ―Έμ™€ ꡬ쑰

  • DOM(Document Object Model) : HTML λ¬Έμ„œλ₯Ό μœ„ν•œ ν”„λ‘œκ·Έλž˜λ° μΈν„°νŽ˜μ΄μŠ€

πŸ’‘ DOM β‰  HTML

  • HTML : λΈŒλΌμš°μ €κ°€ 화면을 그리기 μœ„ν•œ 초기 섀계도
  • λΈŒλΌμš°μ €κ°€ HTML을 μ΄μš©ν•΄ 화면을 κ·Έλ¦Ό
  • DOM : μ‹€μ œλ‘œ 화면에 ν‘œν˜„λœ 것
  • μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό μ΄μš©ν•΄ DOM에 μ ‘κ·Όν•΄ ν™”λ©΄ μ‘°μ’… κ°€λŠ₯

β†’ 즉, DOM을 톡해 화면을 μˆ˜μ •ν•΄λ„ HTML λ¬Έμ„œ μžμ²΄κ°€ μˆ˜μ •λ˜μ§€λŠ” μ•ŠμŒ

  • DOM의 트리 ꡬ쑰 (λ…Έλ“œ 트리)

πŸ’‘ node와 element 비ꡐ (node βŠƒ element)

  • node(λ…Έλ“œ) : DOM의 계측 ꡬ쑰λ₯Ό μ΄λ£¨λŠ” ν•˜λ‚˜ν•˜λ‚˜μ˜ λ‹¨μœ„
    ex. < head >, < body >, < a >, text...
  • element(μš”μ†Œ) : tag둜 적은 λ…Έλ“œ
    ex. < div > (o), text (x)

2. μš”μ†Œ 선택

μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό μ΄μš©ν•˜μ—¬ DOM에 μ ‘κ·Όν•΄ μš”μ†Œλ₯Ό μ„ νƒν•˜λŠ” 방법

1) CSS μ„ νƒμž 이용

(1) querySelector

  • CSS μ„ νƒμžμ™€ μΌμΉ˜ν•˜λŠ” '첫 번째 μš”μ†Œ' 선택
document.querySelecotr('CSS μ„ νƒμž');

(2) querySelectorAll

  • CSS μ„ νƒμžμ™€ μΌμΉ˜ν•˜λŠ” 'λͺ¨λ“  μš”μ†Œ' 선택
  • μœ μ‚¬ λ°°μ—΄ ν˜•νƒœ β†’ 각 μš”μ†Œμ—λŠ” 'index'둜 μ ‘κ·Ό κ°€λŠ₯, for 반볡문 μ‚¬μš© κ°€λŠ₯, length 속성 있음
const foo = document.querySelectorAll('CSS μ„ νƒμž');

foo[2].textContent = 'I\'m hungry.';

for (var i = 0; i < foo.length; i++) {
  foo[i].style.backgroundColor = 'red';
}

2) κ·Έ μ™Έ 방법듀

(1) id 이름 이용

  • id μžμ²΄κ°€ κ³ μœ ν•œ κ°’μ΄λ―€λ‘œ μ„ νƒλ˜λŠ” μš”μ†Œ λ˜ν•œ ν•˜λ‚˜μ΄λ‹€
document.getElementById('id 이름');

(2) class 이름 / tag 이름 이용

  • class 이름, tag 이름과 μΌμΉ˜ν•˜λŠ” 'λͺ¨λ“  μš”μ†Œ' 선택
  • μœ μ‚¬ λ°°μ—΄ ν˜•νƒœ β†’ 각 μš”μ†Œμ—λŠ” 'index'둜 μ ‘κ·Ό κ°€λŠ₯, for 반볡문 μ‚¬μš© κ°€λŠ₯, length 속성 있음
document.getElementsByClassName('class 이름');
document.getElementByTagName('tag 이름');

3) μ„ νƒν•œ μš”μ†Œμ˜ λΆ€λͺ¨ / ν˜•μ œ μš”μ†Œ μ„ νƒν•˜κΈ°

(1) μ„ νƒν•œ μš”μ†Œμ˜ λΆ€λͺ¨ μš”μ†Œ 선택

var foo = document.querySelector('CSS μ„ νƒμž');
foo.parentElement; // λΆ€λͺ¨ μš”μ†Œ 선택

(2) μ„ νƒν•œ μš”μ†Œμ˜ (μ „/ν›„) ν˜•μ œ μš”μ†Œ 선택

var foo = document.querySelector('CSS μ„ νƒμž');
foo.previousElementSibiling; // 이전 ν˜•μ œ μš”μ†Œ 선택
foo.nextElementSibling; // λ‹€μŒ ν˜•μ œ μš”μ†Œ 선택

(3) μ„ νƒν•œ μš”μ†Œμ˜ μžμ‹ μš”μ†Œ 선택

  • μ„ νƒν•œ μš”μ†Œμ˜ 'λͺ¨λ“  μžμ‹ μš”μ†Œ' 선택
  • μœ μ‚¬ λ°°μ—΄ ν˜•νƒœ β†’ 각 μžμ‹ μš”μ†Œμ—λŠ” 'index'둜 μ ‘κ·Ό κ°€λŠ₯, for 반볡문 μ‚¬μš© κ°€λŠ₯, length 속성 있음
var foo = document.querySelector('CSS μ„ νƒμž');
foo.children; / λͺ¨λ“  μžμ‹ μš”μ†Œ 선택

3. μš”μ†Œμ˜ 생성, μˆ˜μ • 및 μ‚­μ œ

1) μ„ νƒν•œ μš”μ†Œμ— class μΆ”κ°€ 및 μ‚­μ œ

classList

var foo = document.querySelector('CSS μ„ νƒμž');
foo.classList.add('μΆ”κ°€ν•  class 이름');
foo.classList.remove('μ‚­μ œν•  class 이름');
foo.classList.toggle('class 이름'); // μ—†μœΌλ©΄ μΆ”κ°€, 있으면 μ‚­μ œ
foo.classList.item(class의 index); // ν•΄λ‹Ή 인덱슀의 ν΄λž˜μŠ€κ°€ 무엇인지
foo.classList.contains('class 이름'); // ν•΄λ‹Ή ν΄λž˜μŠ€κ°€ μžˆλŠ”μ§€ μ•Œλ €μ€Œ
foo.classList.replace('λŒ€μ²΄λ  class', 'λŒ€μ²΄ν•  class')

2) μƒˆλ‘œμš΄ DOM μš”μ†Œ 생성, μˆ˜μ • 및 μ‚­μ œ

var google = document.createElement('a');
// <a> μš”μ†Œ 생성

google.setAttribute('href', 'http://google.com');
// <a> μš”μ†Œμ˜ 속성과 속성값 μΆ”κ°€

var ul = document.querySelector('CSS μ„ νƒμž');
// <a> μš”μ†Œλ₯Ό μΆ”κ°€ν•˜κ³  싢은 μœ„μΉ˜μ˜ λΆ€λͺ¨ μš”μ†Œ 선택

ul.appendChild(google);
// μ„ νƒν•œ μš”μ†Œμ˜ λ§ˆμ§€λ§‰ μžμ‹ μš”μ†Œλ‘œ <a> μš”μ†Œ μΆ”κ°€

google.textContent = 'google'; // <a> μš”μ†Œμ— ν…μŠ€νŠΈ μΆ”κ°€
google.style.color = 'blue'; // <a> μš”μ†Œ μŠ€νƒ€μΌ μˆ˜μ • 

google.remove(); // <a> μš”μ†Œ μ‚­μ œ

πŸ’‘ createElementκ°€ for 반볡문의 μ•ˆ/λ°– 어디에 μžˆλŠ”κ°€?

  const something = document.createElement("p");

  for (let i = 0; i < 5; i++) {
    something.textContent = i;
    document.body.appendChild(something);
  }
  // 4

β†’ < p > μš”μ†Œκ°€ for 반볡문 밖에 이미 λ–‘ν•˜λ‹ˆ μƒμ„±λ˜μ—ˆκΈ° λ•Œλ¬Έμ— for λ°˜λ³΅λ¬Έμ„ 싀행함에 따라 < p > μš”μ†Œμ˜ ν…μŠ€νŠΈ 값이 λ°”λ€” 뿐이닀
(< p >의 μœ„μΉ˜λŠ” i = 0 일 λ•Œ 처음 λ¬Έμ„œμ˜ 끝에 μΆ”κ°€λ˜κ³ , μ΄ν›„λ‘œλŠ” λ³€ν™”x)

  for (let i = 0; i < 5; i++) {
    const something = document.createElement("p");
    something.textContent = i;
    document.body.appendChild(something);
  }
  // 0
  // 1
  // 2
  // 3
  // 4

β†’ < p > μš”μ†Œκ°€ for 반볡문 μ•ˆμ— μ •μ˜λ˜μ–΄ 있기 λ•Œλ¬Έμ— for λ°˜λ³΅λ¬Έμ„ 싀행함에 따라 맀번 μƒˆλ‘œμ΄ μƒμ„±λœ < p > μš”μ†Œμ— 각각의 ν…μŠ€νŠΈ 값이 μ„€μ •λ˜κ³  λ¬Έμ„œμ˜ λ§ˆμ§€λ§‰μ— μΆ”κ°€λœλ‹€

3) μš”μ†Œ μ•ˆμ— ν¬ν•¨λœ HTML μ½μ–΄μ˜€κΈ° 및 μ„€μ •

  • μš”μ†Œμ˜ HTML μ½˜ν…μΈ  μ½μ–΄μ˜€κΈ°
μš”μ†Œ.indexHTML;
  • μš”μ†Œμ˜ μ½˜ν…μΈ  λŒ€μ²΄ν•˜κΈ°
    μƒˆλ‘œμš΄ λ‚΄μš©μ΄ κΈ°μ‘΄ λ‚΄μš©μ„ μ•„μ˜ˆ λŒ€μ²΄ν•œλ‹€
μš”μ†Œ.indexHTML = 'μƒˆλ‘œμš΄ λ‚΄μš©';
document.body.indexHTML = ''; // λ¬Έμ„œ 전체 λ‚΄μš© μ‚­μ œ

πŸ’‘ innerHTML / innerText / textContent 비ꡐ (innerHTML, innerText, textContent 차이점 μ°Έκ³ )

  • innerHTML : ν•΄λ‹Ή μš”μ†Œμ˜ HTML, XML / μ½μ–΄μ˜€κΈ° 및 μ„€μ • κ°€λŠ₯
  • innerText : μ‚¬μš©μžμ—κ²Œ 'λ³΄μ—¬μ§€λŠ”' ν…μŠ€νŠΈ κ°’ / μ½μ–΄μ˜€κΈ° 및 μ„€μ • κ°€λŠ₯
  • textContent : < script >λ‚˜ < style > νƒœκ·Έμ™€ 상관없이 ν•΄λ‹Ή λ…Έλ“œκ°€ 가지고 μžˆλŠ” ν…μŠ€νŠΈ κ°’ / μ½μ–΄μ˜€κΈ° 및 μ„€μ • κ°€λŠ₯

cf. innerHTMLκ³Ό innerTextλŠ” 'μš”μ†Œ'의 속성이고, textContentλŠ” 'λ…Έλ“œ'의 속성이닀

cf. createElement VS innerHTML 쀑 무엇을 μ“ΈκΉŒ?

  • ν•œλ²ˆ λ§Œλ“  후에 λ‹€μ‹œ λ³€κ²½ν•  거라면, createElement μ‚¬μš©
  • ν•œλ²ˆ λ§Œλ“  후에 λ‹€μ‹œ λ³€κ²½ν•  일이 μ—†λ‹€λ©΄, innerHTML μ‚¬μš©

4) μš”μ†Œμ˜ style 확인 및 μ„€μ •

(1) μš”μ†Œμ˜ style 확인

  • 인라인 μŠ€νƒ€μΌλ§Œ 확인 κ°€λŠ₯
μš”μ†Œ.style.ν™•μΈν•˜κ³ μž ν•˜λŠ” CSS 속성 이름;
  • λ‚΄λΆ€ μŠ€νƒ€μΌμ‹œνŠΈ ν˜Ήμ€ μ™ΈλΆ€ μŠ€νƒ€μΌμ‹œνŠΈμ— μ •μ˜λœ style 확인 κ°€λŠ₯
μš”μ†Œ.getComputedStyle.ν™•μΈν•˜κ³ μž ν•˜λŠ” CSS 속성 이름;

(2) μš”μ†Œμ˜ style μ„€μ • 및 λ³€κ²½

μš”μ†Œ.style.μ„€μ •ν•˜κ³  싢은 CSS 속성 이름 = '~속성값';

β€» 주의!
getComputedStyle은 μ˜€λ‘œμ§€ style 읽기 μ „μš©μ΄κΈ° λ•Œλ¬Έμ— style을 μ„€μ •ν•˜κ±°λ‚˜ λ³€κ²½ν•  μˆ˜λŠ” μ—†λ‹€.


4. 이벀트(Events) 등둝

1) addEventListener()

(1) ꡬ문

  • μš”μ†Œμ— μ§€μ •λœ μœ ν˜•μ˜ μ΄λ²€νŠΈκ°€ λ°œμƒν–ˆμ„ λ•Œ ν•¨μˆ˜κ°€ μ‹€ν–‰λœλ‹€
μš”μ†Œ.addEventListener('이벀트 μœ ν˜•', 이벀트 λ¦¬μŠ€λ„ˆ)
  • μ˜ˆμ‹œ
μš”μ†Œ.addEventListener('mouseover', function() {
  alert(μš”μ†Œ.textContent);
});

β€» μ›λž˜ addEventListener()λŠ” '이벀트λ₯Ό μ§€μ›ν•˜λŠ” λͺ¨λ“  객체'λ₯Ό λŒ€μƒμœΌλ‘œ ν•˜μ§€λ§Œ, μ—¬κΈ°μ„  이해λ₯Ό μœ„ν•΄ 'μš”μ†Œ'라고 ν‘œν˜„ν–ˆμŒ

(2) λ§€κ°œλ³€μˆ˜

  • 이벀트 μœ ν˜•

    κ°μ§€ν•˜κ³ μž ν•˜λŠ” 이벀트 이름 ex) mouseover, click, dbclick...

  • 이벀트 λ¦¬μŠ€λ„ˆ(=이벀트 ν•Έλ“€λŸ¬)

    이벀트 λ°œμƒμ΄ κ°μ§€λœ ν›„ μ‹€ν–‰ν•  λ‚΄μš©μ„ 담은 'ν•¨μˆ˜'

(3) 이벀트 객체

'이벀트 λ¦¬μŠ€λ„ˆ'의 λ§€κ°œλ³€μˆ˜
λ°œμƒν•œ μ΄λ²€νŠΈμ— λŒ€ν•œ 상세 정보가 담겨 μžˆλ‹€

πŸ’‘ 이벀트 객체의 속성

  • target

    μ‹€μ œλ‘œ μ΄λ²€νŠΈκ°€ λ°œμƒν•œ 타깃 μš”μ†Œ
    캑쳐링과 버블링 λ‹¨κ³„μ—μ„œ λ³€ν•˜μ§€ μ•ŠλŠ”λ‹€

  • currentTarget

    ν˜„μž¬ μš”μ†Œλ‘œ, ν˜„μž¬ μ‹€ν–‰ 쀑인 λ¦¬μŠ€λ„ˆκ°€ ν• λ‹Ήλœ μš”μ†Œ

πŸ“Œ ν™œμš© μ˜ˆμ‹œ 1

μš”μ†Œ.addEventListener('click', function(ev) {
  ev.currentTarget.innerHTML = '<div>123</div>';
});

πŸ“Œ ν™œμš© μ˜ˆμ‹œ 2

두 개의 button 뢀뢄을 ν΄λ¦­ν–ˆμ„ λ•Œλ§Œ 경고창이 λœ¨λ„λ‘ λ§Œλ“€μ–΄λΌ

<!-- HTML -->
<div>
  <p>이 λ²„νŠΌμ„ λˆ„λ₯΄λ©΄ 경고창이 λœΉλ‹ˆλ‹€.</p>
  <button>κ²½κ³  1 λ²„νŠΌ</button>
  <button>κ²½κ³  2 λ²„νŠΌ</button>
</div>

πŸ’‘ 주의 πŸ’‘

이벀트 등둝은 DOM μš”μ†Œ λ‹¨μœ„λ‘œ 이루어지기 λ•Œλ¬Έμ— ν•œλ²ˆμ— μœ μ‚¬ λ°°μ—΄ ν˜•νƒœμ˜ μš”μ†Œ'λ“€'μ—λŠ” 이벀트λ₯Ό 등둝할 수 μ—†λ‹€. λ‹€μ‹œ λ§ν•΄μ„œ,

const buttons = document.querySelectorAll('button');

buttons.addEventListener('click', function () {
  alert('κ²½κ³ !!');
});

라고 ν•  수 μ—†κ³ ,

const button1 = document.querySelectorAll('button')[0];
const button2 = document.querySelectorAll('button')[1];

button1.addEventsListener('click', function () {
  alert('κ²½κ³ !!');
});
button2.addEventsListener('click', function () {
  alert('κ²½κ³ !!');
});

라고 ν•΄μ•Ό ν•œλ‹€.
κ·ΈλŸ¬λ‚˜ 이것은 μ€‘λ³΅λœ 뢀뢄이 많기 λ•Œλ¬Έμ— μ’€ 더 μ½”λ“œλ₯Ό 쀄이기 μœ„ν•œ 방법을 κ΅¬ν•œλ‹€λ©΄,

πŸ”Ž μ΅œμ’… λ‹΅μ•ˆ πŸ”Ž

const div = document.querySelector('div'); // div μš”μ†Œ 선택

div.addEventListener('click', function(event) {
  if (event.target.tagName === 'P') {
    return; // p νƒœκ·Έλ₯Ό λˆŒλ €μ„ 땐 경고창이 λœ¨μ§€ μ•Šλ„λ‘
  }

  alert('κ²½κ³ !!')
});

β€» tagName : μš”μ†Œ(element)의 읽기 μ „μš© 속성, νƒœκ·Έ λͺ…이 λͺ…μ‹œλœ λ¬Έμžμ—΄μ„ κ°€μ Έμ˜¨λ‹€

2) 이벀트의 λ™μž‘ 원리

이벀트 μž…λ¬Έ MDN μ‚¬μ΄νŠΈ / 이벀트 버블링, 이벀트 캑처 그리고 이벀트 μœ„μž„κΉŒμ§€ / βœ” 버블링과 캑처링 / βœ” 이벀트 버블링, 캑쳐, 이벀트 μ·¨μ†Œν•˜κΈ° μ°Έκ³ 

λΆ€λͺ¨ μš”μ†Œλ₯Ό 가지고 μžˆλŠ” μš”μ†Œμ—μ„œ μ΄λ²€νŠΈκ°€ λ°œμƒν–ˆμ„ λ•Œ λΈŒλΌμš°μ €λŠ” 두 가지 λ‹€λ₯Έ 단계λ₯Ό μ‹€ν–‰ν•œλ‹€

(1) 이벀트 캑쳐링

  • λΆ€λͺ¨ β†’ μžμ‹ λ°©ν–₯으둜 이벀트 μ „νŒŒ
  • μ‹€μ œλ‘œ μ„ νƒλœ μš”μ†Œμ˜ μƒμœ„ μš”μ†Œ 쀑 이벀트 λ¦¬μŠ€λ„ˆκ°€ μžˆλŠ”μ§€λ₯Ό κ²€μ‚¬ν•˜κ³ , μžˆλ‹€λ©΄ κ·Έ μš”μ†ŒλΆ€ν„° μ½”λ“œλ₯Ό μ‹€ν–‰ν•œλ‹€. κ·Έ ν›„ κ·Έ ν•˜μœ„ μš”μ†Œλ‘œ μ΄λ™ν•˜λ©΄μ„œ μ‹€μ œλ‘œ μ„ νƒλœ μš”μ†Œμ— 닿을 λ•ŒκΉŒμ§€ κ³„μ†ν•œλ‹€.
μš”μ†Œ.addEventListener('이벀트 μœ ν˜•', function () {
  // 이벀트 λ°œμƒ μ‹œ μ‹€ν–‰ν•˜κ³ ν”ˆ λ‚΄μš©
}, true);

(2) 이벀트 버블링

  • μžμ‹ β†’ λΆ€λͺ¨ λ°©ν–₯으둜 이벀트 μ „νŒŒ
  • μ‹€μ œλ‘œ μ„ νƒλœ μš”μ†Œμ— 이벀트 λ¦¬μŠ€λ„ˆκ°€ μžˆλŠ”μ§€λ₯Ό κ²€μ‚¬ν•˜κ³ , μžˆλ‹€λ©΄ κ·Έ μš”μ†ŒλΆ€ν„° μ½”λ“œλ₯Ό μ‹€ν–‰ν•œλ‹€. κ·Έ ν›„ κ·Έ μƒμœ„ μš”μ†Œλ‘œ μ΄λ™ν•˜λ©΄μ„œ κ°€μž₯ μƒμœ„ μš”μ†ŒμΈ < html > μš”μ†Œμ— 닿을 λ•ŒκΉŒμ§€ κ³„μ†ν•œλ‹€.
μš”μ†Œ.addEventListener('이벀트 μœ ν˜•', function () {
   // 이벀트 λ°œμƒ μ‹œ μ‹€ν–‰ν•˜κ³ ν”ˆ λ‚΄μš©
}, false); // falseκ°€ 기본값이닀
  • 이벀트 μœ„μž„ (Event Delegation)

    이벀트 버블링은 λ‹€μˆ˜μ˜ μžμ‹ μš”μ†Œλ“€ 쀑 ν•˜λ‚˜λ§Œ μ„ νƒν–ˆμ„ λ•Œλ„ λΆ€λͺ¨ μš”μ†Œμ—μ„œ μ½”λ“œλ₯Ό μ‹€ν–‰ν•  수 μžˆλ„λ‘ ν•œλ‹€. 즉, λͺ¨λ“  μžμ‹ μš”μ†Œμ— κ°œλ³„μ μœΌλ‘œ 이벀트 λ¦¬μŠ€λ„ˆλ₯Ό μ„€μ •ν•  ν•„μš”κ°€ μ—†λ‹€. 이벀트 λ¦¬μŠ€λ„ˆλ₯Ό λΆ€λͺ¨ μš”μ†Œμ— μ„€μ •ν•˜λ©΄ μžμ‹ μš”μ†Œλ“€μ—μ„œ μΌμ–΄λ‚œ μ΄λ²€νŠΈκ°€ λΆ€λͺ¨ μš”μ†Œμ—κ²ŒκΉŒμ§€ 올라였게 ν•  수 μžˆλ‹€.

πŸ’‘ ν•˜λ‚˜μ˜ μš”μ†Œμ— 캑쳐링과 버블링, 두 νƒ€μž…μ˜ 이벀트 λ¦¬μŠ€λ„ˆκ°€ λͺ¨λ‘ μ‘΄μž¬ν•œλ‹€λ©΄?

캑쳐링이 λ¨Όμ € μ‹€ν–‰λ˜κ³ , μ΄μ–΄μ„œ 버블링이 μ‹€ν–‰λœλ‹€.

(3) 이벀트 μ „νŒŒλ₯Ό λ§‰λŠ” 방법 (이벀트 차단) πŸ”₯

ev.stopPropagation();
  • 이벀트 캑쳐링과 버블링에 μžˆμ–΄ ν˜„μž¬ 이벀트 μ΄ν›„μ˜ μ „νŒŒλ₯Ό λ§‰λŠ”λ‹€. (stopPropagation()이 μ„€μ •λœ μš”μ†Œμ— ν• λ‹Ήλ˜μ–΄ μžˆλŠ” 이벀트 λ¦¬μŠ€λ„ˆκΉŒμ§€λŠ” μ‹€ν–‰λœλ‹€.)
  • μ΄λ²€νŠΈκ°€ μƒμœ„ ν˜Ήμ€ ν•˜μœ„λ‘œ μ „νŒŒλ˜μ§€ μ•Šλ„λ‘ μ€‘λ‹¨ν•œλ‹€.

πŸ™‹β€β™€οΈ 질문

  1. μ‚¬μ „ν•™μŠ΅ κ°€μ΄λ“œ STEP 4 Events λ§ˆμ§€λ§‰ μ˜ˆμ œμ—μ„œ #cλ₯Ό λˆŒλ €μ„ λ•Œ μ™œ console.logκ°€ μ €λ ‡κ²Œ μ°νžˆλŠ”μ§€ λͺ¨λ₯΄κ² λ‹€ β†’ μ΄ν•΄ν–ˆλ‹€ (210909)

✨ 내일 ν•  것

  1. 사전 ν•™μŠ΅ κ°€μ΄λ“œ STEP 4 (Background Changer, Carousel)

  2. ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ μ•Œκ³ λ¦¬μ¦˜ 문제 풀이 및 μ˜€λ‹΅ 뢄석

profile
λŠ₯λ™μ μœΌλ‘œ μ‚΄μž, ν–‰λ³΅ν•˜κ²ŒπŸ˜

0개의 λŒ“κΈ€