Event Capture, Propagation, Bubbling and Once

<div class="one">
<div class="two">
<div class="three"></div>
</div>
</div>
์ด๋ ๊ฒ ํ๋ฉด์ด ๊ตฌ์ฑ๋ ํ์ด์ง๊ฐ ์๋ค. one์ด ๊ฐ์ฅ ๋ฐ๊นฅ ์์ชฝ์ผ๋ก ๋ค์ด ๊ฐ์๋ก two - three๋ก ๊ตฌ์ฑ๋์ด ์๋ค.
Bubbling
const divs = document.querySelectorAll('div');
function logText(e) {
console.log(this.classList.value);
}
divs.forEach(div => div.addEventListener('click', logText));
//div.two๋ฅผ ํด๋ฆญํ ๊ฒฝ์ฐ console์ฐฝ์
//two
//one
//div.three๋ฅผ ํด๋ฆญํ ๊ฒฝ์ฐ
//three
//two
//one
console.log๋ฅผ this๋ก ๋ฐ๊พธ๊ณ div.three๋ฅผ ํด๋ฆญํ๋ค๋ฉด?
const divs = document.querySelectorAll('div');
function logText(e) {
console.log(this);
}
divs.forEach(div => div.addEventListener('click', logText));
//console ์ฐฝ์
//<div class="three"></div>
//<div class="two"></div>
//<div class="one"></div>
๊ทธ๋ผ console ์ฐฝ์ ์ฐจ๋ก๋๋ก ๋์จ๋ค.
์ฌ๋ฌ๊ฐ๊ฐ ๋ดํฌ๋ ์์๋ฅผ ํด๋ฆญํ๋ ๊ฒฝ์ฐ ๊ทธ์ ๋ถ๋ชจ์์ DOM๊น์ง ํด๋ฆญ ๋๋ ํ์์ ๋ณผ ์ ์๋ค.
Capture
javascript๊ฐ ์ด๋ป๊ฒ ์ผํ๋์ง ๋ณด์.
modern browsers๋ capture๋ผ๊ณ ๋ถ๋ฆฌ๋ ๊ฒ์ ํ๋ค.
element๋ฅผ ํด๋ฆญํ๋ฉด ๊ทธ๊ฒ์ ์์์ ์๋๋ก ํ๋ฌ๋ด๋ฆฐ๋ค.
๋ธ๋ผ์ฐ์ ๋ "๋ body๋ ํด๋ฆญํ๊ณ , one๋ ํด๋ฆญํ๊ณ two๋ ํด๋ฆญํ๊ณ three๋ ํด๋ฆญํ๋ค" ํ๊ณ ์ธ์ํ๋ค.
์ค์ ๋ก ์์์ ์๋๋ก ๋ด๋ ค๊ฐ๋ค๊ฐ, ๋ชจ๋ ์ด๋ฒคํธ๋ฅผ ๋ด๊ฐ ํด๋ฆญํ ๊ณณ์ "captures" ๋ฅผ ํ๊ณ ๋ณด๊ดํ๋ค.
ํ์ง๋ง ์ด๋ฒคํธ๋ ์คํ๋์ง ์๋๋ค.
๊ทธ๋ผ ์ด์ ํด๋ฆญํ ๊ณณ์์ "bubble Up"์ด ์ผ์ด๋๋ค.
๊ทธ๋ง์ ์ฆ ์๋์์ ์๋ก ์ด๋ฒคํธ ํธ๋ฆฌ๊ฑฐ๊ฐ ์ผ์ด๋๋ค.
๋ธ๋ผ์ฐ์ ๋ "์ข์ ์ฐ๋ฆฌ๊ฐ ์์๋ธ ์ง๊ธ๊น์ง ๋๊ฐ ํด๋ฆญํ ๋ชจ๋ ๊ฒ๋ค์ ์์ํ ๊ป" ๋ผ๊ณ ๋งํ๋ค.
three -> two -> one -> body ๊น์ง!
addEventListener์ 3๋ฒ์งธ option์ ์ฌ์ฉํ์
divs.forEach(div => div.addEventListener('click', logText, {
//์์์ ์๋๋ก ํ๋ฅด๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ค๋ ๊ฑฐ๋ค.
capture: true
}));
false๋ก ๋ฐ๊ฟ์ฃผ์.
divs.forEach(div => div.addEventListener('click', logText, {
//์์์ ์๋๋ก ํ๋ฅด๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ค๋ ๊ฑฐ๋ค.
capture: false
}));
Stop Propagation
๋ ํ๊ฐ์ง stop propagation์ด๋ผ ๋ถ๋ฆฌ๋๊ฑธ ํด์ค์ผ ํ๋ค.
๋ง์ฝ ๊ฐ์ฅ ์์ชฝ์ ์๋๊ฑธ ํด๋ฆญํ๋ค๋ฉด, ์ด๋ฒคํธ๊ฐ trigger ๋๋ค. parent์ ๊ทธ๊ฒ์ parent ๋ชจ๋๊ฐ.
ํจ์๋ฅผ ์์ ํ๋ค.
function logText(e) {
console.log(this.classList.value);
e.stopPropagation(); //stop bubbling!
}
bubbling ํด์ฃผ๋๊ฑธ ๋ฉ์ถ์ด ์ค๋ค. ๋๋ ์ฌ์ค ํ๋๋ง ํด๋ฆญํ์ด ๋ผ๋ ๋ป์ด ๋ ์ ์๋ค.'ใ ' ๊ทธ๋ผ ๋ด๊ฐ ๋ณธ๋ ์ํ๋ ํ๋๋ฅผ ํด๋ฆญํ๊ฒ ๋๋ค!
capture: true and stopPropagation()
function logText(e) {
console.log(this.classList.value);
e.stopPropagation(); // stop bubbling!
// console.log(this);
}
divs.forEach(div => div.addEventListener('click', logText, {
capture: true
}));
//console์
//one๋ง ๋ฌ๋ค.
์๋๋ฉด capture๊ฐ ๋ด๋ ค๊ฐ ๋ one์ ๋์ฐฉํ์ ๋ stopPropagation์ด ์ผ์ด๋๋ค. ๋์ด์ ๋ด๋ ค๊ฐ์ง ๋ชปํ๋ ๊ฒ์ด๋ค.'ใ '/
Once
์ด๋ฒคํธ๊ฐ ๋ฑ ํ๋ฒ๋ง ์ผ์ด๋๋๋ก ํด์ค๋ค.
function logText(e) {
console.log(this.classList.value);
// e.stopPropagation(); // stop bubbling!
// console.log(this);
}
divs.forEach(div => div.addEventListener('click', logText, {
capture: false,
once: true
}));
once๋ฅผ ์ฐ๋ฉด ์ด๋ฒคํธ๊ฐ ์คํ๋๊ณ ๊ทธ๊ฒ์ unbind๊ฐ ๋๋ค. unbind๋ removeEventListener ๋ก ์๊ฐํ๋ฉด ๋๋ค.
์ด๋ฒคํธ๊ฐ ์คํ๋๊ณ once๋ก ์ธํ์ฌ
addEventListener๋ unbind๊ฐ ๋๋ค.
div์์ ๊ฐ ํ๋ฒ์ฉ ์ด๋ฒคํธ๊ฐ ์คํ๋ ์ ์๋ค.
Example 2
html
<button></button>
js
button.addEventListener('click', () => {
console.log('Click!!!');
}, {
once: true
});
์ด๋ฒคํธ๋ ์ ๋ง ๋ฑ ํ๋ฒ๋ง ์คํ๋๋ค!
Last updated
Was this helpful?