Event delegation - accidentlywoo/legacyVue GitHub Wiki
- ๋ค์ด๊ฐ๊ธฐ ์ ์ list(์ด๋ค ๋ชฉ๋ก)๊ฐ ์ฌ๋ฌ ๊ฐ์ธ UI์ ๊ฐ๊ฐ ๋น์ทํ ์ด๋ฒคํธ๋ฅผ ๊ฑธ์ด์ ์ฒ๋ฆฌํด์ผ ํ๋ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น์? for๋ฌธ์ผ๋ก addEventListener๋ฅผ ์ฌ์ฉํด์ผ ํ ๊น์?
- Event delegation์ ์ดํดํ๊ณ , ํจ์จ์ ์ธ ์ด๋ฒคํธ ๋ฑ๋ก์ ๊ตฌํํ ์ ์๋ค.
- Event delegation
- Bubbling
- Capturing
์๋ ํ๋ฉด์ ๊ฐ๋ก๋ก ๋ฐฐ์น๋ ์ฑ
๋ฆฌ์คํธ์
๋๋ค. ๊ฐ๊ฐ ๋ฆฌ์คํธ์ ํด๋ฆญ์ ํ ๋ ์ด๋ค ์ด๋ฒคํธ๊ฐ ๋ฐ์ํด์ผ ํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. addEventListener๋ฅผ ์ฌ์ฉํด์ ์ด๋ฒคํธ ๋ฑ๋ก์ ํ ์ ์์๊ฒ๋๋ค.
4๊ฐ์ ์์ ์๋ li ํ๊ทธ๊ฐ ์์ต๋๋ค.
`
for(var i=0,len=lists.length; i < len; i++) {
lists[i].addEventListener("click", function(evt) {
log.innerHTML = "clicked" + evt.currentTarget.firstChild.src;
});
}๋ธ๋ผ์ฐ์ ๋ 4๊ฐ์ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ๊ธฐ์ตํ๊ณ ์์ต๋๋ค. ๊ทธ๋ฐ๋ฐ list๊ฐ ํจ์ฌ ๋ ๋ง๋ค๋ฉด ๋ธ๋ผ์ฐ์ ๋ ๊ธฐ์ตํด์ผ ํ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ ๊ทธ๋งํผ ๋ง์์ง๋๋ค. ๋นํจ์จ์ ์ด์ฃ . ๋ฌธ์ ๋ ํ๊ฐ์ง ๋ ์์ต๋๋ค. ๋ง์ฝ list๊ฐ ํ๋๋ ๋์ ์ผ๋ก ์ถ๊ฐ๋๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น์? ๋ค, ์ถ๊ฐ๋ ์๋ฆฌ๋จผํธ์ ์ญ์ addEventListener๋ฅผ ํด์ค์ผ ํฉ๋๋ค. ์ด๊ฒ๋ ๊ฝค ๋ถํธํ ์ผ ๊ฐ๋ค์. target ์ ๋ณด๊ฐ ์ฐ๋ฆฌ๋ฅผ ๋์ต๋๋ค. ์, ์ด๋ฒ์๋ ulํ๊ทธ์๋ง ์ด๋ฒคํธ๋ฅผ ์๋กญ๊ฒ ๋ฑ๋กํฉ๋๋ค.
ul.addEventListener("click",function(evt) {
console.log(evt.currentTarget, evt.target);
});์ด๋ด ๊ฒฝ์ฐ li์์ ์ด๋ฏธ์ง๋ฅผ ํด๋ฆญํ๋ฉด ์ ๊ฒฐ๊ณผ๋ ๋ฌด์์ผ๊น์? ๋ง์ฝ ul>li>imgํ๊ทธ๋ฅผ ํด๋ฆญํ๋ค๋ฉด ์ด๋ค ๊ฒฐ๊ณผ๊ฐ ๋์ฌ๊น์? ๊ทธ ์ ์ ์ด๋ฒคํธ๋ ์คํ์ ๋ ๊น์? ์ ๋ต์ '๋ค'์
๋๋ค. li๋ img ํ๊ทธ๋ ulํ๊ทธ์ ์ํ๊ธฐ๋ ํฉ๋๋ค. ๋ฐ๋ผ์ ul์ ๋ฑ๋กํ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ ์คํ์ด ๋ฉ๋๋ค. ์ด๊ฒ์ ์ด๋ฒคํธ ๋ฒ๋ธ๋ง์ด๋ผ๊ณ ํฉ๋๋ค. ํด๋ฆญํ ์ง์ ์ด ํ์์๋ฆฌ๋จผํธ๋ผ๊ณ ํ์ฌ๋, ๊ทธ๊ฒ์ ๊ฐ์ธ๊ณ ์๋ ์์ ์๋ฆฌ๋จผํธ๊น์ง ์ฌ๋ผ๊ฐ๋ฉด์ ์ด๋ฒคํธ๋ฆฌ์ค๋๊ฐ ์๋์ง ์ฐพ๋ ๊ณผ์ ์
๋๋ค. ๋ง์ฝ img,li,ul์ ๊ฐ๊ฐ ์ด๋ฒคํธ๋ฅผ ๋ฑ๋กํ์๋ค๋ฉด, 3๊ฐ์ ์ด๋ฒคํธ ๋ฆฌ์ค๋๊ฐ ์คํํ์ ๊ฒ๋๋ค. ์๋ ์ด๋ฏธ์ง๋ ํ์์๋ฆฌ๋จผํธ๋ 3๋ฒ๋ถํฐ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๊ณ 2,1์์ผ๋ก ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ต๋๋ค. ๋น์ทํ๊ฒ Capturing์ด๋ผ๋ ๊ฒ๋ ์์ต๋๋ค. ๋ฐํ๋ก ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ธ๋ฐ์. ๊ธฐ๋ณธ์ ์ผ๋ก Bubbling ์์๋ก ์ด๋ฒคํธ๊ฐ ๋ฐ์ํฉ๋๋ค. ๋ฐ๋ผ์ Bubblinf์ ์ ๊ธฐ์ตํด๋๋ ๊ฒ ์ข์ต๋๋ค. Capturing ๋จ๊ณ์์ ์ด๋ฒคํธ ๋ฐ์์ ์ํค๊ณ ์ถ๋ค๋ฉด addEventListener ๋ฉ์๋์ 3๋ฒ์งธ ์ธ์์ ๊ฐ์ true๋ก ์ฃผ๋ฉด ๋ฉ๋๋ค.  ์ฐ๋ฆฌ๋ img๋ li๋ฅผ ํด๋ฆญํด๋ ul์๋ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๊ณ , ์ด๋ฒคํธ ๋ฆฌ์ค๋ ์คํ์ด ๋๋ค๋ ๊ฒ์ ์๊ฒ ๋์ต๋๋ค. img๋ฅผ ํด๋ฆญํ๋ฉด ์๋ ๊ฒฐ๊ณผ๋ ๋ฌด์์ด ๋์ฌ๊น์? ul ๊ทธ๋ฆฌ๊ณ img ํ๊ทธ๊ฐ ๋์ต๋๋ค.
ul.addEventListener("click",function(evt) {
console.log(evt.currentTarget.tagName, evt.target.tagName);
});๋ค target ์ ๋ณด๋ ์ค์ ํด๋ฆญ ๋ ํ์ ์๋ฆฌ๋จผํธ๋ฅผ ์๋ ค์ค๋๋ค! ์ด ์ ์ ์ด์ฉํด์ src๋ฅผ ์ถ์ถํ ์ ์์ง ์์๊น์? ์ด์ addEventListener ๋ฉ์๋๋ฅผ ํ ๋ฒ๋ง ์ฐ๋ฉด์ ์ฐ๋ฆฌ๋ ๋ชจ๋ list์ image ์ ๋ณด๋ฅผ ํ์ธํ ์ ์์ต๋๋ค. ๋๊ตฌ๋ list ํ๊ทธ๊ฐ ํ๋ ๋ ์ถ๊ฐ๋๋ค๊ณ ํ์ฌ๋ ๋ฌธ์ ์์ด ๋์ํฉ๋๋ค.
var ul = document.querySelector("ul");
ul.addEventListener("click",function(evt) {
if(evt.target.tagName === "IMG") {
log.innerHTML = "clicked" + evt.target.src;
}
});๊ทธ๋ฐ๋ฐ ์์ ๋ฌธ์ ๊ฐ ํ๋ ๋ ์๋ ๊ฑฐ ๊ฐ๋ค์. ์์ ๋ฅผ ๋ณด๋ฉด, ์ด๋ฏธ์ง ํ๊ทธ๋ padding๊ฐ์ด ์์ด์, imgํ๊ทธ์ liํ๊ทธ ์ฌ์ด์ ๊ณต๋ฐฑ์ด ์กด์ฌํฉ๋๋ค. ์ด ๋ถ๋ถ(๊ณต๋ฐฑ)์ ํด๋ฆญํ๋ฉด tagName์ด li๋ผ์ ์์์ ๊ตฌํํ ์กฐ๊ฑด๋ฌธ์ผ๋ก ๋ค์ด๊ฐ์ง ์์๊ธฐ ๋๋ฌธ์
๋๋ค. ์ด ๋ถ๋ถ(๊ณต๋ฐฑ)์ ํด๋ฆญํด๋ ์ด๋ฏธ์ง url์ ์ถ๋ ฅํ ์ ์์ผ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผํ ๊น์?
var ul = document.querySelector("ul");
ul.addEventListener("click",function(evt) {
debugger;
if(evt.target.tagName === "IMG") {
log.innerHTML = "clicked" + evt.target.src;
} else if (evt.target.tagName === "LI") {
log.innerHTML = "clicked" + evt.target.firstChild.src;
}
});`
- load ์ด๋ฒคํธ ์ดํ์ ์์ ํ๋๊ฒ ์ข์ ๊ฑด ์ด๋ค ๊ฑธ๊น์?