์ด๋ฒคํธ๊ฐ DOMํธ๋ฆฌ๋ฅผ ํ๊ณ ๋ฐ์ํ๋ ํ๋ฆ
- ์ด๋ฒคํธ๋ document์์ ์์ํด DOM ํธ๋ฆฌ๋ฅผ ๋ฐ๋ผ event.target๊น์ง ๋ด๋ ค๊ฐ๋ค. ์ด๋ฒคํธ๋ ํธ๋ฆฌ๋ฅผ ๋ฐ๋ผ ๋ด๋ ค๊ฐ๋ฉด์ addEventListener(..., true)๋ก ํ ๋นํ ํธ๋ค๋ฌ๋ฅผ ๋์์ํต๋๋ค. addEventListener(..., true)์ true๋ {capture: true}์ ์ถ์ฝํ์ด๋ค.
- ์ดํ ํ๊น ์์์ ์ค์ ๋ ํธ๋ค๋ฌ๊ฐ ํธ์ถ๋๋ค.
- ์ดํ์ ์ด๋ฒคํธ๊ฐ event.target๋ถํฐ ์์ํด์ ๋ค์ ์ต์์ ๋ ธ๋๊น์ง ์ ๋ฌ๋๋ฉด์ ๊ฐ ์์์ on<event>๋ก ํ ๋นํ ํธ๋ค๋ฌ์ addEventListener๋ก ํ ๋นํ ํธ๋ค๋ฌ๋ฅผ ๋์์ํจ๋ค. addEventListener๋ก ํ ๋นํ ํธ๋ค๋ฌ ์ค, ์ธ ๋ฒ์งธ ์ธ์๊ฐ ์๊ฑฐ๋ false, {capture: false}์ธ ํธ๋ค๋ฌ๋ง ํธ์ถ๋๋ค.
์ด๋ฒคํธ๋ฒ๋ธ๋ง
<div> <!-- ์ฌ๊ธฐ๋ ๋ฐ์-->
<div> <!-- ์ฌ๊ธฐ๋ ๋ฐ์-->
<p>์๋
</p> <!-- ์ฌ๊ธฐ์ ์ด๋ฒคํธ๋ฅผ ๊ฑธ๋ฉด -->
</div>
</div>
html ํ์ ์์(ํ๊ทธ)์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋, ๊ทธ ์์์ ์์ ์์๊น์ง ์ด๋ฒคํธ๊ฐ ์คํ๋๋ ๊ฒ์ ๋ปํ๋ค.
(๋ชจ๋ ์ด๋ฒคํธ๊ฐ ๋ฒ๋ธ๋ง๋์ง๋ ์๋๋ค. ex. focus, blur, mouseenter, mouseleave)
-> ์ ์ด๋ฒคํธ๋ฅผ ๋ฒ๋ธ๋งํ๊ณ ์ถ๋ค๋ฉด focusin, focosout, mouseover, mouseout์ผ๋ก ๋์ฒดํ ์ ์๋ค.
.stopPropagation()
button.addEventListener('click', (e) => {
e.stopPropagation();
console.log("button was clicked");
})
์ด ํจ์๋ฅผ ์ด๋ฒคํธ์ ๋ถ์ด๋ฉด ์์ ์์๋ก์ ์ด๋ฒคํธ ๋ฒ๋ธ๋ง์ ๋ง๋๋ค.
** stopPropagation์ ๋๋ฌด ๋จ๋ฐํ๋ฉด ํด๋น ์ด๋ฒคํธ ์์ญ์ด ์ฃฝ์ ์์ญ(Dead Zone)์ธ์ง ๋ชจ๋ฅด๊ณ ์ด๋ฒคํธ๊ฐ ์ ๋์ํ์ง ์๋์ง ๋ชจ๋ฅด๋ ๊ฒฝ์ฐ๊ฐ ์๊ธฐ๊ธฐ ๋๋ฌธ์, ๋ฐ๋์ ์ด์ ๋ฅผ ๊ฐ์ง๊ณ ์จ์ผ ํ๋ค. (์ฐธ๊ณ : https://ko.javascript.info/bubbling-and-capturing)
.stopImmediatePropagation()
function myFunction(event) {
alert ("Hello World!");
event.stopImmediatePropagation(); // ์ฌ๊ธฐ
alert ("I will not get to say Hello World"); //์ด๊ฒ๊น์ง๋ง ์คํ๋๋ค.
}
function someOtherFunction() {
alert ("I will not get to say Hello World"); // ๋ฌด์
}
var x = document.getElementById("myBtn");
x.addEventListener("click", myFunction);
x.addEventListener("click", someOtherFunction);
stopPropagation()์ ํด๋น ์ด๋ฒคํธํธ๋ค๋ฌ์ ์์ชฝ์ผ๋ก ์ผ์ด๋๋ ๋ฒ๋ธ๋ง์ ๋ง์์ฃผ์ง๋ง, ์์์ ๋ค๋ฅธ ์ด๋ฒคํธํธ๋ค๋ฌ์ ์๋๊น์ง ๋ง์ง๋ ๋ชปํ๋ค.๊ทธ๋ฌ๋ stopImmediatePropagation()์ ๊ทธ ํ ์ด๋ฒคํธํธ๋ค๋ฌ๋ฅผ ์ ๋ถ ๋ฌด์ํ๋ค.
.preventDefault()
์์์ ๊ณ ์ ๋์์ ์ค๋จ์ํจ๋ค.
์ด๋ฒคํธ์บก์ฒ๋ง
//์๋ ๋ ๋ค ๋์ผํ ๊ธฐ๋ฅ์ ํ๋ค.
target.addEventListener("click", function(){}, true);
target.addEventListener(..., {capture: true});
์ด๋ฒคํธ์บก์ฒ๋ง์ ๋ฒ๋ธ๋ง๊ณผ ๋ฐ๋๋ก ์์์ ์๋๋ก ์ด๋ฒคํธ๊ฐ ์ ํ๋๋ ๊ฒ์ ๋ปํ๋ค.
์ด๋ฒคํธ๋ฅผ ๋ฑ๋กํ ๋ ํ๋ผ๋ฏธํฐ๋ฅผ ๋๊ฐ๋ง ์ฐ๋ฉด ์บก์ฒ๋ง์ ๋์ง ์๋๋ค. ์ธ๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ก true ํน์ capture: true๋ฅผ ๋ฃ์ผ๋ฉด ์บก์ฒ๋ง์ด ์๋ํ๋ค. (false๊ฐ default๊ฐ์ด๋ค.)
์ด๋ฒคํธ ๊ฐ์ฒด์ ํ๋กํผํฐ๋ค
- event.target – ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๊ฐ์ฅ ์์ชฝ์ ์์ (์ ์ ๊ฐ ์ค์ ๋ก ๋๋ฅธ ๊ณณ์ด ๋๊ธฐ๋ ํ๋ค)
- event.currentTarget (=this) – ์ด๋ฒคํธ๋ฅผ ํธ๋ค๋ง ํ๋ ํ์ฌ ์์ (ํธ๋ค๋ฌ๊ฐ ์ค์ ํ ๋น๋ ์์)
- event.eventPhase – ํ์ฌ ์ด๋ฒคํธ ํ๋ฆ ๋จ๊ณ(์บก์ฒ๋ง=1, ํ๊น=2, ๋ฒ๋ธ๋ง=3)
์๋ฒฝํ๊ฒ ์ ๋ฆฌ๋์ด์๋ ์ฐธ๊ณ ์ฌ์ดํธ : https://medium.com/%EC%98%A4%EB%8A%98%EC%9D%98-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/stoppropagation-vs-stopimmediatepropagation-%EC%A0%9C%EB%8C%80%EB%A1%9C-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-75edaaed7841
์๋ฒฝํ๊ฒ ์ ๋ฆฌ๋์ด์๋ ์ฐธ๊ณ ์ฌ์ดํธ 2 : https://ko.javascript.info/bubbling-and-capturing
์ถ์ฒ : ์ฝ๋ฉ์ ํ https://codingapple.com/ / MDN https://developer.mozilla.org/ko/