์ด๋ฒคํธ ๋ฒ๋ธ๋ง, ์บก์ฒ๋ง - 2
๋ฒ๋ธ๋ง ์ด๋ฒคํธ ์ค๋ฌด ์์ ์ ์ด๋ฒคํธ ์์์ ๋ํด์ ์์๋ด ๋๋ค.
Jun 6, 2021
๋ค์ด๊ฐ๋ฉฐ
์ง๋ ์ด๋ฒคํธ ๋ฒ๋ธ๋ง, ์บก์ฒ๋ง 1ํธ์ ์ด์ด์ ์ด๋ฒ 2ํธ์์๋ ์ค๋ฌด ์์ ์ ์ด๋ฒคํธ ์์์ ๋ํด์ ์ค๋ช ํฉ๋๋ค.
์ค๋ฌด์์ ํํ ๋ง๋ ์ ์๋ ์ด๋ฒคํธ ๋ฒ๋ธ๋ง
jsfiddle์ ์์ ๊ฐ ํ๋ ์์ต๋๋ค.
์ด ์์ ์ ์ฌ๋ฐ๋ฅธ ๋์์
- Display video ๋ฒํผ์ ํด๋ฆญํ๋ฉด viewBox๊ฐ ๋ํ๋ฉ๋๋ค.
- ๋์์์ ํด๋ฆญํ๋ฉด ๋์์์ด ์ฌ์ ๋ฉ๋๋ค.
- ๋นจ๊ฐ์ ์์ญ์ ํด๋ฆญํ๋ฉด viewBox๊ฐ ๋ซํ๋๋ค.
๋์์์ ์ฌ์ํ๊ธฐ ์ํด ๋์์์ ํด๋ฆญํ๋ฉด ์ฌ์์ ๋์ง๋ง ํ๋ฉด์ด ์ฌ๋ผ์ง๋๋ค.
๋ฌด์์ด ๋ฌธ์ ์ผ๊น์?์ ์์ ์์ ์ด๋ฒคํธ๊ฐ ์ด๋ป๊ฒ ์๋ํ๋์ง ๊ทธ๋ฆผ์ ํ๋ฒ ๊ทธ๋ ค๋ณด๊ฒ ์ต๋๋ค.

- Display video ๋ฒํผ์ ํด๋ฆญํ๋ฉด viewBox๊ฐ ๋ํ๋ฉ๋๋ค.
- ๋์์์ ์ฌ์์ํค๊ธฐ ์ํด video๋ฅผ ํด๋ฆญํฉ๋๋ค.
- window์์๋ถํฐ ์์ํ ์ด๋ฒคํธ๊ฐ video๊น์ง ์ ํ๋ฉ๋๋ค.(์บก์ณ๋ง)
- video์ ํ ๋น๋ video.play() ์ฝ๋๋ฅผ ์คํํฉ๋๋ค.
- ๋ฒ๋ธ๋ง์ผ๋ก window๊น์ง ์ด๋ฒคํธ๊ฐ ์ ํ๋ฉ๋๋ค.
- ์ ํ๋๋ ๋์ค์ viewBox์ ํ ๋น๋ ์ด๋ฒคํธ๋ฅผ ๋ง๋์ ์ด ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.(viewBox๋ฅผ ์จ๊น)
- window์์ ์ด๋ฒคํธ ํ๋ฆ์ด ์ข ๋ฃ๋ฉ๋๋ค.
Event.stopPropagation()
Event๊ฐ์ฒด์ ์๋ stopPropagation ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
The stopPropagation() method of the Event interface prevents further propagation of the current event in the capturing and bubbling phases
stopPropagation ๋ฉ์๋๋ฅผ ์ด์ฉํ์ฌ ๋ฒ๋ธ๋ง ๋จ๊ณ์์์ ์ถ๊ฐ ์ ํ๋ฅผ ๋ง์ผ๋ฉด ๋ฉ๋๋ค.
video.addEventListener('click', (event) => {
event.stopPropagation();
video.play();
});
์ต์ข jsfiddle์ ์ฌ๊ธฐ์์ ํ์ธํด์ฃผ์ธ์.
์ด๋ฒคํธ ์์(delegation)
๋ฒ๋ธ๋ง์ ์ด์ฉํด์ ์ด๋ฒคํธ ์์ ํจํด์ ์ฌ์ฉ ํ ์ ์์ต๋๋ค.
์ด๋ฒคํธ ์์์ด๋ DOM๋ด์์ ๊ด์ฌ์ ๋์์ด ๋๋ ์๋ฆฌ๋จผํธ๋ณด๋ค ์์์ ์์นํ ์๋ฆฌ๋จผํธ์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์ง์ ํ๋ ํ์์ ๋๋ค.
๋จผ์ ์ฌ๊ธฐ ๊ฐ๋จํ ์์ ๊ฐ ์์ต๋๋ค.
ํน๋ณํ ๋์์ ์๊ณ ๊ฐ li ์๋ ๋จผํธ๋ฅผ ํด๋ฆญํ๋ฉด ๊ทธ ์์ ์๋ textContent๋ฅผ alert์ผ๋ก ๋ณด์ฌ์ฃผ๋ ์ฝ๋์ ๋๋ค.
์ฝ๋๋ฅผ ์ดํด ๋ณด๋ฉด li ์๋ ๋จผํธ๋ค์ forEach๋ก ์ํํ๋ฉด์ ๊ฐ li์ click ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ํ ๋น ํฉ๋๋ค.
const lists = document.querySelectorAll('li');
lists.forEach((list) => {
list.addEventListener('click', () => {
if (event.target.nodeName === 'LI') {
alert(event.target.textContent);
}
return;
});
});
์ด ์ฝ๋๋ฅผ ์ด๋ฒคํธ ์์์ ์ด์ฉํ ๋ฐฉ์์ผ๋ก ๊ตฌํํ ์ ์์ต๋๋ค.
const root = document.querySelector('.root');
root.addEventListener('click', () => {
if (event.target.nodeName === 'LI') {
alert(event.target.textContent);
}
return;
});
์ด๋ฒคํธ ์ฒ๋ฆฌ๋ฅผ li์ ๋ถ๋ชจ์ธ ul์๊ฒ ์์ํ๋ ๊ฒ์ ๋๋ค.
li๋ฅผ ์ํํ๋ฉด์ ๋๊ฐ์ ์ผ์ ํ๋ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ํ๋ํ๋ ํ ๋นํ์ง ์์๋ ๋๊ธฐ ๋๋ฌธ์ ํจ์ฌ ํจ์จ์ ์ ๋๋ค.
์ด๋ ๊ฒ ๋ถ๋ชจ์ธ ul์๊ฒ ์ด๋ฒคํธ ์์์ด ๊ฐ๋ฅํ๊ฒ์ ๋ฒ๋ธ๋ง๊ณผ event.target์ ํตํด์ ์ค์ ๋ก ์ด๋์์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋์ง ์ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
event.target
์ด๋ฒคํธ ์์ ์์ ๋ฅผ ๊ทธ๋ฆผ์ผ๋ก ํํํ๋ฉด ์๋์ ๊ฐ์ต๋๋ค.

๋ถ๋ชจ์๊ฒ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ํ ๋นํ๋ฉด Event ๊ฐ์ฒด์ target ํ๋กํผํฐ๋ฅผ ์ด์ฉํ์ฌ
์ด๋ฒคํธ๋ฅผ ์ ๋ฌํ ๊ฐ์ฒด์ ๋ํ ์ฐธ์กฐ๋ฅผ ์ป์ ์ ์์ต๋๋ค.
event.currentTarget
event.target๊ณผ ๋ค๋ฅธ์ ์ currentTarget์ ์ด์ฉํด์ ์ด๋ฒคํธ ๋ฆฌ์ค๋๊ฐ ์๋ ๋์์ ์ฐธ์กฐ ํ ์ ์์ต๋๋ค.
์ด ์์ ์์๋ ul ๋ถ๋ชจ ์์ ์ ๋๋ค.
์ต์ข jsfiddle์ ์ฌ๊ธฐ์์ ํ์ธํด์ฃผ์ธ์.
๋ง์น๋ฉฐ
2ํธ์์๋ ์ค๋ฌด์์ ํ๋ฒ์ฏค์ ๊ฒช์ฌ๋ดค์ ๋ฒ๋ธ๋ง ์์ ์ ๋ฒ๋ธ๋ง์ ์ด์ฉํ ์ด๋ฒคํธ ์์ ํจํด์ ๋ํด์ ์์ ๋ณด์์ต๋๋ค.
ํํ๊ฒ ๊ณต์์ฒ๋ผ stop.proPagation()์ ์ฌ์ฉํ๊ณค ํ์๋๋ฐ ์ด๋ฒ ๊ธฐํ๋ฅผ ํตํด ์ ์ด๋ฌํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋์ง, DOM์์์ ์ด๋ฒคํธ๊ฐ ์ด๋ป๊ฒ ๋์ํ๋์ง ์ดํด ํ ์ ์๊ฒ ๋์์ต๋๋ค.
๋ค์๋ฌ ์ฃผ์ ๋ ๋ฌด์์ ํด์ผํ๋ ๊ณ ๋ฏผํ๋ฉฐ ์ด๋ง ๋ง์น๊ฒ ์ต๋๋คโฆ
์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.