ํฐ์คํ ๋ฆฌ ๋ทฐ
๋ฌธ์
์ด๋ฒคํธ ์์(Event Delegation)์ ์ํด ์ต์์ ๋ถ๋ชจ ์ปจํ ์ด๋์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ๋ฐ์ธ๋ฉํด์ค ๊ฒฝ์ฐ ํด๋น ์์ ๋ด๋ถ์ ์์ ์์๋ค์ด ๋ ํ๋ฒ ๋ถ๋ชจ(ParentElem)-์์(ChildElem) ๊ด๊ณ๋ฅผ ์ด๋ฃจ๊ณ ์๊ณ ๋ ์์๊ฐ ๋ ์ด์์ ์ ์์ ํ ๊ฒน์ณ์ ธ ์์ ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์๋ค.
์๋ฅผ ๋ค์ด click ์ด๋ฒคํธ๋ฅผ ์๊ฐํด๋ณด์.
ParentElem์์ click ์ด๋ฒคํธ์ ๋ํ ํ์ ์ฒ๋ฆฌ๋ฅผ ํ๊ณ ์ถ์ง๋ง ์น ์์์ ChildElem์ด wrapper์ธ ParentElem๊ณผ ์์น ๊ฐ์ด ๊ฒน์ณ์ ธ ์๊ณ ํฌ๊ธฐ๊ฐ ๊ฐ์ ๊ฒฝ์ฐ์๋ ParentElem์ด ์๋ ChildElem์ด ๊ณ์ํด์ ์ ํ์ด ๋์ด ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ป์ง ๋ชปํ ์ ์๋ค.
<div class="leaflet">
<div class="page" data-page="1">
<div class="page-face cover-page">
<p> </p>
<h1 class="menu-header-title"> /h1>
</div>
<div class="page-face">
<div class="menu-item">
<figure class="menu-item-photo" style="background-image: url(./images/profileImg.JPG);"></figure>
<div class="menu-item-info">
<p class="member-name"> p>
<p class="member-info"> </p>
</div>
<button class="back-btn"> </button>
</div>
</div>
</div>
(...)
</div>
๋ค์๊ณผ ๊ฐ์ด ๋ชจ๋ ์์๋ฅผ ๊ฐ์ธ๋ container์ธ leaflet ํ๊ทธ์ ํด๋ฆญ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ๋ฑ๋กํ๊ณ ์บก์ณ๋ง(Event Capturing)์ ํตํด ์ํ๋ ์์์ ๋ํด ์ด๋ฒคํธ ์ฒ๋ฆฌ๋ฅผ ํ๊ณ ์ ํ์ผ๋ ๋ชจ๋ ์์๋ค์ ๊ฐ์ ์์น ๊ฐ ๋ฐ ํฌ๊ธฐ ๊ฐ์ด ๊ฐ์ ์น ์์์ ํด๋ฆญํ์์ ๋ ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ป์ง ๋ชปํ์๋ค.
๋ฌธ์ ํด๊ฒฐ
์ฐ์ , getTarget ์ด๋ผ๋ ํจ์์ ๋ค์๊ณผ ๊ฐ์ด ํ์ฌ ์ด๋ฒคํธ ๋์์ด ๋ ์์์ ์ค์ ํ๊ฒํ ๋์ด์ผ ํ ์์์ ํด๋์ค๋ช ์ ์ธ์๊ฐ์ผ๋ก ๋๊ฒจ์ค๋ค.
leaflet.addEventListener('click', e => {
let pageElem = getTarget(e.target, 'page');
}
getTarget ํจ์์๋ ์ธ์๋ก ๋์ด ์จ ์ด๋ฒคํธ ๋์์ด ๋ ์์์ ํด๋์ค๋ช ์ด ๋ง์ฐฌ๊ฐ์ง๋ก ์ธ์๊ฐ์ผ๋ก ๋์ด ์จ ํ์ผํ ์ด ๋์ด์ผ ํ ์์์ ํด๋์ค๋ช ์ ํฌํจํ๊ณ ์์ง ์๋ค๋ฉด ํ์ฌ ์ฐธ์กฐ๋๋ ์ด๋ฒคํธ ๋์์ ๋ถ๋ชจ ์์๋ฅผ ์๋ณ๋๊ณ ์๋ ๋ณ์์ ์ฌํ ๋นํ์ฌ ๋ค์ ๋ฃจํ๋ก ๋์ด๊ฐ๊ฒ ์ฝ๋๋ฅผ ์์ฑํ์๋ค.
๋ง์ง๋ง์ผ๋ก ํด๋น ํด๋์ค๋ช ์ ์ง๋ ์์๊ฐ ์์ด bodyํ๊ทธ๊น์ง ๊ฑฐ์ฌ๋ฌ ์ฌ๋ผ๊ฐ๋ค๋ฉด null๊ฐ์ ๋ฐํํด์ฃผ๊ณ ํจ์๋ ์ข ๋ฃ๋๋ค.
์ ์ฒด์ ์ผ๋ก ๋ฒ๋ธ๋ง(Bubbling)๊ณผ ๋น์ทํ ๋์ ์๋ฆฌ์ด์ง๋ง ํด๋น ํจ์๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ๋ฐ์ธ๋ฉ๋์ด ์์ง ์๋ ํ์ผํ ์์ ์์ ๋ํ ์ฝ๊ฒ ์ ํํ ์ ์๋ค๋ ์ฅ์ ์ด ์๋ค.
function getTarget(elem, className) {
while(!elem.classList.contains(className)) {
elem = elem.parentNode;
if(elem.nodeName === 'BODY') {
elem = null;
return;
}
}
return elem;
}