μ¬μ νμ΅ κ°μ΄λ STEP 4 (DOM Introduction ~ Events)
MDN μ¬μ΄νΈ
π‘
DOM β HTML
- HTML : λΈλΌμ°μ κ° νλ©΄μ 그리기 μν μ΄κΈ° μ€κ³λ
- λΈλΌμ°μ κ° HTMLμ μ΄μ©ν΄ νλ©΄μ κ·Έλ¦Ό
- DOM : μ€μ λ‘ νλ©΄μ ννλ κ²
- μλ°μ€ν¬λ¦½νΈλ₯Ό μ΄μ©ν΄ DOMμ μ κ·Όν΄ νλ©΄ μ‘°μ’ κ°λ₯
β μ¦, DOMμ ν΅ν΄ νλ©΄μ μμ ν΄λ HTML λ¬Έμ μμ²΄κ° μμ λμ§λ μμ
π‘ nodeμ element λΉκ΅ (node β element)
node(λ Έλ)
: DOMμ κ³μΈ΅ ꡬ쑰λ₯Ό μ΄λ£¨λ νλνλμ λ¨μ
ex. < head >, < body >, < a >, text...element(μμ)
: tagλ‘ μ μ λ Έλ
ex. < div > (o), text (x)
μλ°μ€ν¬λ¦½νΈλ₯Ό μ΄μ©νμ¬ DOMμ μ κ·Όν΄ μμλ₯Ό μ ννλ λ°©λ²
(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'; }
(1) id μ΄λ¦ μ΄μ©
- id μμ²΄κ° κ³ μ ν κ°μ΄λ―λ‘ μ νλλ μμ λν νλμ΄λ€
document.getElementById('id μ΄λ¦');
(2) class μ΄λ¦ / tag μ΄λ¦ μ΄μ©
- class μ΄λ¦, tag μ΄λ¦κ³Ό μΌμΉνλ 'λͺ¨λ μμ' μ ν
- μ μ¬ λ°°μ΄ νν β κ° μμμλ 'index'λ‘ μ κ·Ό κ°λ₯, for λ°λ³΅λ¬Έ μ¬μ© κ°λ₯, length μμ± μμ
document.getElementsByClassName('class μ΄λ¦'); document.getElementByTagName('tag μ΄λ¦');
(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; / λͺ¨λ μμ μμ μ ν
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')
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 > μμμ
κ°κ°μ ν μ€νΈ κ°μ΄ μ€μ λκ³ λ¬Έμμ λ§μ§λ§μ μΆκ°λλ€
- μμμ 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
VSinnerHTML
μ€ λ¬΄μμ μΈκΉ?
- νλ² λ§λ νμ λ€μ λ³κ²½ν κ±°λΌλ©΄, createElement μ¬μ©
- νλ² λ§λ νμ λ€μ λ³κ²½ν μΌμ΄ μλ€λ©΄, innerHTML μ¬μ©
(1) μμμ style νμΈ
μΈλΌμΈ μ€νμΌ
λ§ νμΈ κ°λ₯μμ.style.νμΈνκ³ μ νλ CSS μμ± μ΄λ¦;
λ΄λΆ μ€νμΌμνΈ
νΉμμΈλΆ μ€νμΌμνΈ
μ μ μλ style νμΈ κ°λ₯μμ.getComputedStyle.νμΈνκ³ μ νλ CSS μμ± μ΄λ¦;
(2) μμμ style μ€μ λ° λ³κ²½
μμ.style.μ€μ νκ³ μΆμ CSS μμ± μ΄λ¦ = '~μμ±κ°';
β» μ£Όμ!
getComputedStyle
μ μ€λ‘μ§ style μ½κΈ° μ μ©μ΄κΈ° λλ¬Έμ styleμ μ€μ νκ±°λ λ³κ²½ν μλ μλ€.
(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)μ μ½κΈ° μ μ© μμ±, νκ·Έ λͺ μ΄ λͺ μλ λ¬Έμμ΄μ κ°μ Έμ¨λ€
μ΄λ²€νΈ μ λ¬Έ MDN μ¬μ΄νΈ / μ΄λ²€νΈ λ²λΈλ§, μ΄λ²€νΈ μΊ‘μ² κ·Έλ¦¬κ³ μ΄λ²€νΈ μμκΉμ§ / β λ²λΈλ§κ³Ό μΊ‘μ²λ§ / β μ΄λ²€νΈ λ²λΈλ§, μΊ‘μ³, μ΄λ²€νΈ μ·¨μνκΈ° μ°Έκ³
λΆλͺ¨ μμλ₯Ό κ°μ§κ³ μλ μμ
μμ μ΄λ²€νΈκ° λ°μνμ λ λΈλΌμ°μ λ λ κ°μ§ λ€λ₯Έ λ¨κ³λ₯Ό μ€ννλ€
(1) μ΄λ²€νΈ μΊ‘μ³λ§
λΆλͺ¨ β μμ
λ°©ν₯μΌλ‘ μ΄λ²€νΈ μ ν
- μ€μ λ‘ μ νλ μμμ μμ μμ μ€ μ΄λ²€νΈ 리μ€λκ° μλμ§λ₯Ό κ²μ¬νκ³ , μλ€λ©΄ κ·Έ μμλΆν° μ½λλ₯Ό μ€ννλ€. κ·Έ ν κ·Έ νμ μμλ‘ μ΄λνλ©΄μ μ€μ λ‘ μ νλ μμμ λΏμ λκΉμ§ κ³μνλ€.
μμ.addEventListener('μ΄λ²€νΈ μ ν', function () { // μ΄λ²€νΈ λ°μ μ μ€ννκ³ ν λ΄μ© }, true);
(2) μ΄λ²€νΈ λ²λΈλ§
μμ β λΆλͺ¨
λ°©ν₯μΌλ‘ μ΄λ²€νΈ μ ν
- μ€μ λ‘ μ νλ μμμ μ΄λ²€νΈ 리μ€λκ° μλμ§λ₯Ό κ²μ¬νκ³ , μλ€λ©΄ κ·Έ μμλΆν° μ½λλ₯Ό μ€ννλ€. κ·Έ ν κ·Έ μμ μμλ‘ μ΄λνλ©΄μ κ°μ₯ μμ μμμΈ < html > μμμ λΏμ λκΉμ§ κ³μνλ€.
μμ.addEventListener('μ΄λ²€νΈ μ ν', function () { // μ΄λ²€νΈ λ°μ μ μ€ννκ³ ν λ΄μ© }, false); // falseκ° κΈ°λ³Έκ°μ΄λ€
μ΄λ²€νΈ μμ
(Event Delegation)μ΄λ²€νΈ λ²λΈλ§μ λ€μμ μμ μμλ€ μ€ νλλ§ μ ννμ λλ λΆλͺ¨ μμμμ μ½λλ₯Ό μ€νν μ μλλ‘ νλ€. μ¦, λͺ¨λ μμ μμμ κ°λ³μ μΌλ‘ μ΄λ²€νΈ 리μ€λλ₯Ό μ€μ ν νμκ° μλ€.
μ΄λ²€νΈ 리μ€λλ₯Ό λΆλͺ¨ μμμ μ€μ νλ©΄
μμ μμλ€μμ μΌμ΄λ μ΄λ²€νΈκ° λΆλͺ¨ μμμκ²κΉμ§ μ¬λΌμ€κ² ν μ μλ€.
π‘ νλμ μμμ μΊ‘μ³λ§κ³Ό λ²λΈλ§, λ νμ μ μ΄λ²€νΈ 리μ€λκ° λͺ¨λ μ‘΄μ¬νλ€λ©΄?
μΊ‘μ³λ§μ΄ λ¨Όμ
μ€νλκ³ , μ΄μ΄μ λ²λΈλ§μ΄ μ€νλλ€.
(3) μ΄λ²€νΈ μ νλ₯Ό λ§λ λ°©λ² (μ΄λ²€νΈ μ°¨λ¨) π₯
ev.stopPropagation();
- μ΄λ²€νΈ μΊ‘μ³λ§κ³Ό λ²λΈλ§μ μμ΄
νμ¬ μ΄λ²€νΈ μ΄νμ μ νλ₯Ό λ§λλ€.
(stopPropagation()μ΄ μ€μ λ μμμ ν λΉλμ΄ μλ μ΄λ²€νΈ 리μ€λκΉμ§λ μ€νλλ€.)- μ΄λ²€νΈκ° μμ νΉμ νμλ‘ μ νλμ§ μλλ‘ μ€λ¨νλ€.
μ¬μ νμ΅ κ°μ΄λ STEP 4 (Background Changer, Carousel)
νλ‘κ·Έλλ¨Έμ€ μκ³ λ¦¬μ¦ λ¬Έμ νμ΄ λ° μ€λ΅ λΆμ