๐๐ปJavaScript์๋ click , keypress , focus , submit , scroll , change ์ ๊ฐ์ ๋ค์ํ ์ด๋ฒคํธ๋ค์ด ์๋ค.
๋ง์ฝ ๋ถ๋ชจ ์์์ ์์ ์์์ ๋ ๋ค ๊ฐ์ ์ข ๋ฅ์ ์ด๋ฒคํธ๊ฐ ํ ๋น ๋์ด์์ ๋, ์ด๋ฒคํธ๋ฅผ ๋์์ํค๋ฉด ์ด๋ค ์ด๋ฒคํธ๊ฐ ๋จผ์ ์คํ๋ ๊น?
์ด๋ฒคํธ ๋ฒ๋ธ๋ง ( Event Bubbling )
์ด๋ฒคํธ ๋ฒ๋ธ๋ง์ ํน์ ํ๋ฉด ์์์์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋ ํด๋น ์ด๋ฒคํธ๊ฐ ๋ ์์์ ํ๋ฉด ์์๋ค๋ก ์ ๋ฌ๋์ด ๊ฐ๋ ํน์ฑ์ ์๋ฏธํ๋ค.
์์ ๊ฐ์ด ๋ธ๋ผ์ฐ์ ๋ ํน์ ํ๋ฉด ์์์์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋ ๊ทธ ์ด๋ฒคํธ๋ฅผ ์ต์์์ ์๋ ํ๋ฉด ์์๊น์ง
์ด๋ฒคํธ๋ฅผ ์ ํ์ํค๋ ํน์ฑ์ ๊ฐ์ง๊ณ ์๋ค.
์ด์ ๊ฐ์ ํ์์์ ์์ ์์๋ก์ ์ด๋ฒคํธ ์ ํ ๋ฐฉ์์ ์ด๋ฒคํธ ๋ฒ๋ธ๋ง(Event Bubbling)์ด๋ผ๊ณ ํ๋ค.
๐ซ์์
3๊ฐ์ ์์๊ฐ div > div > p ํํ๋ก ์ค์ฒฉ๋ ๊ตฌ์กฐ์ด๋ค . ์์ ๊ฐ๊ฐ์ onClick ํธ๋ค๋ฌ๊ฐ ํ ๋น๋์ด ์์ผ๋ฉฐ
์ด๋ฒคํธ ๋ฐ์์ alert, ์ฆ ๋ธ๋ผ์ฐ์ ์ ์๋ฆผ ์ฐฝ์ ๋์ฐ๋ ์ํ๋ฅผ ๊ฐ์ง๋ค.
<div onclick="alert('div outter')">div outter
<div onclick="alert('div inner')">div inner
<p onclick="alert('p')">P
</p>
</div>
</form>
๐งฉ #1 ๊ฐ์ฅ ์์ชฝ p ํ๊ทธ๋ฅผ ํด๋ฆญํ์๋ ์ด๋ฒคํธ ๋ฒ๋ธ๋ง์ ์ํด ์์ ์ต์์ ์ด๋ฒคํธ๊น์ง ์์๋๋ก ๋ชจ๋ ํ๊ทธ์ ์ด๋ฒคํธ๊ฐ
๋ฐ์ํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค ( ์๋ฆผ ์ฐฝ์ด 3๋ฒ ๋ฌ๋ค )
๐งฉ #2 ๋ง์ฐฌ๊ฐ์ง๋ก ์ค๊ฐ์ div๋ฅผ[ div inner ] ํด๋ฆญํ์๋ ๋ฒ๋ธ๋ง ํจ๊ณผ์ ์ํด ๋ณธ์ธ๊ณผ ๋ณธ์ธ ์์์ ์ด๋ฒคํธ ๋ฐ์์ผ๋ก
๋๋ฒ ์๋ฆผ ์ฐฝ์ด ๋จ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
( p ํ๊ทธ๋ div inner์ ์์ ํ๊ทธ์ด๊ธฐ ๋๋ฌธ์ ์์๋ก ํฅํ๋ ๋ฒ๋ธ๋ง ํจ๊ณผ๊ฐ ๋ฐ์ํ์ง ์๋ ๊ฒ์ ๋น์ฐ )
์ด๋ฐ ํ๋ฆ์ '์ด๋ฒคํธ ๋ฒ๋ธ๋ง’์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
์ด๋ฒคํธ๊ฐ ์ ์ผ ๊น์ ๊ณณ์ ์๋ ์์์์ ์์ํด ๋ถ๋ชจ ์์๋ฅผ ๊ฑฐ์ฌ๋ฌ ์ฌ๋ผ๊ฐ๋ฉฐ ๋ฐ์ํ๋ ๋ชจ์์ด
๋ง์น ๋ฌผ์ ๊ฑฐํ(bubble)๊ณผ ๋ฎ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฒ๋ธ๋ง ์ค๋จํ๊ธฐ
์ด๋ฒคํธ ๋ฒ๋ธ๋ง์ ํ๊น ์ด๋ฒคํธ์์ ์์ํด์ <html> ์์๋ฅผ ๊ฑฐ์ณ document ๊ฐ์ฒด๋ฅผ ๋ง๋ ๋๊น์ง ๊ฐ ๋ ธ๋์์ ๋ชจ๋ ๋ฐ์ํฉ๋๋ค. ๋ช๋ช ์ด๋ฒคํธ๋ window ๊ฐ์ฒด๊น์ง ๊ฑฐ์ฌ๋ฌ ์ฌ๋ผ๊ฐ๊ธฐ๋ ํฉ๋๋ค. ์ด ๋๋ ๋ชจ๋ ํธ๋ค๋ฌ๊ฐ ํธ์ถ๋ฉ๋๋ค.
๊ทธ๋ฐ๋ฐ ํธ๋ค๋ฌ์๊ฒ ์ด๋ฒคํธ๋ฅผ ์์ ํ ์ฒ๋ฆฌํ๊ณ ๋ ํ ๋ฒ๋ธ๋ง์ ์ค๋จํ๋๋ก ๋ช ๋ นํ ์๋ ์์ต๋๋ค.
์ด๋ฒคํธ ๊ฐ์ฒด์ ๋ฉ์๋์ธ event.stopPropagation() ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
<div class="div first">
div first
<div class="div second">
div second
<div class="div third">
div third
</div>
</div>
</div>
var items = document.querySelectorAll("div");
items.forEach(function(item) {
item.addEventListener('click', alertItem)
});
function alertItem(e) {
e.stopPropagation()
alert(e.target.className)
}
์ด๋ฒคํธ ์บก์ณ - Event Capture
์ด๋ฒคํธ ์บก์ณ๋ ์ด๋ฒคํธ ๋ฒ๋ธ๋ง๊ณผ ๋ฐ๋ ๋ฐฉํฅ์ผ๋ก ์งํ๋๋ ์ด๋ฒคํธ ์ ํ ๋ฐฉ์์ด๋ค.
์ ๊ทธ๋ฆผ์ฒ๋ผ ํน์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋ ์ต์์ ์์์ธ body ํ๊ทธ์์ ํด๋น ํ๊ทธ๋ฅผ ์ฐพ์ ๋ด๋ ค๊ฐ๋ค.
<body>
<div class="one">
<div class="two">
<div class="three">
</div>
</div>
</div>
</body>
var divs = document.querySelectorAll('div');
divs.forEach(function(div) {
div.addEventListener('click', logEvent, {
capture: true // default ๊ฐ์ false์
๋๋ค.
});
});
function logEvent(event) {
console.log(event.currentTarget.className);
}
addEventListener() API ์์ ์ต์ ๊ฐ์ฒด์ capture:true๋ฅผ ์ค์ ํด์ฃผ๋ฉด ํ์ธํ ์ ์๋ค.
๊ทธ๋ฌ๋ฉด ํด๋น ์ด๋ฒคํธ๋ฅผ ๊ฐ์งํ๊ธฐ ์ํด ์ด๋ฒคํธ ๋ฒ๋ธ๋ง๊ณผ ๋ฐ๋ ๋ฐฉํฅ์ผ๋ก ํ์ํ๋ค.
๐์ฐธ๊ณ &์ถ์ฒ
https://joshua1988.github.io/web-development/javascript/event-propagation-delegation/
'๐Technical interview(Front)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
HTML์ด ๋ ๋๋ง ์ค์ JavaScript๊ฐ ์คํ๋๋ฉด ๋ ๋๋ง์ด ๋ฉ์ถ๋ ์ด์ (0) | 2023.01.09 |
---|---|
Get๊ณผ Post์ ์ฐจ์ด (0) | 2022.12.16 |
๋ธ๋ผ์ฐ์ ์ ์ฅ์ ์ฐจ์ด์ ( Localstorage, SessionStorage, Cookie ) (0) | 2022.11.16 |
Promise (0) | 2022.11.16 |
[JavaScript] ์ค์ฝํ ์ฒด์ธ์ด๋? (0) | 2022.11.09 |