1. ์บก์ณ๋ง๊ณผ ๋ฒ๋ธ๋ง
์บก์ณ๋ง(capturing)์ ์ด๋ฒคํธ๊ฐ ๊ฐ์ฅ ์์์ ๋ถ๋ชจ ์์์์๋ถํฐ ์์ํ์ฌ ์ค์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ์์๊น์ง ๋ด๋ ค์ค๋ ๊ณผ์ ์ ์๋ฏธํฉ๋๋ค. ๋ฐ๋ผ์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ์์์์ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ๋ฑ๋กํ๋๋ผ๋, ์์ ์์์ ๋ฑ๋ก๋ ์ด๋ฒคํธ ๋ฆฌ์ค๋๊ฐ ๋จผ์ ํธ์ถ๋ฉ๋๋ค.
๋ฐ๋ฉด์ ๋ฒ๋ธ๋ง(bubbling)์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ์์์์ ์์ํ์ฌ ์์ ์์๋ก ์ ํ๋๋ ๊ณผ์ ์ ์๋ฏธํฉ๋๋ค. ์ด ๊ฒฝ์ฐ์๋ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ์์์์ ๋ฑ๋กํ ์ด๋ฒคํธ ๋ฆฌ์ค๋๊ฐ ๋จผ์ ํธ์ถ๋๊ณ , ๊ทธ ํ์ ์์ ์์์ ๋ฑ๋ก๋ ์ด๋ฒคํธ ๋ฆฌ์ค๋๊ฐ ํธ์ถ๋ฉ๋๋ค.
์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ๋ฑ๋กํ ๋, ์ธ ๋ฒ์งธ ์ธ์๋ก ์ด๋ฒคํธ ์ ํ ๋ฐฉ์์ ์ค์ ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์๋์ ๊ฐ์ ์ฝ๋์์ ์บก์ณ๋ง์ ์ฌ์ฉํ๋๋ก ์ค์ ํ ์ ์์ต๋๋ค.
document.getElementById("myElement").addEventListener("click", myFunction, true);javascript Copy code document.getElementById("myElement").addEventListener("click", myFunction, false);
๋ฐ๋ผ์, ์ด๋ฒคํธ ์ ํ ๋ฐฉ์์ ์ค์ ํ์ฌ ์ ์ ํ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ํธ์ถํ์ฌ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
๋ฐ๋ฉด์ ๋ฒ๋ธ๋ง์ ์ฌ์ฉํ๋๋ก ์ค์ ํ๋ ค๋ฉด ์ธ ๋ฒ์งธ ์ธ์๋ฅผ ์๋ตํ๊ฑฐ๋ false๋ก ์ค์ ํ๋ฉด ๋ฉ๋๋ค.
javascript HTML์์ ํด๋ฆญ ์ด๋ฒคํธ๋ ๋ฐ์ํ ์์์์๋ถํฐ ์์ ์์๋ก ์ด๋ฒคํธ๊ฐ ์ ํ๋๋ ๋ ๊ฐ์ง ๋ฐฉ์์ธ ์บก์ณ๋ง๊ณผ ๋ฒ๋ธ๋ง์ ๋ฐ๋ผ ์ฒ๋ฆฌ๋ฉ๋๋ค.
2. ์ด๋ฒคํธ ์ ํ๋ฅผ ๋ง๋ ๋ฐฉ๋ฒ
event.stopPropagation()์ ์ฌ์ฉํ์ฌ ์ด๋ฒคํธ ์ ํ๋ฅผ ๋ง์ ์ ์์ต๋๋ค.
function myFunction(event) {
event.stopPropagation();
// ์ด๋ฒคํธ ์ ํ๋ฅผ ๋ง๋ ์ฝ๋
}
const $a = document.querySelector('a')
$a.addEventListener('click', (event) => {
event.preventDefault();
});
3. eventPhase()
Event.CAPTURING_PHASE // ์บก์ณ๋ง ๋จ๊ณ์์ ๋ฐ์ํ ์ด๋ฒคํธ
Event.AT_TARGET // ์ด๋ฒคํธ ๋์ ์์์์ ๋ฐ์ํ ์ด๋ฒคํธ
Event.BUBBLING_PHASE // ๋ฒ๋ธ๋ง ๋จ๊ณ์์ ๋ฐ์ํ ์ด๋ฒคํธ
์ด ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋จ๊ณ๋ฅผ ํ์ธํ์ฌ ์ ์ ํ ์ฒ๋ฆฌ๋ฅผ ์ํํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ค์ ์ฝ๋๋ eventPhase๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฒคํธ๊ฐ ๋ฒ๋ธ๋ง ๋จ๊ณ์์ ๋ฐ์ํ์ ๋๋ง ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์คํํฉ๋๋ค.์ ์ฝ๋์์ event.eventPhase === Event.BUBBLING_PHASE ์กฐ๊ฑด์ ์ด๋ฒคํธ๊ฐ ๋ฒ๋ธ๋ง ๋จ๊ณ์์ ๋ฐ์ํ ๊ฒฝ์ฐ์๋ง ์ฐธ์ด ๋ฉ๋๋ค. ๋ฐ๋ผ์ ๋ฒ๋ธ๋ง ๋จ๊ณ์์๋ง console.log๊ฐ ์คํ๋ฉ๋๋ค.
const myButton = document.getElementById("myButton");
myButton.addEventListener("click", function(event) {
if (event.eventPhase === Event.CAPTURING_PHASE) {
console.log("button clicked in capturing phase");
}
}, true);
์ ์ฝ๋๋ ์ด๋ฒคํธ ์บก์ณ๋ง ๋จ๊ณ์์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ์คํ๋ฉ๋๋ค. ์ด๋ฒคํธ ํธ๋ค๋ฌ์์ eventPhase๊ฐ Event.CAPTURING_PHASE์ธ ๊ฒฝ์ฐ์๋ง console.log๊ฐ ์คํ๋ฉ๋๋ค.
๋ํ, ์ด๋ฒคํธ ์บก์ณ๋ง ๋จ๊ณ์์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์คํํ๋ ค๋ฉด ์ธ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ก true๋ฅผ ์ ๋ฌํ์ฌ addEventListener๋ฅผ ํธ์ถํ๊ณ , ์ด๋ฒคํธ ํธ๋ค๋ฌ์์ eventPhase๋ฅผ ํ์ธํ๋ฉด ๋ฉ๋๋ค.
const myButton = document.getElementById("myButton"); myButton.addEventListener("click", function(event) { if (event.eventPhase === Event.BUBBLING_PHASE) { console.log("button clicked in bubbling phase"); } });
eventPhase ๋ฉ์๋๋ ์ด๋ฒคํธ๊ฐ ํ์ฌ ์ด๋ ๋จ๊ณ(์บก์ณ๋ง ๋จ๊ณ, ๋์ ์์ ๋จ๊ณ, ๋ฒ๋ธ๋ง ๋จ๊ณ)์์ ๋ฐ์ํ๋์ง๋ฅผ ๋ํ๋ด๋ ์์๊ฐ์ ๋ฐํํฉ๋๋ค. eventPhase ์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
'๐๏ธ์ํํธ์จ์ด > ๐JavaScript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋น๋๊ธฐ API ์ฒ๋ฆฌ (0) | 2023.01.21 |
---|---|
[webpack-dev-server] ์ฝ๋ ๋ณ๊ฒฝ์ฌํญ ๋ฐ๋ก ๋ฐ์(js) (0) | 2023.01.11 |
[Node.js] express ์ cors ์ฌ์ฉํด์ API ๋ง๋ค๊ธฐ (0) | 2022.12.19 |
์๋ฐ์คํฌ๋ฆฝํธ์์ ํ์ดํ๋ฅผ ์ฌ์ฉํ๋ ์ด์ (0) | 2022.11.29 |
[์๋ฐ์คํฌ๋ฆฝํธ] Math ํจ์ ์ด์ฉํ์ฌ ๋ก๋ ๋ฒํธ ์์ฑํ๊ธฐ (0) | 2022.11.08 |