Responsive Advertisement

JavaScript Events: ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ์™€ ํ™œ์šฉ๋ฒ•

์›น ๊ฐœ๋ฐœ์—์„œ ์ด๋ฒคํŠธ(Event)๋Š” ์‚ฌ์šฉ์ž๋‚˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋™์ž‘์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ํด๋ฆญ, ํ‚ค๋ณด๋“œ ์ž…๋ ฅ, ํŽ˜์ด์ง€ ๋กœ๋“œ ๋“ฑ๊ณผ ๊ฐ™์€ ๋ชจ๋“  ์ƒํ˜ธ์ž‘์šฉ์€ ์ด๋ฒคํŠธ๋กœ ์ทจ๊ธ‰๋˜๋ฉฐ, ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋™์ ์œผ๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ํ•ต์‹ฌ ์š”์†Œ์ž…๋‹ˆ๋‹ค. ์ด ๊ธ€์—์„œ๋Š” JavaScript์—์„œ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ํ™œ์šฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

JavaScript ์ด๋ฒคํŠธ๋ž€?

JavaScript ์ด๋ฒคํŠธ๋Š” ์‚ฌ์šฉ์ž์™€ ์›น ํŽ˜์ด์ง€ ๊ฐ„์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๊ฑฐ๋‚˜ ํ‚ค๋ณด๋“œ๋ฅผ ๋ˆ„๋ฅผ ๋•Œ, ๋˜๋Š” ์›น ํŽ˜์ด์ง€๊ฐ€ ๋กœ๋“œ๋  ๋•Œ์™€ ๊ฐ™์€ ์ƒํ™ฉ์ด ์ด๋ฒคํŠธ์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค. JavaScript๋Š” ์ด๋Ÿฌํ•œ ์ด๋ฒคํŠธ๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์„œ๋“œ์™€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ์ด๋ฒคํŠธ ์ข…๋ฅ˜

  • click: ์‚ฌ์šฉ์ž๊ฐ€ ์š”์†Œ๋ฅผ ํด๋ฆญํ•  ๋•Œ ๋ฐœ์ƒ
  • keydown: ์‚ฌ์šฉ์ž๊ฐ€ ํ‚ค๋ณด๋“œ๋ฅผ ๋ˆŒ๋ €์„ ๋•Œ ๋ฐœ์ƒ
  • mouseover: ์‚ฌ์šฉ์ž๊ฐ€ ์š”์†Œ ์œ„์— ๋งˆ์šฐ์Šค๋ฅผ ์˜ฌ๋ฆด ๋•Œ ๋ฐœ์ƒ
  • submit: ํผ์„ ์ œ์ถœํ•  ๋•Œ ๋ฐœ์ƒ
  • load: ํŽ˜์ด์ง€๋‚˜ ์š”์†Œ๊ฐ€ ์™„์ „ํžˆ ๋กœ๋“œ๋˜์—ˆ์„ ๋•Œ ๋ฐœ์ƒ

์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•

JavaScript์—์„œ๋Š” ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ addEventListener ๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํŠน์ • ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ ์‹คํ–‰๋  ํ•จ์ˆ˜๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ์ถ”๊ฐ€ํ•˜๊ธฐ

addEventListener ๋ฉ”์„œ๋“œ๋Š” ํŠน์ • ์š”์†Œ์— ์ด๋ฒคํŠธ๋ฅผ ๋“ฑ๋กํ•˜์—ฌ, ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค ์ง€์ •๋œ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ๋ฌธ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

element.addEventListener(event, function, useCapture);
  • element: ์ด๋ฒคํŠธ๋ฅผ ๋“ฑ๋กํ•  HTML ์š”์†Œ
  • event: ์ฒ˜๋ฆฌํ•  ์ด๋ฒคํŠธ ์œ ํ˜• (์˜ˆ: click, mouseover ๋“ฑ)
  • function: ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ ์‹คํ–‰ํ•  ํ•จ์ˆ˜
  • useCapture: ์บก์ฒ˜๋ง ์—ฌ๋ถ€ (์„ ํƒ ์‚ฌํ•ญ)

ํด๋ฆญ ์ด๋ฒคํŠธ ์˜ˆ์ œ

์•„๋ž˜๋Š” ๋ฒ„ํŠผ์„ ํด๋ฆญํ–ˆ์„ ๋•Œ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค:

let button = document.querySelector("button");

button.addEventListener("click", function() {
    alert("๋ฒ„ํŠผ์ด ํด๋ฆญ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!");
});

์œ„ ์ฝ”๋“œ์—์„œ addEventListener๋Š” click ์ด๋ฒคํŠธ๋ฅผ ๊ฐ์ง€ํ•˜๊ณ , ์‚ฌ์šฉ์ž๊ฐ€ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•  ๋•Œ๋งˆ๋‹ค ์•Œ๋ฆผ ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์–‘ํ•œ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ

JavaScript๋Š” ๋‹ค์–‘ํ•œ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ๋Œ€ํ‘œ์ ์ธ ์ด๋ฒคํŠธ๋ฅผ ์˜ˆ๋กœ ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

ํ‚ค๋ณด๋“œ ์ด๋ฒคํŠธ (keydown, keyup)

ํ‚ค๋ณด๋“œ ์ด๋ฒคํŠธ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ํ‚ค๋ณด๋“œ๋ฅผ ๋ˆ„๋ฅด๊ฑฐ๋‚˜ ๋—„ ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. keydown ์ด๋ฒคํŠธ๋Š” ํ‚ค๋ฅผ ๋ˆ„๋ฅด๋Š” ์ฆ‰์‹œ ๋ฐœ์ƒํ•˜๋ฉฐ, keyup ์ด๋ฒคํŠธ๋Š” ํ‚ค๋ฅผ ๋—„ ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

document.addEventListener("keydown", function(event) {
    console.log("๋ˆŒ๋ฆฐ ํ‚ค: " + event.key);
});

์œ„ ์ฝ”๋“œ์—์„œ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ํ‚ค๋ณด๋“œ๋ฅผ ๋ˆ„๋ฅผ ๋•Œ๋งˆ๋‹ค ๋ˆŒ๋ฆฐ ํ‚ค ๊ฐ’์„ ์ฝ˜์†”์— ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

๋งˆ์šฐ์Šค ์ด๋ฒคํŠธ (mouseover, mouseout)

๋งˆ์šฐ์Šค ์ด๋ฒคํŠธ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ํŠน์ • ์š”์†Œ ์œ„๋กœ ๋งˆ์šฐ์Šค๋ฅผ ์˜ฌ๋ฆฌ๊ฑฐ๋‚˜, ๊ทธ ์š”์†Œ์—์„œ ๋งˆ์šฐ์Šค๋ฅผ ๋ฒ—์–ด๋‚  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

let div = document.querySelector("div");

div.addEventListener("mouseover", function() {
    div.style.backgroundColor = "yellow";
});

div.addEventListener("mouseout", function() {
    div.style.backgroundColor = "white";
});

์œ„ ์ฝ”๋“œ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ div ์š”์†Œ์— ๋งˆ์šฐ์Šค๋ฅผ ์˜ฌ๋ฆฌ๋ฉด ๋ฐฐ๊ฒฝ์ƒ‰์ด ๋…ธ๋ž€์ƒ‰์œผ๋กœ ๋ฐ”๋€Œ๊ณ , ๋งˆ์šฐ์Šค๋ฅผ ๋ฒ—์–ด๋‚˜๋ฉด ๋‹ค์‹œ ํ•˜์–€์ƒ‰์œผ๋กœ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.

์ด๋ฒคํŠธ ๊ฐ์ฒด

์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ, JavaScript๋Š” ์ž๋™์œผ๋กœ ์ด๋ฒคํŠธ ๊ฐ์ฒด(Event Object)๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ํ•ด๋‹น ์ด๋ฒคํŠธ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ ๊ฐ์ฒด๋Š” ์ด๋ฒคํŠธ์˜ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ๋‹ค์–‘ํ•œ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฒคํŠธ ๊ฐ์ฒด ํ™œ์šฉ ์˜ˆ์ œ

document.addEventListener("click", function(event) {
    console.log("ํด๋ฆญํ•œ ์œ„์น˜: X=" + event.clientX + ", Y=" + event.clientY);
});

์œ„ ์ฝ”๋“œ์—์„œ๋Š” ํด๋ฆญํ•œ ๋งˆ์šฐ์Šค์˜ ์ขŒํ‘œ๋ฅผ ์ด๋ฒคํŠธ ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. clientX์™€ clientY๋Š” ํด๋ฆญํ•œ ์ง€์ ์˜ X, Y ์ขŒํ‘œ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

์ด๋ฒคํŠธ ์ „ํŒŒ (Event Propagation)

JavaScript ์ด๋ฒคํŠธ๋Š” DOM ํŠธ๋ฆฌ์—์„œ ์ƒ์œ„ ์š”์†Œ๋‚˜ ํ•˜์œ„ ์š”์†Œ๋กœ ์ „ํŒŒ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์ด๋ฒคํŠธ ์ „ํŒŒ๋ผ๊ณ  ํ•˜๋ฉฐ, ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค:

  • ์บก์ฒ˜๋ง(Capturing): ์ƒ์œ„ ์š”์†Œ์—์„œ ํ•˜์œ„ ์š”์†Œ๋กœ ์ด๋ฒคํŠธ๊ฐ€ ์ „๋‹ฌ
  • ๋ฒ„๋ธ”๋ง(Bubbling): ํ•˜์œ„ ์š”์†Œ์—์„œ ์ƒ์œ„ ์š”์†Œ๋กœ ์ด๋ฒคํŠธ๊ฐ€ ์ „๋‹ฌ

์ด๋ฒคํŠธ ์ „ํŒŒ ์ฐจ๋‹จ

์ด๋ฒคํŠธ๊ฐ€ ์ƒ์œ„ ๋˜๋Š” ํ•˜์œ„๋กœ ์ „ํŒŒ๋˜๋Š” ๊ฒƒ์„ ์ฐจ๋‹จํ•˜๋ ค๋ฉด event.stopPropagation() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

document.querySelector("button").addEventListener("click", function(event) {
    event.stopPropagation();  // ์ด๋ฒคํŠธ ์ „ํŒŒ ์ฐจ๋‹จ
    alert("๋ฒ„ํŠผ ํด๋ฆญ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ");
});

์œ„ ์ฝ”๋“œ์—์„œ๋Š” ๋ฒ„ํŠผ์„ ํด๋ฆญํ•  ๋•Œ ์ด๋ฒคํŠธ๊ฐ€ ๋” ์ด์ƒ ์ƒ์œ„ ์š”์†Œ๋กœ ์ „ํŒŒ๋˜์ง€ ์•Š๋„๋ก ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฒคํŠธ ๊ธฐ๋ณธ ๋™์ž‘ ๋ฐฉ์ง€

์ผ๋ถ€ ์ด๋ฒคํŠธ๋Š” ํŠน์ • ๊ธฐ๋ณธ ๋™์ž‘์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํผ ์ œ์ถœ ์‹œ ํŽ˜์ด์ง€๊ฐ€ ์ƒˆ๋กœ ๊ณ ์นจ๋˜๊ฑฐ๋‚˜, ๋งํฌ๋ฅผ ํด๋ฆญํ•˜๋ฉด ์ƒˆ๋กœ์šด ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ์ด ๊ทธ ์˜ˆ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๊ธฐ๋ณธ ๋™์ž‘์„ ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด event.preventDefault() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ๋™์ž‘ ๋ฐฉ์ง€ ์˜ˆ์ œ

document.querySelector("a").addEventListener("click", function(event) {
    event.preventDefault();  // ๋งํฌ ๊ธฐ๋ณธ ๋™์ž‘ ๋ฐฉ์ง€
    alert("๋งํฌ ํด๋ฆญ์ด ๋ฐฉ์ง€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.");
});

์œ„ ์ฝ”๋“œ์—์„œ๋Š” ๋งํฌ๋ฅผ ํด๋ฆญํ•ด๋„ ๊ธฐ๋ณธ ๋™์ž‘์ธ ํŽ˜์ด์ง€ ์ด๋™์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ณ , ๋Œ€์‹  ์•Œ๋ฆผ์ฐฝ์ด ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

๊ฒฐ๋ก 

JavaScript์—์„œ ์ด๋ฒคํŠธ๋Š” ์‚ฌ์šฉ์ž์™€ ์›น ํŽ˜์ด์ง€ ๊ฐ„์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•ต์‹ฌ์ ์ธ ์š”์†Œ์ž…๋‹ˆ๋‹ค. addEventListener ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์–‘ํ•œ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋ฒคํŠธ ๊ฐ์ฒด๋ฅผ ํ™œ์šฉํ•ด ๋”์šฑ ์„ธ๋ถ€์ ์ธ ๋™์ž‘์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด๋ฒคํŠธ ์ „ํŒŒ์™€ ๊ธฐ๋ณธ ๋™์ž‘์„ ์ดํ•ดํ•˜๊ณ  ์ ์ ˆํžˆ ํ™œ์šฉํ•˜๋ฉด, ๋”์šฑ ๋™์ ์ด๊ณ  ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒํ•œ ์›น ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ JavaScript ์ด๋ฒคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›น ํŽ˜์ด์ง€๋ฅผ ๋”์šฑ ํฅ๋ฏธ๋กญ๊ฒŒ ๋งŒ๋“ค์–ด๋ณด์„ธ์š”!

๋Œ“๊ธ€ ์“ฐ๊ธฐ