[JavaScript] ์ด๋ฒคํธ ๋ฒ๋ธ๋ง๊ณผ ์บก์ณ๋ง์ด ๋ฌด์์ธ์ง ์์๋ด ์๋ค.
๐ ๋ค์ด๊ฐ๋ฉฐ
์๋ฐ์คํฌ๋ฆฝํธ์ ํต์ฌ ๊ฐ๋ ์ค ํ๋์ธ ์ด๋ฒคํธ ๋ฒ๋ธ๋ง๊ณผ ์บก์ณ๋ง์ ๋ํด์ ์์๋ณด๊ฒ ์ต๋๋ค.
๋ฒ๋ธ๋ง(Bubbling)
์ด๋ฒคํธ ๋ฒ๋ธ๋ง์ด๋ ๋ฌด์์ผ๊น์?
ํ ์์์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด, ํด๋น ์์์ ํ ๋น๋ ํธ๋ค๋ฌ๊ฐ ๋์ํ๊ณ , ์ด์ด์ ๋ถ๋ชจ ์์์ ํธ๋ค๋ฌ๊ฐ ๋์ํฉ๋๋ค. ๊ฐ์ฅ ์ต์๋จ์ ์กฐ์ ์์๋ฅผ ๋ง๋ ๋๊น์ง ํด๋น ๊ณผ์ ์ด ๋ฐ๋ณต์ด ๋ฉ๋๋ค.
๊ฐ๋จํ ์๋ ์ฝ๋ ์์ ๋ฅผ ๋ณด๋ฉด ๋ฐ๋ก ์ดํด๊ฐ ๋ ๊ฒ์ ๋๋ค.
๊ฐ์ฅ ์์ชฝ์ ์๋ pํ๊ทธ๋ฅผ ํด๋ฆญํ๋๋ฐ 3๊ฐ์ ํธ๋ค๋ฌ๊ฐ ๋์ํ๋ ๊ฒ ๋ณด์ด์๋์?
- p์ ํ ๋น๋ onclick ํธ๋ค๋ฌ ์คํ
- ๋ฐ๊นฅ์ div์ ํ ๋น๋ ํธ๋ค๋ฌ ์คํ
- ๊ทธ ๋ฐ๊นฅ์ form์ ํ ๋น๋ ํธ๋ค๋ฌ ์คํ
- documnet ๊ฐ์ฒด๋ฅผ ๋ง๋ ๋๊น์ง, ๊ฐ ์์์ ํ ๋น๋ onclick ํธ๋ค๋ฌ๊ฐ ๋์ํฉ๋๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก div๋ฅผ ํด๋ฆญํ๋ฉด div -> form ์์ผ๋ก ํธ๋ค๋ฌ๊ฐ ์คํ๋๋ ๋ชจ์ต์ ๋ณผ ์ ์์ต๋๋ค.
์ด์ ๊ฐ์ด ์ด๋ฐ ํ๋ฆ์ '์ด๋ฒคํธ ๋ฒ๋ธ๋ง'์ด๋ผ๊ณ ๋ถ๋ฆ ๋๋ค.
์ด๋ฒคํธ๊ฐ ์ ์ผ ๊น์ ๊ณณ์ ์๋ ์์๋ถํฐ ๋ถ๋ชจ ์์๋ฅผ ํ๊ณ ์ฌ๋ผ์ค๋ ๋ชจ์ต์ด ๋ง์น ๊ฑฐํ(bubble)๊ณผ ๋ฎ์๊ธฐ ๋๋ฌธ์ด๋ผ๊ณ ํฉ๋๋ค.
์บก์ณ๋ง(Capturing)
์บก์ณ๋ง์ ๋ฒ๋ธ๋ง๊ณผ ๋ฐ๋ ๋ฐฉํฅ์ผ๋ก ์ด๋ฒคํธ ์ ํ๊ฐ ์งํ๋ฉ๋๋ค.
์ ์ฝ๋๋ ์ด๋ฒคํธ ์บก์ณ๋ง ์ฝ๋์ ๋๋ค. ์ด ์ฝ๋๋ ์ญ์ '์ ์ฒด' ํธ๋ค๋ฌ์ ํ ๋นํด์ ์ด๋ค ํธ๋ค๋ฌ๊ฐ ๋์ํ๊ฒ ๋๋์ง ๋ณด์ฌ์ฃผ๋ ์ฝ๋์ ๋๋ค.
(์ฝ๋์๋๋ฐ์ค ๋ด ๋ฉ๋ด์ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ์ ์ํ์ต๋๋ค.)
for (let elem of document.querySelectorAll("*")) {
elem.addEventListener(
"click",
(e) => alert(`์บก์ณ๋ง: ${elem.tagName}`),
true
);
elem.addEventListener("click", (e) => alert(`๋ฒ๋ธ๋ง: ${elem.tagName}`));
}
p๋ฅผ ํด๋ฆญํ๋ฉด ์๋์ ์์์ ๊ฐ์ด ์ด๋ฒคํธ๊ฐ ์ ๋ฌ๋ฉ๋๋ค.
- html -> body -> form -> div (์บก์ณ๋ง, ์ฒซ ๋ฒ์งธ ์ด๋ฒคํธ ๋ฆฌ์ค๋)
- p (ํ๊น ๋จ๊ณ, ์บก์ณ๋ง๊ณผ ๋ฒ๋ธ๋ง ๋ ๋ค ์ด๋ฒคํธ ๋ฆฌ์ค๋์ ์ค์ ํ๊ธฐ ๋๋ฌธ์ ๋ ๋ฒ ํธ์ถ๋ฉ๋๋ค.)
- div -> form -> body -> html (๋ฒ๋ธ๋ง, ๋ ๋ฒ์งธ ์ด๋ฒคํธ ๋ฆฌ์ค๋)
capture ์ต์ ์ ๋ ๊ฐ์ง ์ต์ ์ ๊ฐ์ง ์ ์์ต๋๋ค.
์ด๋ฒคํธ ๋ฆฌ์ค๋์ ์ธ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ก {capture: true} ๋๋ true (capture ์๋ต ๊ฐ๋ฅ)
- false => (default ๊ฐ) ํธ๋ค๋ฌ๋ ๋ฒ๋ธ๋ง ๋จ๊ณ์์ ์์ํฉ๋๋ค.
- true์ด๋ฉด ํธ๋ค๋ฌ๋ ์บก์ณ๋ง ๋จ๊ณ๋ถํฐ ์์ํฉ๋๋ค.
์ด๋ฒคํธ ํ๋ฆ
์ด๋ฒคํธ ํ๋ฆ์ ์ด 3๊ฐ์ง ๋จ๊ณ๊ฐ ์์ต๋๋ค.
- ์บก์ณ๋ง ๋จ๊ณ => ์ด๋ฒคํธ๊ฐ ํ์ ์์๋ก ์ ํ๋๋ ๋จ๊ณ
- ํ๊น ๋จ๊ณ => ์ค์ ํ๊น ์์์ ์ ๋ฌ๋๋ ๋จ๊ณ
- ๋ฒ๋ธ๋ง ๋จ๊ณ => ์ด๋ฒคํธ๊ฐ ์์ ์์๋ก ์ ํ๋๋ ๋จ๊ณ
event.target๊ณผ event.currnetTarget
๋ถ๋ชจ ์์์ ํธ๋ค๋ฌ๋ ์ด๋ฒคํธ๊ฐ ์ ํํ ์ด๋์ ๋ฐ์ํ๋์ง ๋ฑ ์์ธํ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
๊ทธ๋ผ event. target๊ณผ event.currntTarget์ ๋ฌด์จ ์ฐจ์ด๊ฐ ์์๊น์?
- event.target์ ์ค์ ๋ก ์ด๋ฒคํธ๊ฐ ์์๋ ์์์ ๋๋ค.
- event.currentTarget์ 'ํ์ฌ' ์์๋ก, ํ์ฌ ์คํ ์ค์ธ ํธ๋ค๋ฌ๊ฐ ํ ๋น๋ ์์์ ๋๋ค.
์ด๋ฒคํธ ์ ํ ๋ง๊ธฐ
event.stopPropagation()
์ด๋ฒคํธ ๊ฐ์ฒด์ ๋ฉ์๋์ธ stopPropagation()์ ์ฌ์ฉํ๋ฉด ์ด๋ฒคํธ ์ ํ๋ฅผ ๋ง์ ์ ์์ต๋๋ค.
event.stopPropagation();
๋ฐ๋ผ์, ์ด๋ฒคํธ ๋ฒ๋ธ๋ง์ ๊ฒฝ์ฐ ํด๋น ํธ๋ค๋ฌ์ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๊ณ ๋ฒ๋ธ๋ง์ ์ค๋จํ๋๋ก ํ ์ ์์ต๋๋ค.
event.stopImmediatePropagation()
stopPropagation() ๋ฉ์๋๋ ํ์ฌ ์์์์ ๋ ์ด์์ ์ด๋ฒคํธ ์ ํ(๋ฒ๋ธ๋ง ๋ฐ ์บก์ณ๋ง)์ ๋ง์์ฃผ์ง๋ง, ๋ค๋ฅธ ํธ๋ค๋ฌ๋ค์ด ๋์ํ๋ ๊ฑด ๋ง์ง ๋ชปํฉ๋๋ค.
์ด๋ฒคํธ ์ ํ๋ฅผ ๋ฉ์ถ๊ณ , ์์์ ํ ๋น๋ ๋ค๋ฅธ ํธ๋ค๋ฌ๋ค์ ๋์๋ ๋ง์ ๋์๋ stopImmediatePropagation() ๋ฉ์๋๋ฅผ ์ฌ์ฉํฉ๋๋ค.
(๋ฒ์ธ) React์์ ์ด๋ฒคํธ ๋ฒ๋ธ๋ง?
Vanilla JavaScript์์๋ ๋ฒ๋ธ๋ง์ด ์ผ์ด๋๋ ์ํฉ์ ์ฝ๊ฒ ๋ง์ดํ ์ ์์ต๋๋ค.
ํ์ง๋ง, ๊ฐ์ธ์ ์ผ๋ก React๋ก ๊ฐ๋ฐ์ ํ ๋์๋ ํธ๋ค๋ฌ๋ฅผ ํ ๋นํด ์ฃผ๋๋ฐ ์ด๋ฒคํธ ๋ฒ๋ธ๋ง์ด ์ผ์ด๋๋ ์ํฉ์ ๋๋ผ์ง ๋ชปํ์ฌ ๋ ์์๋ณด์์ต๋๋ค.
SynthenticEvent
React์์ ์ด๋ฒคํธ ๋ฒ๋ธ๋ง์ด ๋ฐ์ํ์ง ์๋ ๊ฒ์ฒ๋ผ ๋๊ปด์ง๋ ์ด์ ๋ React๊ฐ ์์ฒด์ ์ธ ์ด๋ฒคํธ ์์คํ ์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ธ๋ฐ์.
์ด๋ฅผ 'SynthenticEvent'๋ผ๊ณ ๋ถ๋ฆ ๋๋ค.
React์ 'SynthenticEvent's๋ ์น ๋ธ๋ผ์ฐ์ ์ ๋ค์ดํฐ๋ธ ์ด๋ฒคํธ๋ฅผ ๊ฐ์ธ๋ Wrapper๋ก, ๋ชจ๋ ์ด๋ฒคํธ๊ฐ ์ต์๋จ์์ ๋จ ํ ๋ฒ๋ง ์ฒ๋ฆฌ๋ฉ๋๋ค.
์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์ง์ ์ ์ผ๋ก ์์์ ๋ถ์ด์ง ์๊ณ , ์ต์์ ๋ ธ๋์์ ์ด๋ฒคํธ ์์์ ํตํด ๋ชจ๋ ์ด๋ฒคํธ๋ฅผ ๊ฐ์งํ๊ณ ์ฒ๋ฆฌํฉ๋๋ค. ์ด๋ฌํ ์ด์ ๋ก React ์ปดํฌ๋ํธ ๋ด์์ ์ด๋ฒคํธ ๋ฒ๋ธ๋ง์ด ๋ฐ์ํ์ง ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ ๊ฒ์ ๋๋ค.
ํ์ง๋ง ์ค์ ๋ก ์ด๋ฒคํธ ๋ฒ๋ธ๋ง์ ์ผ์ด๋ฉ๋๋ค.
SynthenticEvent๊ฐ ์บก์ฒ๋ฅผ ํ๊ณ , ์ ์ ํ ์ปดํฌ๋ํธ์ ๋ถ๋ฐฐํ๊ณ , ๋ฐ๋ผ์ React์ SynthenticEvent๊ฐ ๋ค์ดํฐ๋ธ ์ด๋ฒคํธ๋ฅผ ๋ชจ๋ฐฉํ๊ธฐ ๋๋ฌธ์ stopPropagaion()์ ์ฌ์ฉํ์ฌ ์ด๋ฒคํธ ๋ฒ๋ธ๋ง์ ๋ง์ ์ ์์ต๋๋ค.
๐ ๋ง๋ฌด๋ฆฌ
์ด๋ฒคํธ ์บก์ณ๋ง๊ณผ ๋ฒ๋ธ๋ง์ ํ์ฉํ๋ฉด ์ด๋ฒคํธ ํธ๋ค๋ง ํจํด์ธ ์ด๋ฒคํธ ์์์ ๊ตฌํํ ์ ์์ต๋๋ค.
์ด๋ฒคํธ ์์์ ์ฌ์ฉํ๋ฉด ์์๋ง๋ค ํธ๋ค๋ฌ๋ฅผ ์ผ์ผ์ด ํธ๋ค๋ฌ๋ฅผ ํ ๋นํ์ง ์๊ณ ์์ ์์์์ ํ์ ์์์ ์ด๋ฒคํธ๋ค์ ์ ์ดํ๋ ๋ฐฉ์์ ๋๋ค.
์ด๋ฒคํธ ์์์ ๋ํด์๋ ์บก์ณ๋ง๊ณผ ๋ฒ๋ธ๋ง์ ๋ํ ๊ฐ๋ ๋ง ์์งํ๊ณ ์์ผ๋ฉด ๋น์ฅ ์ฌ์ฉํ ์ ์์ ์ ๋์ ํจํด์ด๊ณ ๋งค์ฐ ์ ์ฉํ ํจํด์ ๋๋ค.
ํด๋น ๊ธ์์ ๋ค๋ฃจ์ง๋ ์์์ต๋๋ค.
์ฐธ๊ณ ๋ฌธํ: