whatisthis?

javaScript. (20) Event Listener / Callback ๋ณธ๋ฌธ

WEB STUDY/JAVASCRIPT

javaScript. (20) Event Listener / Callback

thisisyjin 2022. 1. 29. 16:53

๐Ÿ“Œ Event Listener

 

- ํ•ด๋‹น ์ด๋ฒคํŠธ์— ๋Œ€ํ•ด ๋Œ€๊ธฐ์ค‘์ธ ๊ฒƒ. (์ƒ์‹œ Listening ์ค‘)

- ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„๋•Œ ๋“ฑ๋กํ–ˆ๋˜ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๊ฐ€ ์‹คํ–‰๋จ.

 

 

window.onload = function () {
   alert('I\'m loaded');
};

 

- ๋Œ€ํ‘œ์ ์ธ ์ด๋ฒคํŠธ๋ฆฌ์Šค๋„ˆ ์ฝ”๋“œ์ž„.

- window๊ฐ€ load ๋ ๋•Œ function ๋ถ€๋ถ„์ด ์‹คํ–‰๋˜๋Š” ๊ฒƒ.

 

์ด๋ฒคํŠธ๋ฆฌ์Šค๋„ˆ๋Š” ํ•ญ์ƒ on + '์ด๋ฒคํŠธ๋ช…'์œผ๋กœ ๋ช…๋ช…๋œ๋‹ค.

์˜ˆ>  onclick

 

** ์ž์ฃผ ์“ฐ์ด๋Š” ์ด๋ฒคํŠธ ๋ชฉ๋ก

onchange ๊ฐ์ฒด ๋‚ด์šฉ์ด ๋ฐ”๋€Œ๊ณ  / ํฌ์ปค์Šค๋ฅผ ์žƒ์„ ๋•Œ
onclick ๊ฐ์ฒด๋ฅผ ํด๋ฆญํ•  ๋•Œ
ondblclick ๊ฐ์ฒด๋ฅผ ๋”๋ธ”ํด๋ฆญํ•  ๋•Œ
onerror ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ
onfocus ๊ฐ์ฒด์— ํฌ์ปค์Šค๋˜์—ˆ์„ ๋•Œ
onblur ๊ฐ์ฒด๊ฐ€ ํฌ์ปค์Šค๋ฅผ ์žƒ์„ ๋•Œ
onkeydown ํ‚ค๋ฅผ ๋ˆŒ๋ €์„ ๋•Œ
onkeypress ํ‚ค๋ฅผ ๋ˆ„๋ฅด๊ณ ์žˆ์„ ๋•Œ
onkeyup ํ‚ค๋ฅผ ๋ˆŒ๋ €๋‹ค ๋—์„ ๋•Œ
onload ๋ฌธ์„œ๋‚˜ ๊ฐ์ฒด๊ฐ€ ๋กœ๋”ฉ๋˜์—ˆ์„ ๋•Œ
onmouseover ๋งˆ์šฐ์Šค๊ฐ€ ๊ฐ์ฒด ์œ„์— ์˜ฌ๋ผ์™”์„ ๋•Œ
onmousedown ๋งˆ์šฐ์Šค๊ฐ€ ๊ฐ์ฒด ๋ฐ”๊นฅ์œผ๋กœ ๋‚˜๊ฐ”์„ ๋•Œ
onreset reset ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ
onresize ๊ฐ์ฒด์˜ ํฌ๊ธฐ๊ฐ€ ๋ฐ”๋€Œ์—ˆ์„ ๋•Œ
onscroll ์Šคํฌ๋กค๋ฐ”๋ฅผ ์กฐ์ž‘ํ•  ๋•Œ
onsubmit ํผ์ด ์ „์†ก๋  ๋•Œ

 

 

javaScript. ์ด๋ฒคํŠธ(on__)์˜ ์ข…๋ฅ˜

 1) ๋งˆ์šฐ์Šค ์ด๋ฒคํŠธ click ์š”์†Œ์— ๋งˆ์šฐ์Šค๋ฅผ ํด๋ฆญํ–ˆ์„ ๋•Œ dbclick ์š”์†Œ์— ๋งˆ์šฐ์Šค๋ฅผ ๋”๋ธ”ํด๋ฆญํ–ˆ์„ ๋•Œ mouseover ์š”์†Œ์— ๋งˆ์šฐ์Šค๋ฅผ ์˜ค๋ฒ„ํ–ˆ์„ ๋•Œ (์˜ฌ๋ ค๋†“์•˜์„ ๋•Œ) mouseout ์š”์†Œ์— ๋งˆ์šฐ์Šค๋ฅผ ์•„์›ƒํ–ˆ์„ ๋•Œ (๋ฐ”๊นฅ์œผ

mywebproject.tistory.com

๊ทธ ์™ธ์— ๋‹ค์–‘ํ•œ ์ด๋ฒคํŠธ์˜ ์ข…๋ฅ˜๋ฅผ ์œ„ ๊ธ€๐Ÿ”บ ์— ํฌ์ŠคํŒ…ํ•ด๋‘์—ˆ๋‹ค.

 

 

 

window ๋ง๊ณ ๋„ ์—ฌ๋Ÿฌ ํƒœ๊ทธ์— ๊ฐ๊ฐ ์ด๋ฒคํŠธ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

(์˜ˆ- html์˜ <form>ํƒœ๊ทธ๋‚˜ / <button>ํƒœ๊ทธ / <a>ํƒœ๊ทธ ๋“ฑ ... )

 

 

์ด๋ฒคํŠธ๋ฆฌ์Šค๋„ˆ๋ฅผ ๋“ฑ๋กํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š”

 

1. on(Event) ์ด์šฉ >> ๋Œ€์ž…์—ฐ์‚ฐ์ž๋กœ function์„ ๋Œ€์ž…ํ•œ๋‹ค.

 

document.getElementById('clickMe').onclick = function () {
	console.log('clicked!');
};

 

2.  addEventListener(Event, function)

- ์—ฌ๋Ÿฌ ์ด๋ฒคํŠธ๋ฅผ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๊ณ , ํŠน์ • ์ด๋ฒคํŠธ๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜๋„ ์žˆ์–ด์„œ

on์œผ๋กœ ์ด๋ฒคํŠธ๋ฆฌ์Šค๋„ˆ๋ฅผ ๋“ฑ๋กํ•˜๋Š” ๊ฒƒ ๋ณด๋‹ค ์žฅ์ ์ด ๋งŽ๋‹ค.

 

function onClick() {
	console.log('clicked!');
}

function onClick2() {
	console.log('๋˜๋‹ค๋ฅธ ์ด๋ฒคํŠธ');
}


document.getElementById('clickMe').addEventListener('click', onClick);  
document.getElementById('clickMe').addEventListener('click', onClick2);   // 2๊ฐœ ์—ฐ๊ฒฐ ๊ฐ€๋Šฅ

document.getElementById('clickMe').removeEventListenr('click', onClick2);   // ํ•˜๋‚˜ ์ œ๊ฑฐ

- click ์œ„์น˜๋Š” ํ•ด๋‹น ์ด๋ฒคํŠธ๋ช… (click, submit ๋“ฑ)์„ ์ž…๋ ฅํ•˜๋ฉด ๋œ๋‹ค.

 

 

 

๐Ÿ“Œ Callback

- ์œ„ ๋‘ ์ฝ”๋“œ์—์„œ function ๋ถ€๋ถ„์„ ๋ถ€๋ฅด๋Š” ๊ฒƒ์„ ์ฝœ๋ฐฑ(callback)์ด๋ผ๊ณ  ํ•œ๋‹ค.

- ์ผ๋ฐ˜์ ์œผ๋กœ ํ•จ์ˆ˜๋Š” ()๋กœ ํ˜ธ์ถœํ•˜๋Š”๋ฐ, ์ด์™€๋Š” ๋‹ค๋ฅด๋‹ค. >> ๋‹ค์‹œ ใ…ก ์•Œ๋ ค์ฃผ๋Š” callback์ด๋‹ค.

 

- ๊ผญ ์ด๋ฒคํŠธ๊ฐ€ ์•„๋‹ˆ๋”๋ผ๋„, ์ฝœ๋ฐฑ์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

var cbExample = function(number, cb) { 
  setTimeout(function() {           // setTimeout ๋ฉ”์„œ๋“œ ใ…ก โ— ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด
    var sum = 0;
    for (var i = number; i > 0; i--) {     // for๋ฌธ ใ…ก number๋กœ ๋ฐ›์€ ๊ฐ’ ์ด์šฉ
      sum += i;
    }
    cb(sum);     // sum์€ cbExampleํ•จ์ˆ˜์—์„œ cb๋ฅผ ๋ฐ›๋Š” ๊ฒƒ. (cb = ์ฝœ๋ฐฑ์„ ๋ฐ›๋Š” ๋ถ€๋ถ„)
  }, 0);
};
cbExample(10, function(result) {     // cb๋กœ ํ•จ์ˆ˜๋ฅผ ๋„ฃ๋Š”๋‹ค.
  console.log(result);        // 1๋ถ€ํ„ฐ 10๊นŒ์ง€์˜ ํ•ฉ = 55
}); // 55
console.log('first');

- ์ฝœ๋ฐฑ์„ ๋ฐ›๋Š” ๋ถ€๋ถ„์ธ cb์—์„œ ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋ฐ›๋Š”๋‹ค.

>> ๊ทธ ํ•จ์ˆ˜๊ฐ€ ์ฝœ๋ฐฑํ•จ์ˆ˜๋กœ ๋“ฑ๋ก๋˜์–ด, ๊ณ„์‚ฐ์ด ๋๋‚œ ํ›„์— ์‹คํ–‰๋œ๋‹ค.

- ์ฝœ๋ฐฑ ๋“ฑ๋ก๋งŒ ํ•ด๋†“์œผ๋ฉด ์•Œ์•„์„œ ๊ณ„์‚ฐ์ด ๋๋‚œ ํ›„ ์•Œ๋ ค์คŒ

 

first๊ฐ€ 55๋ณด๋‹ค ์•„๋ž˜์— ์žˆ์ง€๋งŒ, first๋ฅผ ๋จผ์ € ์ฝ˜์†”์— ๋กœ๊ทธํ•œ๋‹ค.

 

setTimeout์„ ์‚ฌ์šฉํ•˜๋ฉด ๋น„๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค. >> ์ฝœ๋ฐฑ

- delay๋ฅผ ์„ค์ • ์•ˆํ•ด๋„ (์ฆ‰, 0์ดˆ๋กœ ํ•ด๋„) ๋น„๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค. 

๐Ÿ’ก setTimeout()
setTimeout(function[, delay]);
- ํƒ€์ด๋จธ ์‹คํ–‰ ํ›„ ์‹คํ–‰ํ•จ. 
- delay ๋’ค์— arg1, arg2, ... ๋ฅผ ์ ์–ด ์ถ”๊ฐ€๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ•จ์ˆ˜์— ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

Syncronous (๋™๊ธฐ์‹) ์š”์ฒญ์„ ๋ณด๋‚ธ ํ›„ ํ•ด๋‹น ์š”์ฒญ์˜ ์‘๋‹ต์„ ๋ฐ›์•„์•ผ ๋‹ค์Œ ๋™์ž‘์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ์‹
Asynchronous (๋น„๋™๊ธฐ) ์š”์ฒญ์„ ๋ณด๋‚ธ ํ›„ ์‘๋‹ต๊ณผ ๊ด€๊ณ„์—†์ด ๋‹ค์Œ ๋™์ž‘์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ์‹

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋™๊ธฐ์ ์ธ ์–ธ์–ด์ด๋ฏ€๋กœ, ์‘๋‹ต์„ ๋ฐ›์•„์•ผ ๋‹ค์Œ ๋™์ž‘์ด ์‹คํ–‰๋œ๋‹ค.

>> ๊ทธ๋Ÿฌ๋‚˜, ๋น„๋™๊ธฐ์  ์ฝœ๋ฐฑ ์„ ์ด์šฉํ•ด์„œ ๋น„๋™๊ธฐ์‹์œผ๋กœ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

๊ทธ ์™ธ์—๋„ ์ฝœ๋ฐฑ์€ ๋‹ค์–‘ํ•œ ๊ณณ์—์„œ ์‚ฌ์šฉ๋œ๋‹ค.

์˜ˆ> forEach๋‚˜ map๋“ฑ 

 

 

๋งŒ์•ฝ, cbExampleํ•จ์ˆ˜๊ฐ€ 10์ดˆ๊ฐ€ ์†Œ์š”๋˜๋Š” ์ผ์ด๋ผ๋ฉด,

์ด ํ•จ์ˆ˜๊ฐ€ ๋๋‚˜๊ณ  ๋‹ค์Œ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋  ๋•Œ ๊นŒ์ง€ 10์ดˆ๋‚˜ ๊ธฐ๋‹ค๋ ค์•ผํ•œ๋‹ค.

>> ์ฝœ๋ฐฑ์„ ๋“ฑ๋กํ•ด๋‘๊ณ , ๋ฐ”๋กœ ๋‹ค์Œ์ฝ”๋“œ๋กœ ๋„˜์–ด๊ฐ€์„œ - ์ผ์ด ์™„๋ฃŒ๋˜๋ฉด ์•Œ๋ ค์ฃผ๋„๋ก ๋งŒ๋“ค๋ฉด ํ•ด๊ฒฐ๋จ.

 

์ฆ‰, ์ฝœ๋ฐฑ์€

์–ธ์ œ ๋๋‚ ์ง€ ๋ชจ๋ฅด๋Š” ๋™์ž‘์— ๋Œ€ํ•ด ๊ฒฐ๊ณผ๋ฅผ ์ „๋‹ฌ๋ฐ›์„ ๋•Œ ์œ ์šฉํ•˜๋‹ค. 

>> ๊ณ„์† ๊ธฐ๋‹ค๋ฆด ํ•„์š”๊ฐ€ ์—†์–ด์ง€๋‹ˆ๊นŒ.

 

 

 

 

 

๐Ÿ’ก ์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง

- DOM์— ์—ฐ๊ฒฐํ•œ ๊ฐ์ฒด๋Š” ๋ฒ„๋ธ”๋ง์ด ์ผ์–ด๋‚œ๋‹ค.

 

** ๋ฒ„๋ธ”๋ง : ์ž์‹ ์˜ ์ด๋ฒคํŠธ๊ฐ€ ๋ถ€๋ชจ์—๋„ ์ „๋‹ฌ๋จ.

 

<div id="first"><div id="second"><div id="third"></div></div></div>

์œ„์™€ ๊ฐ™์€ ๊ตฌ์กฐ๊ฐ€ ์žˆ์„๋•Œ,

div #third๋ฅผ ํด๋ฆญํ•˜๋ฉด ใ…ก second, first ์ˆœ์œผ๋กœ ๊ฐ™์€ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

๋ถ€๋ชจํƒœ๊ทธ(์ง๊ณ„) #second
์กฐ์ƒํƒœ๊ทธ(์ƒ์œ„) #first

 

๐Ÿ’ก ์ด๋ฒคํŠธ ๊ฐ์ฒด

 

- DOM์— ๋Œ€ํ•œ ์ด๋ฒคํŠธ์— ์—ฐ๊ฒฐํ•œ ํ•จ์ˆ˜๋Š” ์ด๋ฒคํŠธ ๊ฐ์ฒด๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ.

- ์ด๋ฒคํŠธ ๊ฐ์ฒด๋Š” Event์— ๋Œ€ํ•œ ์ •๋ณด์™€ ์กฐ์ž‘ ๋ฉ”์„œ๋“œ๋“ค์ด ๋“ค์–ด์žˆ๋‹ค.

 

 

 

/// ๋ฐฉ๋ฒ• 1 - on ์ด์šฉ
document.getElementById('btn').onclick = function (event) {
    event.preventDefault();
    event.stopPropagation();
    event.stopImmediatePropagation();
}



/// ๋ฐฉ๋ฒ• 2 - addEventListener ์ด์šฉ
document.getElementById('btn').addEventListener('click', function(event) {
    event.preventDefault();
    event.stopPropagation();
    event.stopImmediatePropagation();
});

 

1) event.preventDefault()

- ํƒœ๊ทธ์˜ ๊ธฐ๋ณธ ๋™์ž‘์„ ๋ง‰์•„์ฃผ๋Š” ์—ญํ• 

์˜ˆ> a ํƒœ๊ทธ - ๋งํฌ ์ด๋™ / form ํƒœ๊ทธ - ํผ ๋‚ด์šฉ ์ „์†ก

 

2) event.stopPropagation()

- ๋ถ€๋ชจ์—๊ฒŒ ์ด๋ฒคํŠธ๊ฐ€ ์ „๋‹ฌ๋˜์ง€ ์•Š๋„๋ก ํ•จ ( = ๋ฒ„๋ธ”๋ง ํ˜„์ƒ ๋ฐฉ์ง€ )

 

if> ์—ฌ๋Ÿฌ๊ฐœ์˜ ํด๋ฆญ ์ด๋ฒคํŠธ๋ฅผ ๋™์‹œ์— ์—ฐ๊ฒฐํ•œ ๊ฒฝ์šฐ

stopPropagation์œผ๋กœ ํด๋ฆญ ์ด๋ฒคํŠธ๋ฅผ ๋ง‰์•„๋„ (๋ถ€๋ชจ์—๊ฒŒ ๋ฒ„๋ธ”๋งx)

๋‹ค๋ฅธ ํด๋ฆญ ์ด๋ฒคํŠธ๋Š” ์‹คํ–‰๋œ๋‹ค. (๋ถ€๋ชจ ๋ง๊ณ  ๋‹ค๋ฅธ ํด๋ฆญ ์ด๋ฒคํŠธ๋Š” ํด๋ฆญ๋จ)

 

>> ์ด๋•Œ, stopImmediatePropagation ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด,

๋ถ€๋ชจ์—๊ฒŒ๋Š” ์–ด๋–ค ์ด๋ฒคํŠธ๋„ ๋ฒ„๋ธ”๋ง๋˜์ง€ ์•Š์œผ๋ฉด์„œ ๋‹ค๋ฅธ ํด๋ฆญ ์ด๋ฒคํŠธ๋„ ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค.

3) event.stopImmediatePropagation()

- ๋ถ€๋ชจ์—๊ฒŒ ๋ฒ„๋ธ”๋ง๋˜์ง€ ์•Š๊ณ  / ๋‹ค๋ฅธ ํ•ด๋‹น ์ด๋ฒคํŠธ๋„ ๋ง‰์•„์คŒ

>> but. ์ข…๋ฅ˜๊ฐ€ ๋‹ค๋ฅธ ์ด๋ฒคํŠธ๋Š” ๋ง‰์ง€ ๋ชปํ•œ๋‹ค. (์˜ˆ - click์ด๋ฒคํŠธ๋ผ๋ฉด submit์€ ๋ง‰์ง€ ๋ชปํ•จ)

 

 


 

 

** ๊ทธ ์™ธ event ๊ฐ์ฒด์˜ ์ •๋ณด๋“ค

event.target ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ ํƒœ๊ทธ(์˜ ์ •๋ณด)
event.pageX ํด๋ฆญํ•œ ์ขŒํ‘œ
event.pageY
event.key ์–ด๋–ค ํ‚ค๋ฅผ ๋ˆŒ๋ €๋Š”์ง€

 

 

 


REFERENCE

 

 

(JavaScript) ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ์™€ ์ฝœ๋ฐฑ(event listener, callback)

์•ˆ๋…•ํ•˜์„ธ์š”. ์ด๋ฒˆ ์‹œ๊ฐ„์€ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ์™€ ์ฝœ๋ฐฑ ์ฐจ๋ก€์ž…๋‹ˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€๋Š” ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ์•ˆ ๋‹ค๋ค˜์Šต๋‹ˆ๋‹ค๋งŒ ์ด์ œ ๋‹ค๋ฃฐ ๋•Œ๊ฐ€ ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ์™€ ์ฝœ๋ฐฑ ๋ฐฉ์‹๋„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๋งŽ

www.zerocho.com

 

์ด ํฌ์ŠคํŒ…์€ zerocho๋‹˜์˜ javascript ๊ฐ•์˜๋ฅผ ๋ณด๊ณ  ์ž‘์„ฑํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.

๊ณต๋ถ€+๊ธฐ๋ก ์šฉ์œผ๋กœ ์ž‘์„ฑํ•œ ๊ฒƒ์ด๋ฉฐ, ์ž์„ธํ•œ ๊ฒƒ์€ ์œ„ ํฌ์ŠคํŒ…์„ ์ฐธ๊ณ ํ•˜์„ธ์š”!