DOM ์์ ์ด๋ฒคํธ ์ฒ๋ฆฌ
-
DOM level 0 Event Model
- ์ธ๋ผ์ธ ์ด๋ฒคํธ ๋ชจ๋ธ : ํ๊ทธ ๋ ๋ฒจ์ ์ด๋ฒคํธ ์์ฑ์ ์ด์ฉํ ์ด๋ฒคํธ ์ฒ๋ฆฌ (์ฌ์ฉํ์ง ์๋๊ฒ์ ์ถ์ฒ)
- ๋ํดํธ ์ด๋ฒคํธ ๋ชจ๋ธ : ์ด๋ฒคํธ ์์ฑ์ ์ด์ฉํ ์ด๋ฒคํธ ์ฒ๋ฆฌ
-
DOM level 2 Event Model
- ํ์ค ์ด๋ฒคํธ ๋ชจ๋ธ : ์ด๋ฒคํธ ์ฒ๋ฆฌ ๋ฉ์๋๋ฅผ ์ด์ฉํ ์ด๋ฒคํธ ์ฒ๋ฆฌ
โ addEventListener(eventName, handler, isCapture) โ removeEventListener(eventName, handler)
DOM์์ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์๋ DOM level 0, DOM level 2 ๋ ๊ฐ์ง ๋ชจ๋ธ์ด ์๋ค. DOM level 0 ๋ชจ๋ธ์ ์ธ๋ผ์ธ ์ด๋ฒคํธ ๋ชจ๋ธ๊ณผ ๋ํดํธ ์ด๋ฒคํธ ๋ชจ๋ธ์ด ์๋ค. ์ธ๋ผ์ธ ์ด๋ฒคํธ ๋ชจ๋ธ์ ํ๊ทธ ๋ ๋ฒจ์ ์ด๋ฒคํธ ์์ฑ์ ์ด์ฉํ์ฌ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ผ๋ก, ๊ฐ๋ ์ฑ๊ณผ ์ ์ง๋ณด์์ ์ด๋ ค์ ๋๋ฌธ์ ์ฌ์ฉ์ ๊ถ์ฅํ์ง ์๋๋ค. ๋ํดํธ ์ด๋ฒคํธ ๋ชจ๋ธ์ ์ด๋ฒคํธ ์์ฑ์ ์ด์ฉํ์ฌ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ผ๋ก, ์ธ๋ผ์ธ ์ด๋ฒคํธ ๋ชจ๋ธ๋ณด๋ค๋ ๋์ ๋ฐฉ๋ฒ์ด๋ค.
DOM level 2 ๋ชจ๋ธ์ ํ์ค ์ด๋ฒคํธ ๋ชจ๋ธ๋ก ์ด๋ฒคํธ ์ฒ๋ฆฌ ๋ฉ์๋๋ฅผ ์ด์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ค. ์ด ๋ฐฉ๋ฒ์ ๊ฐ๋ ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ด ๋์ ์ถ์ฒ๋๋ ๋ฐฉ๋ฒ์ด๋ค.
์์ :
document.getElementById("myButton").addEventListener("click", function(){
alert("Button clicked");
});
์ด๋ฒคํธ ๋ฒ๋ธ๋ง๊ณผ ์บก์ณ๋ง
์ด๋ฒคํธ ๋ฒ๋ธ๋ง๊ณผ ์บก์ณ๋ง์ DOM์์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋, ์ด๋ฒคํธ๊ฐ ์ ํ๋๋ ๋ฐฉ์์ ๋งํฉ๋๋ค.
์ด๋ฒคํธ ๋ฒ๋ธ๋ง์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ์๋ฆฌ๋จผํธ์์ ์์ํ์ฌ ์์ ์์๋ก ์ ํ๋๋ ๋ฐฉ์์ ๋๋ค. ์๋ฅผ ๋ค์ด, ์๋์ ๊ฐ์ HTML ์ฝ๋๊ฐ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
<div id="outer">
<div id="inner">
<button id="btn">Click me</button>
</div>
</div>
์ด ๊ฒฝ์ฐ, btn
์์์์ ํด๋ฆญ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด, ์ด๋ฒคํธ๋ btn
์์์์ ์์ํ์ฌ ์์ ์์์ธ inner
์์, ๊ทธ๋ฆฌ๊ณ outer
์์๋ก ์ ํ๋ฉ๋๋ค. ์ด๋ฒคํธ ๋ฒ๋ธ๋ง์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ ๋ธ๋ผ์ฐ์ ์์ ์ง์๋๋ฉฐ, ์ด๋ฒคํธ ์ ํ ์์๊ฐ ์์ ์์์์ ๋ถ๋ชจ ์์๋ก ์ด๋ฃจ์ด์ง๊ธฐ ๋๋ฌธ์ ์์ ์์์์ ์ด๋ฒคํธ๋ฅผ ์บ์นํ๊ฑฐ๋ ์ฒ๋ฆฌํ๊ธฐ ์ฉ์ดํฉ๋๋ค.
์ด๋ฒคํธ ์บก์ณ๋ง์ ์ด๋ฒคํธ ๋ฒ๋ธ๋ง๊ณผ ๋ฐ๋๋ก ์์ ์์์์ ์์ํ์ฌ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ์๋ฆฌ๋จผํธ๋ก ์ ํ๋๋ ๋ฐฉ์์ ๋๋ค. ์ด๋ฒคํธ ์บก์ณ๋ง์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ ๋ธ๋ผ์ฐ์ ์์ ์ง์๋์ง๋ง, IE8 ์ดํ ๋ฒ์ ์์๋ ์ง์๋์ง ์์ต๋๋ค.
์๋ฅผ ๋ค์ด ์์ HTML ์ฝ๋์์ btn
์์์์ ํด๋ฆญ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด, ์ด๋ฒคํธ๋ outer
์์์์ ์์ํ์ฌ inner
์์, ๊ทธ๋ฆฌ๊ณ btn
์์๋ก ์ ํ๋ฉ๋๋ค. ์ด๋ฒคํธ ์บก์ณ๋ง์ ์ด๋ฒคํธ ์ ํ ์์๊ฐ ๋ถ๋ชจ ์์์์ ์์ ์์๋ก ์ด๋ฃจ์ด์ง๊ธฐ ๋๋ฌธ์ ์์ ์์์์ ์ด๋ฒคํธ๋ฅผ ์บ์นํ๊ฑฐ๋ ์ฒ๋ฆฌํ๊ธฐ ์ฉ์ดํฉ๋๋ค.
์์:
<div id="outer">
<div id="inner">
<button id="btn">Click me</button>
</div>
</div>
<script>
const outer = document.getElementById("outer");
const inner = document.getElementById("inner");
const btn = document.getElementById("btn");
outer.addEventListener("click", function() {
console.log("outer clicked");
}, true);
inner.addEventListener("click", function() {
console.log("inner clicked");
}, true);
btn.addEventListener("click", function() {
console.log("button clicked");
}, true);
</script>
์ ์ฝ๋์์ true
๊ฐ์ ์ด๋ฒคํธ ์บก์ณ๋ง์ ์ฌ์ฉํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. btn
์์์์ ํด๋ฆญ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด, ์ด๋ฒคํธ๋ outer
์์์์ ์์ํ์ฌ inner
์์, ๊ทธ๋ฆฌ๊ณ btn
์์๋ก ์ ํ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ฝ์์๋ ์๋์ ๊ฐ์ด ์ถ๋ ฅ๋ฉ๋๋ค.
outer clicked
inner clicked
button clicked
<body>
<h1>hello, world</h1>
<h4>๋ค์ค ์ด๋ฒคํธ ์ฐ๊ฒฐ</h4>
<button id="btn">๋ฒํผ</button>
</body>
<script>
var btn;
function clickHandler1() {
alert('clickHandler1');
}
function clickHandler2() {
alert('clickHandler2');
btn.removeEventListener('click', clickHandler2);
// ์ฒซ ํด๋ฆญ์์๋ง handler2๊ฐ ๋์ํ๊ณ , ์ดํ๋ถํฐ๋ handler2๊ฐ ๋์ํ์ง ์์
}
function init() {
btn = document.querySelector('#btn');
btn.addEventListener('click', clickHandler1);
btn.addEventListener('click', clickHandler2);
}
window.onload = init;
</script>
<body>
<h1>hello, world</h1>
<h4>์ด๋ฒคํธ ๋ฒ๋ธ๋ง</h4>
<div id="parent">
<div id="child"></div>
</div>
</body>
<script>
function childHandler(event) {
alert('child');
event.stopPropagation();
// ๋ถ๋ชจ์ ์ด๋ฒคํธ๋ฅผ ์์๋ฐ์ง ์๊ฒ ํด์ค / ์ด๋ฒคํธ ๋ฒ๋ธ๋ง X
}
function parentHandler() {
alert('parent');
}
function init() {
document.querySelector('#child').onclick = childHandler;
document.querySelector('#parent').onclick = parentHandler;
}
window.onload = init;
</script>
<body>
<h1>hello, world</h1>
<h4>์ด๋ฒคํธ ๋ฒ๋ธ๋ง</h4>
<div id="parent">
<div id="child"></div>
</div>
</body>
<script>
function childHandler() {
alert('child');
}
function parentHandler() {
alert('parent');
}
function init() {
document.querySelector('#child').onclick = childHandler;
document.querySelector('#parent').onclick = parentHandler;
}
window.onload = init;
</script>