๐๐ป[Js] addEventListener() | ์ด๋ฒคํธ ์ ํ | ๋ฒ๋ธ๋ง๊ณผ ์บก์ฒ๋ง
- -
๋ชจ๋ ํฌ์คํ ์ ์ธํ๋ฐ [์ํ์ฝ๋ฉ] ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์์ ๋ด์ฉ์ ๋ด๊ณ ์์ผ๋ฉฐ
์ถ์ฒ๋ ์๋์ ์ฃผ์๋ก "egoing Lee"๋์ ์๋ฃ์ ๋๋ค.
์์ ์ ์ธ ์๋๊ฐ ์๋ ๊ณต๋ถํ ๊ฒ์ ์ ๋ฆฌํด๋๋ ๋ชฉ์ ์ผ๋ก ํฌ์คํ ํ ๊ฒ์ ๋๋ค.
addEventListener()
addEventListener์ ์ด๋ฒคํธ๋ฅผ ๋ฑ๋กํ๋ ๊ฐ์ฅ ๊ถ์ฅ๋๋ ๋ฐฉ์์ด๋ค. ์ด ๋ฐฉ์์ ์ด์ฉํ๋ฉด ์ฌ๋ฌ๊ฐ์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ๋ฑ๋กํ ์ ์๋ค.
<input type="button" id="target" value="button" />
<script>
var t = document.getElementById('target');
t.addEventListener('click', function(event){
alert('Hello world, '+event.target.value);
});
</script>
์ ๋ฐฉ์์ ์ฒซ๋ฒ์งธ ์ธ์๋ก ์ด๋ฒคํธ ๋ฐฉ์์ ์ค๋ช ํ๋ค. ์ฆ t๋ณ์๋ฅผ ํด๋ฆญํ ์ ๋ค์ ์๋ ๋ฉ์๋๊ฐ ๋์ํ๊ฒ ๋๋ ๊ฒ์ด๋ค.
๋ํ event.target.value๋ button์ ์๋ฏธํ๋ค. ์ฆ ์ด์ ๋ฐฉ์๋ค์ ์ข์ ์ ๋ค์ ๋ค ๊ฐ์ ธ๋ค ๋์ ๊ฒ์ด๋ผ๊ณ ๋ณด๋ฉด ๋๋ค.
ํ์ง๋ง ์ด ๋ฐฉ์์ ie8์ดํ์์๋ ํธํ๋์ง ์๋๋ค. ie์์๋ attachEvent ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
var t = document.getElementById('target');
if(t.addEventListener){
t.addEventListener('click', function(event){
alert('Hello world, '+event.target.value);
});
} else if(t.attachEvent){
t.attachEvent('onclick', function(event){
alert('Hello world, '+event.target.value);
})
}
์ ์ฝ๋๋ addEventListener๋ฐฉ์์ด ํธํ์ด ๋์ง ์์ ์ฌ์ฉ์ด ์๋๋ค๋ฉด, ์ด๋ attachEvent๋ผ๋ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์์ ๋ํ๋ธ๋ค.
๊ฑฐ์ ๋ฐฉ์์ด ๋์ผํ์ง๋ง, ์ฒซ๋ฒ์งธ ์ธ์๋ก ์ค๋ ๊ฐ์ ๋ฌด์กฐ๊ฑด on์ด ๋ถ์ด์ผ ํ๋ค๋ ์ฐจ์ด๊ฐ ์๋ค.
ํ์ง๋ง ์ต๊ทผ์๋ ์์ ๊ฐ์ ํฌ๋ก์ค ๋ธ๋ผ์ฐ์ง ์ด์์ ๋ฌธ์ ๋ฅผ ๋๋ถ๋ถ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ฒ๋ฆฌํด์ฃผ๊ธฐ ๋๋ฌธ์ ์์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ ํ์๊ฐ ์๋ค.
์ด ๋ฐฉ์์ ์ค์ํ ์ฅ์ ์ ํ๋์ ์ด๋ฒคํธ ๋์์ ๋ณต์์ ๋์ผ ์ด๋ฒคํธ ํ์ ๋ฆฌ์ค๋๋ฅผ ๋ฑ๋กํ ์ ์๋ค๋ ์ ์ด๋ค. ์ด ๋ฐฉ์์ ํ๋กํผํฐ์ ์ธ๋ผ์ธ ๋ฐฉ์๊ณผ ์ฐจ์ด๋ฅผ ๋ณด์ธ๋ค.
<input type="button" id="target" value="button" />
<script>
var t = document.getElementById('target');
t.addEventListener('click', function(event){
alert(1);
});
t.addEventListener('click', function(event){
alert(2);
});
</script>
๊ธฐ์กด์ ํ๋กํผํฐ ๋ฐฉ์์์๋ ๋จ ํ๋์ ์ด๋ฒคํธ๋ง์ ์ค์ ํ ์ ์์ด์ ๋ฆฌ์ค๋๊ฐ ์ฌ๋ผ์ง๋ฏ๋ก, ์ ์ผ ๋ง์ง๋ง์ ์ฌ์ฉํ ์ด๋ฒคํธ๋ง ๋์ํ๊ฒ ๋๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๊ด๋ํ ์ฝ๋์ ๊ฒฝ์ฐ add์ด๋ฒคํธ ๋ฐฉ์์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
ํ๋์ ๋ฆฌ์ค๋๋ฅผ ์ฌ๋ฌ๊ฐ์ ์ด๋ฒคํธ ํ๊ฒ์ ์ค์นํ๋ ค๋ฉด ์๋์ ๊ฐ์ด ์คํํ๋ฉด ๋๋ค. ์ด๋ฒคํธ ๊ฐ์ฒด๋ฅผ ์ด์ฉํ๋ฉด ๋ณต์์ ์๋ฆฌ๋จผํธ์ ํ๋์ ๋ฆฌ์ค๋๋ฅผ ๋ฑ๋กํด์ ์ฌ์ฌ์ฉํ ์ ์๋ค.
<input type="button" id="target1" value="button1" />
<input type="button" id="target2" value="button2" />
<script>
var t1 = document.getElementById('target1');
var t2 = document.getElementById('target2');
function btn_listener(event){
switch(event.target.id){
case 'target1':
alert(1);
break;
case 'target2':
alert(2);
break;
}
}
t1.addEventListener('click', btn_listener);
t2.addEventListener('click', btn_listener);
</script>
์ด๋ฒคํธ ๋ฆฌ์ค๋๋ก ์ฌ์ฉํ ํจ์ : btn_listener() // target1์ด๋ 2 ๋๋ค ์ ํจ์๋ฅผ ํธ์ถํ๋ค.
event.target.id๋ผ๋ ๋ฉ์๋๋ฅผ ํตํด ๊ฐ๊ฐ์ ์๋ฆฌ๋จผํธ๊ฐ ๊ฐ์ง id๊ฐ์ ์ ์ ์๋ค. ๊ทธ๋์ ๊ตฌ๋ถํ์ฌ ๊ฐ ์ด๋ฒคํธ๋ฅผ ๋์์์ผ์ค๋ค.
์ด๋ฒคํธ ์ ํ(๋ฒ๋ธ๋ง๊ณผ ์บก์ฒ๋ง)
์ด๋ฒ ๊ฐ์์ ๋ด์ฉ์ ๋งค์ฐ ๋์ด๋๊ฐ ๋๊ธฐ ๋๋ฌธ์ ๊ผญ ์ค์ต์ ๋๋ฐํ์ฌ ๊ฐ์๋ฅผ ์์งํ๊ธธ ๋ฐ๋๋ค.
JavaScript - ์ด๋ฒคํธ์ ํ (1/3) : ์๊ฐ
HTML ํ๊ทธ๋ ์ค์ฒฉ๋์ด ์๋ค. ๋ฐ๋ผ์ ํน์ ํ ํ๊ทธ์์ ๋ฐ์ํ๋ ์ด๋ฒคํธ๋ ์ค์ฒฉ๋์ด ์๋ ํ๊ทธ๋ค ๋ชจ๋๊ฐ ๋์์ด ๋ ์ ์๋ค. ์ด๋ฐ ๊ฒฝ์ฐ ์ค์ฒฉ๋ ํ๊ทธ๋ค์ ์ด๋ฒคํธ๊ฐ ๋ฑ๋ก ๋์ด ์๋ค๋ฉด ์ด๋ป๊ฒ ์ฒ๋ฆฌ ๋ ๊น? (์คํ)
<html>
<head>
<style>
html{border:5px solid red;padding:30px;}
body{border:5px solid green;padding:30px;}
fieldset{border:5px solid blue;padding:30px;}
input{border:5px solid black;padding:30px;}
</style>
</head>
<body>
<fieldset>
<legend>event propagation</legend>
<input type="button" id="target" value="target">
</fieldset>
<script>
function handler(event){
var phases = ['capturing', 'target', 'bubbling']
console.log(event.target.nodeName, this.nodeName, phases[event.eventPhase-1]);//์ฒซ ๋ฒ์งธ ์ธ์ ์ฆ event.target.nodeName์ ๊ฐ์ฅ ๋ด๋ถ์ ์๋ ํธ๋ค๋ฌ๋ฅผ ๋ฆฌํด
}
document.getElementById('target').addEventListener('click', handler, true);
document.querySelector('fieldset').addEventListener('click', handler, true);
document.querySelector('body').addEventListener('click', handler, true);
document.querySelector('html').addEventListener('click', handler, true);
</script>
</body>
</html>
์ด๋ ๊ฒ ์ฝ๋๊ฐ ์์ ๋ด์ฅ๋์ด ์๋ ๊ด๊ณ์์ ์์์๋ถํฐ ์ฆ, ๊ฐ์ฅ ํฐ ํ๊ทธ๋ถํฐ ํธ์ถ๋๋ ๊ฒ์ "์บก์ฒ๋ง(capturing)" ์ด๋ผ๊ณ ํ๋ค.
๋ฐ๋๋ก ์ ์ผ ๊น์ํ ๋ด๋ถ์์๋ถํฐ ๋์ํ์ฌ ์๋ก ํธ์ถ๋๋ ๊ณผ์ ์ "๋ฒ๋ธ๋ง(bubbling)"์ด๋ผ๊ณ ํ๋ค.
์ ์ฝ๋๋ฅผ ์คํ์์ผ๋ณด๋ฉด ์์ ๊ฐ์ด ๊ตฌ์ญ์ด ๋๋๊ฒ ๋๋ค.
์คํ๊ฒฐ๊ณผ
INPUT HTML capturing
INPUT BODY capturing
INPUT FIELDSET capturing
INPUT INPUT target
์ด๋ฒคํธ๊ฐ ๋ถ๋ชจ์์๋ถํฐ ๋ฐ์ํด์ ์์์ผ๋ก ์ ํ๋๊ณ ์๋ค. ์ด๋ฌํ ๋ฐฉ์์ capturing์ด๋ผ๊ณ ํ๋ค. ie ๋ฎ์ ๋ฒ์ ์์๋ ์๋ํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ง์ด ์ฌ์ฉํ์ง๋ ์๋๋ค.
์ฝ๋๋ฅผ ์๋์ ๊ฐ์ด ๋ณ๊ฒฝํด๋ณด์. (์คํ)
document.getElementById('target').addEventListener('click', handler, false);
document.querySelector('fieldset').addEventListener('click', handler, false);
document.querySelector('body').addEventListener('click', handler, false);
document.querySelector('html').addEventListener('click', handler, false);
์ฐจ์ด์ ์ addEventListener์ 3๋ฒ์งธ ์ธ์๊ฐ false๋ก ๋ณ๊ฒฝํ๋ค๋ ๊ฒ์ด๋ค!
์คํ๊ฒฐ๊ณผ
INPUT INPUT target
INPUT FIELDSET bubbling
INPUT BODY bubbling
INPUT HTML bubbling
์ด๋ฒ์๋ ์์๊ฐ ๋ฐ๋๋ก ๋์๋ค. ์์๋ถํฐ ๋ถ๋ชจ๋ก ์ด๋ฒคํธ๊ฐ ์ ํ๋๋ ๊ฒ์ ๋ฒ๋ธ๋ง(bubbling)์ด๋ผ๊ณ ํ๋ค.
์ฆ, ์ด๋ฌํ ๊ณผ์ ์ ํตํด addEventListner์ ์ธ๋ฒ์งธ ์ธ์๊ฐ ์ด๋ ํ ์ญํ ์ ํ๋์ง ์ ์ ์๊ฒ ๋์๋ค.(:use capturing์ ์๋ฏธํจ)
๋ฒ๋ธ๋ง๊ณผ ์บก์ฒ๋ง์ ์ ํจ์์ ์ธ๋ฒ์งธ ์ธ์ ๊ฐ์ true๋ก ์ฃผ๋๋ false๋ก ์ฃผ๋๋์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๊ฒ ๋๋ค.
์ด๋ฒคํธ ์ ํ๋ฅผ ์ค๊ฐ์ ๊ฐ๋ก๋ง์ ์๋ ์๋ค. ์๋์ ์์๋ body๊น์ง๋ง ์ด๋ฒคํธ๊ฐ ์ ํ๋๋๋ก ์ค๊ฐ์ ๋ง๋ ์์๋ฅผ ์ฝ๋๋ก ๋ํ๋ธ ๊ฒ์ด๋ค.
์๋์ฒ๋ผ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํด๋ณด์. (์คํ)
function handler(event){
var phases = ['capturing', 'target', 'bubbling']
console.log(event.target.nodeName, this.nodeName, phases[event.eventPhase-1]);
}
function stophandler(event){
var phases = ['capturing', 'target', 'bubbling']
console.log(event.target.nodeName, this.nodeName, phases[event.eventPhase-1]);
event.stopPropagation();//event๊ฐ์ฒด๊ฐ ๊ฐ์ง ๋ฉ์๋ stop...() ํธ์ถ
}
document.getElementById('target').addEventListener('click', handler, false);
document.querySelector('fieldset').addEventListener('click', handler, false);
document.querySelector('body').addEventListener('click', stophandler, false);
document.querySelector('html').addEventListener('click', handler, false);
์คํ๊ฒฐ๊ณผ
INPUT INPUT target
INPUT FIELDSET bubbling
INPUT BODY bubbling
์ฐธ๊ณ ๋ก ie9 ์ด์ ์ ๋ธ๋ผ์ฐ์ ์์๋ ์ด๋ฒคํธ ์ ํ์ ๋ง๊ธฐ ์ํด์ event.cancelBubble ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
'Languages > Java Script' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Js] ๋ง์ฐ์ค | jQuery ์ด๋ฒคํธ | on ApI ์ฌ์ฉ๋ฒ (0) | 2021.02.10 |
---|---|
๐๐ป[Js] ๊ธฐ๋ณธ๋์์ ์ทจ์ | ํผ | ๋ฌธ์๋ก๋ฉ (0) | 2021.02.10 |
[Js] ์ด๋ฒคํธ | ๋ฑ๋ก๋ฐฉ๋ฒ & inline | ํ๋กํผํฐ ๋ฆฌ์ค๋ (0) | 2021.02.10 |
๐๐ป[Js] ๋ฌธ์์ ๊ธฐํํ์ ํน์ฑ (0) | 2021.02.10 |
๋น์ ์ด ์ข์ํ ๋งํ ์ฝํ ์ธ
์์คํ ๊ณต๊ฐ ๊ฐ์ฌํฉ๋๋ค