์ถ์ฒ์์ ์บก์ณํ ์ฌ์ง์ ๋ณด๋ฉด ์ ์ ์๋ฏ, DOM ์ด๋ฒคํธ์์ ์ ์ํ ์ด๋ฒคํธ ํธ์ถ์
์บก์ณ๋ง ๋จ๊ณ -> ํ๊น ๋จ๊ณ -> ๋ฒ๋ธ๋ง ๋จ๊ณ๋ฅผ ๊ฑฐ์น๋ค.
์ต์๋จ ์์๋ถํฐ ์ด๋ฒคํธ๊ฐ ์ ํ๋๊ณ
-> ์ด๋ฒคํธ๊ฐ ๋ฐ์๋ ํ๊น์ ๋ฐ๊ฒฌํ๊ณ
-> ์ด๋ฒคํธ๊ฐ ๋ฐ์๋ ํ๊น๋ถํฐ ์ต์๋จ ์์๋ก ์ด๋ฒคํธ๊ฐ ์ ํ๋๋ค.
์บก์ณ๋ง์ ์ฌ์ฉํ๊ณ ์ถ์ ๊ฒฝ์ฐ๋
<script>
a.addEventListener('click', () => {
// ...
}, { capture: true })
</script>
์ฒ๋ผ addEventListener
ํจ์์ ์ธ๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ก true
๋๋ { capture: true }
๋ฅผ ์
๋ ฅํ๋ฉด ๋๋ค.
ํ์ง๋ง ์บก์ณ๋ง์ ์์ฃผ ์ฌ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ฒ๋ธ๋ง์ ์กฐ๊ธ ๋ ์์ธํ ์ค๋ช ํ๊ณ ์ ํ๋ค.
์์ ์๋ฆฌ๋จผํธ์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ์๋ํ ๊ฒฝ์ฐ, ๋ถ๋ชจ์ ๋ถ๋ชจ์ ๋ถ๋ชจ ... ์ต์๋จ ์์๊น์ง ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ์๋ํ๋ ๊ฒ์ ์๋ฏธํ๋ค.
๊ฐ์ฅ ๋น ๋ฅด๊ฒ ํ์ธํ ์ ์๋ ์์๋ก ํด๋ฆญ ์ด๋ฒคํธ๋ฅผ ๋ค ์ ์๋ค.
<div onclick="alert('div area')">
<p onclick="alert('p area')">click here!</p>
</div>
"click here!"์ ํด๋นํ๋ ํ
์ค๋ฅผ ์
๋ ฅํ ๊ฒฝ์ฐ <p>
ํ๊ทธ์ ๋ฑ๋ก๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ์๋ํ๊ณ ์ด์ด ๋ถ๋ชจ ์์์ธ <div>
ํ๊ทธ์ ๋ฑ๋ก๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ์๋ํ๋ค.
์๋ฅผ ๋ค์ด ํ๋์ ์ํ ์์ญ์ ํด๋ฆญํ์ ๋ ํด๋ฆญ ์ด๋ฒคํธ๊ฐ ๋์ํ๋๋ก ํ๊ณ ์ถ๋ค๊ณ ๊ฐ์ ํ์.
<div id="product">
<div>
<img src="./assets/icons/icon-folder.png" alt="" style="width: 50px;height: 50px;">
</div>
<div>
<p>์ ๋ชฉ: ๋๋ ์ค๋ ์ด ์ ์๋ ์์ด ํ์ํด.</p>
<p>๋ด์ฉ: ์ด๊ฑด ์์์ผ. ๋ค๊ฐ ๊ฐ๊ณ ์ถ์ด ํ๋ ์์ ๊ทธ ์์ ๋ค์ด ์์ด.</p>
</div>
</div>
<script>
const productArea = document.querySelector("#product");
productArea.addEventListener('click', (e) => {
console.log(e.target);
alert('ํ์ ๋์์ต๋๋ค.')
})
</script>
e.target
์ ํด๋ฆญ ์ด๋ฒคํธ๋ฅผ ๋ฐ์ ์ํจ ์์๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
์ฝ์ ์ฐฝ์ ๋ณด๋ฉด ์ด๋ฒคํธ๊ฐ ๋ฑ๋ก๋ id๊ฐ product
์ธ <div>
์์์ ์์ ์์๋ฅผ ํด๋ฆญํ์์ ํ์ธํ ์ ์๋ค.
ํ์ง๋ง ๊ฒฐ๊ณผ๋ ์๋ํ๋๋ก id๊ฐ product
์ธ <div>
์์์ ๋ฑ๋ก๋ ํด๋ฆญ ์ด๋ฒคํธ๊ฐ ๋์ํ๋ค.
๋ง์ฝ ๋ฒ๋ธ๋ง์ด ์๋ค๋ฉด id๊ฐ product
์ธ <div>
์์์ ์์ ์์ ๋ชจ๋์ ํด๋ฆญ ์ด๋ฒคํธ๋ฅผ ๋ฑ๋กํด์ผํ๋ ๋ถํธํจ์ด ์์์ ๊ฒ์ด๋ค.
<script>
a.addEventListener('click', (e) => {
// ์ ํ(Propagation)๋ฅผ ๋ง๋ ๊ฒ, ์ฆ ๋ฒ๋ธ๋ง ๋ง๊ธฐ
// ํ์ง๋ง ๋ค๋ฅธ ํธ๋ค๋ฌ์ ๋์์ ๋ง์ง๋ ๋ชปํจ
e.stopPropagation();
// ๋ฒ๋ธ๋ง๊ณผ ๋ค๋ฅธ ์์์ ํ ๋น๋ ํธ๋ค๋ฌ์ ๋์๊น์ง ๋ง๊ธฐ
e.stopImmediatePropagation();
})
</script>
์ ์์์์ ์ด๋ฏธ์ง๋ฅผ ํด๋ฆญํ์ ๋๋ ๋ฒ๋ธ๋ง์ด ๋์ํ์ง ๋ชปํ๋๋ก ํ๊ณ ์ถ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ๋ฉด ๋๋ค.
<script>
const productArea = document.querySelector("#product");
productArea.addEventListener('click', (e) => {
console.log(e.target);
alert('ํ์ ๋์์ต๋๋ค.')
})
const imgArea = document.querySelector("#product > div> img");
imgArea.addEventListener('click', (e) => {
e.stopPropagation();
// e.stopImmediatePropagation();
alert('์ด๋ฏธ์ง ๋ชจ๋ฌ ๋จ๋๋ก ํ๊ณ ์ถ์ด์.');
})
</script>
e.stopPropagation();
๋ฅผ ์ถ๊ฐํ๊ณ ํ์ง ์๋ ๊ฒ์ ์ฐจ์ด๋ ๋ค์๊ณผ ๊ฐ๋ค.