μ΄λ²€νΈ λ²λΈλ§(Event Bubbling)
μ΄λ²€νΈ λ²λΈλ§(Event Bubbling)μ HTMLμμ μ΄λ²€νΈκ° λ°μνμ λ, ν΄λΉ μ΄λ²€νΈκ° λ°μν μμμμ μμνμ¬ μμ μμλ‘ μ μ§μ μΌλ‘ μ νλλ νμμ μλ―Έν©λλ€. μ΄λ DOM(Document Object Model)μ κ³μΈ΅ ꡬ쑰λ₯Ό λ°λΌ μ΄λ²€νΈκ° μ²λ¦¬λλ κΈ°λ³Έ λμ λ°©μμ
λλ€.
π μ΄λ²€νΈ λ²λΈλ§μ λμ μ리
μ΄λ²€νΈ λ²λΈλ§μ μ¬μ©μκ° νΉμ μμμμ μ΄λ²€νΈλ₯Ό λ°μμμΌ°μ λ(μ: λ²νΌ ν΄λ¦), ν΄λΉ μμμμ μ΄λ²€νΈκ° μ²λ¦¬λ ν λΆλͺ¨ μμλ‘ μ΄λ²€νΈκ° μ λ¬λλ κ³Όμ μ
λλ€. μλ₯Ό λ€μ΄, μμ μ΄ μκ³ λ²νΌμ ν΄λ¦νλ©΄, λ¨Όμ μμ μ΄λ²€νΈκ° μ²λ¦¬λκ³ , κ·Έ λ€μ λ‘ μ΄λ²€νΈκ° μ νλ©λλ€. μ΄ κ³Όμ μ DOM νΈλ¦¬μ μ΅μμ μμ(λ³΄ν΅ documentλ window)μ λλ¬ν λκΉμ§ κ³μλ©λλ€.
π μ΄λ²€νΈ μμ(Event Delegation)
μ΄λ²€νΈ λ²λΈλ§μ νμ©νλ©΄ μ΄λ²€νΈ μμμ ꡬνν μ μμ΅λλ€. μ΄λ²€νΈ μμμ κ°λ³ νμ μμλ§λ€ μ΄λ²€νΈ νΈλ€λ¬λ₯Ό λ±λ‘νλ λμ , κ³΅ν΅ λΆλͺ¨ μμμ νλμ νΈλ€λ¬λ₯Ό λ±λ‘νμ¬ νμ μμμμ λ°μν μ΄λ²€νΈλ₯Ό μ²λ¦¬νλ λ°©μμ
λλ€. μ΄λ μ½λ ν¨μ¨μ±μ λμ΄κ³ , λμ μΌλ‘ μΆκ°λ μμμλ μ΄λ²€νΈ μ²λ¦¬λ₯Ό μ μ©ν μ μκ² ν΄μ€λλ€.
π μ΄λ²€νΈ μ ν λ°©μ§
λλ‘λ μ΄λ²€νΈκ° μμ μμλ‘ μ νλλ κ²μ λ§κ³ μΆμ λκ° μμ΅λλ€. μ΄λ₯Ό μν΄ μ΄λ²€νΈ κ°μ²΄μ stopPropagation() λ©μλλ₯Ό μ¬μ©νλ©΄ μ΄λ²€νΈκ° λ μ΄μ λ²λΈλ§ λλ μΊ‘μ³λ§λμ§ μλλ‘ μ€μ§ν μ μμ΅λλ€. λ¨, stopPropagation()μ μ΄λ²€νΈ μ νλ§ λ§μ λΏ, κΈ°λ³Έ λμ(μ: λ§ν¬ ν΄λ¦ μ νμ΄μ§ μ΄λ)μ λ§μ§λ μμ΅λλ€. κΈ°λ³Έ λμμ λ§μΌλ €λ©΄ preventDefault()λ₯Ό μΆκ°λ‘ μ¬μ©ν΄μΌ ν©λλ€.
HTML ꡬ쑰
<div id="parent"> <button id="child1">λ²νΌ 1</button> <button id="child2">λ²νΌ 2</button> </div>
JavaScript μ½λ
// λΆλͺ¨ μμμ μ΄λ²€νΈ νΈλ€λ¬ λ±λ‘ (μ΄λ²€νΈ μμ) document.getElementById('parent').addEventListener('click', function(event) { console.log('λΆλͺ¨ μμμμ μ΄λ²€νΈ κ°μ§:', event.target.id); // νΉμ 쑰건μμ μ΄λ²€νΈ μ ν μ€μ§ if (event.target.id === 'child1') { console.log('child1 ν΄λ¦ μ μ ν μ€μ§'); event.stopPropagation(); } }); // κ°λ³ μμμ νΈλ€λ¬ μΆκ° (λΉκ΅μ©) document.getElementById('child1').addEventListener('click', function() { console.log('child1μμ μ§μ μ²λ¦¬'); });
π λ²λΈλ§ νμΈ
- "λ²νΌ 1"(child1)μ ν΄λ¦νλ©΄ λ¨Όμ child1μ λ±λ‘λ νΈλ€λ¬κ° μ€νλμ΄ "child1μμ μ§μ μ²λ¦¬"κ° μΆλ ₯λ©λλ€.
- μ΄ν μ΄λ²€νΈκ° λΆλͺ¨(parent)λ‘ λ²λΈλ§λμ΄ "λΆλͺ¨ μμμμ μ΄λ²€νΈ κ°μ§: child1"μ΄ μΆλ ₯λ©λλ€.
- μΆκ°λ‘ stopPropagation()μ΄ νΈμΆλλ―λ‘ λ μ΄μ μμλ‘ μ νλμ§ μμ΅λλ€.
π μ΄λ²€νΈ μμ νμΈ
- "λ²νΌ 2"(child2)λ₯Ό ν΄λ¦νλ©΄ child2μλ κ°λ³ νΈλ€λ¬κ° μμ§λ§, λΆλͺ¨ μμμ λ±λ‘λ νΈλ€λ¬κ° μ΄λ₯Ό κ°μ§ν΄ "λΆλͺ¨ μμμμ μ΄λ²€νΈ κ°μ§: child2"λ₯Ό μΆλ ₯ν©λλ€.
- μ΄λ₯Ό ν΅ν΄ κ°λ³ λ²νΌλ§λ€ νΈλ€λ¬λ₯Ό λ±λ‘νμ§ μμλ λΆλͺ¨μμ λͺ¨λ ν΄λ¦ μ΄λ²€νΈλ₯Ό μ²λ¦¬ν μ μμμ μ μ μμ΅λλ€.
π μ€μ νμ© μμ
- μλ₯Ό λ€μ΄, λμ μΌλ‘ λ²νΌμ΄ μΆκ°λλ 리μ€νΈκ° μλ€κ³ κ°μ ν λ, κ° λ²νΌμ νΈλ€λ¬λ₯Ό μΆκ°νλ λμ λΆλͺ¨
- μμμ νΈλ€λ¬λ₯Ό λ±λ‘νλ©΄ μλ‘ μΆκ°λ λ²νΌλ μλμΌλ‘ μ²λ¦¬λ©λλ€.
μ΄λ²€νΈ μΊ‘μ³λ§(Event Capturing)
μ΄λ²€νΈ μΊ‘μ³λ§(Event Capturing)μ μ΄λ²€νΈκ° μ΅μμ μμμμ μμν΄ νμ μμλ‘ λ΄λ €κ°λ λ°©μμΌλ‘, λ²λΈλ§κ³Όλ λ°λ λ°©ν₯μΌλ‘ μλν©λλ€. HTMLμμλ κΈ°λ³Έμ μΌλ‘ λ²λΈλ§μ΄ μ£Όλ‘ μ¬μ©λμ§λ§, νμμ λ°λΌ μΊ‘μ³λ§λ νμ©ν μ μμ΅λλ€.
π μΊ‘μ³λ§ μ¬μ© μμ
document.getElementById('parent').addEventListener('click', function() { console.log('μΊ‘μ³λ§ λ¨κ³μμ κ°μ§'); }, { capture: true }); // μΊ‘μ³λ§ λͺ¨λ νμ±ν
{ capture: true } μ΅μ
μ μΆκ°νλ©΄ μ΄λ²€νΈκ° μΊ‘μ³λ§ λ¨κ³μμ μ²λ¦¬λ©λλ€. μ΄ κ²½μ°, λΆλͺ¨μμ λ¨Όμ μ΄λ²€νΈκ° κ°μ§λ ν μμμΌλ‘ μ λ¬λ©λλ€.