Language/JavaScript (WEB)

[JS] ๐Ÿ“š ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ปค์Šคํ…€ ์ด๋ฒคํŠธ ๋‹ค๋ฃจ๊ธฐ ๐Ÿ’ฏ ์ •๋ฆฌ

์ธํŒŒ_ 2021. 10. 26. 15:35

์ปค์Šคํ…€-์ด๋ฒคํŠธ

์ด๋ฒคํŠธ ๋””์ŠคํŒจ์น˜

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•ธ๋“ค๋Ÿฌ๋ฅผ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ด๋ฒคํŠธ๋ฅผ ์ง์ ‘ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด ์ปค์Šคํ…€ ์ด๋ฒคํŠธ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ชฉ์ ์— ๋”ฐ๋ผ click, mousedown ๊ฐ™์€ ๋‚ด์žฅ ์ด๋ฒคํŠธ๋ฅผ ์ง์ ‘ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ๋งŒ๋“  ๋‚ด์žฅ ์ด๋ฒคํŠธ๋“ค์€ ํ…Œ์ŠคํŒ…์„ ์ž๋™ํ™”ํ•  ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

Event์˜ ์ƒ์„ฑ์ž

๋‚ด์žฅ ์ด๋ฒคํŠธ ํด๋ž˜์Šค๋Š” DOM ์š”์†Œ ํด๋ž˜์Šค๊ฐ™์ด ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ํ˜•์„ฑํ•ฉ๋‹ˆ๋‹ค.

๋‚ด์žฅ ์ด๋ฒคํŠธ ํด๋ž˜์Šค ๊ณ„์ธต์˜ ๊ผญ๋Œ€๊ธฐ์—” Event ํด๋ž˜์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

 

Event ๊ฐ์ฒด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

let event = new Event(type[, options]);
  • type – ์ด๋ฒคํŠธ ํƒ€์ž…์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฌธ์ž์—ด๋กœ "click"๊ฐ™์€ ๋‚ด์žฅ ์ด๋ฒคํŠธ, "my-event" ๊ฐ™์€ ์ปค์Šคํ…€ ์ด๋ฒคํŠธ๊ฐ€ ์˜ฌ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  • options – ๋‘ ๊ฐœ์˜ ์„ ํƒ ํ”„๋กœํผํ‹ฐ๊ฐ€ ์žˆ๋Š” ๊ฐ์ฒด๊ฐ€ ์˜ต๋‹ˆ๋‹ค.
    • bubbles: true/false – true์ธ ๊ฒฝ์šฐ ์ด๋ฒคํŠธ๊ฐ€ ๋ฒ„๋ธ”๋ง ๋ฉ๋‹ˆ๋‹ค.
    • cancelable: true/false – true์ธ ๊ฒฝ์šฐ ๋ธŒ๋ผ์šฐ์ € '๊ธฐ๋ณธ ๋™์ž‘’์ด ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ปค์Šคํ…€ ์ด๋ฒคํŠธ ์„น์…˜์—์„œ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
    ์•„๋ฌด๋Ÿฐ ๊ฐ’๋„ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ๋‘ ํ”„๋กœํผํ‹ฐ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ {bubbles: false, cancelable: false}์ฒ˜๋Ÿผ false๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

dispatchEvent

์ด๋ฒคํŠธ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ ๋‹ค์Œ์—” elem.dispatchEvent(event)๋ฅผ ํ˜ธ์ถœํ•ด ์š”์†Œ์— ์žˆ๋Š” ์ด๋ฒคํŠธ๋ฅผ ๋ฐ˜๋“œ์‹œ '์‹คํ–‰’์‹œ์ผœ์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค

์ด๋ ‡๊ฒŒ ์ด๋ฒคํŠธ๋ฅผ ์‹คํ–‰์‹œ์ผœ์ค˜์•ผ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์ผ๋ฐ˜ ๋ธŒ๋ผ์šฐ์ € ์ด๋ฒคํŠธ์ฒ˜๋Ÿผ ์ด๋ฒคํŠธ์— ๋ฐ˜์‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

bubbles ํ”Œ๋ž˜๊ทธ๋ฅผ true๋กœ ํ•ด์„œ ์ด๋ฒคํŠธ๋ฅผ ๋งŒ๋“  ๊ฒฝ์šฐ ์ด๋ฒคํŠธ๋Š” ์ œ๋Œ€๋กœ ๋ฒ„๋ธ”๋ง ๋ฉ๋‹ˆ๋‹ค.

 

์˜ˆ์‹œ๋ฅผ ์‚ดํŽด๋ด…์‹œ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•ด click ์ด๋ฒคํŠธ๋ฅผ ๋งŒ๋“ค๊ณ  ์‹คํ–‰ ์‹œ์ผœ ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

๋ฒ„ํŠผ์„ ์‹ค์ œ๋กœ ํด๋ฆญํ•˜์ง€ ์•Š์•˜์ง€๋งŒ, ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<button id="elem" onclick="alert('ํด๋ฆญ!');">์ž๋™์œผ๋กœ ํด๋ฆญ ๋˜๋Š” ๋ฒ„ํŠผ</button>

<script>
  let event = new Event("click");
  elem.dispatchEvent(event);
</script>
event.isTrusted
event.isTrusted๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋ฒคํŠธ๊ฐ€ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•ด ์ƒ์„ฑํ•œ ์ด๋ฒคํŠธ์ธ์ง€ ‘์ง„์งœ’ ์‚ฌ์šฉ์ž๊ฐ€ ๋งŒ๋“  ์ด๋ฒคํŠธ์ธ์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
event์˜ isTrusted ํ”„๋กœํผํ‹ฐ๊ฐ€ true์ด๋ฉด ์‚ฌ์šฉ์ž ์•ก์…˜์„ ํ†ตํ•ด ๋งŒ๋“  ์ด๋ฒคํŠธ๋ผ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. 
isTrusted๊ฐ€ false์ด๋ฉด ํ•ด๋‹น ์ด๋ฒคํŠธ๊ฐ€ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ๋˜์—ˆ๋‹ค๋Š” ๊ฑธ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ปค์Šคํ…€ ์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง

"hello"๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง„ ์ด๋ฒคํŠธ๋ฅผ ๋งŒ๋“ค๊ณ  ๋ฒ„๋ธ”๋ง ์‹œ์ผœ์„œ document์—์„œ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด๋ฒคํŠธ๊ฐ€ ๋ฒ„๋ธ”๋ง๋˜๊ฒŒ ํ•˜๋ ค๋ฉด bubbles๋ฅผ true๋กœ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

<h1 id="elem">Hello from the script!</h1>

<script>
  // ๋ฒ„๋ธ”๋ง์ด ์ผ์–ด๋‚˜๋ฉด์„œ document์—์„œ ์ด๋ฒคํŠธ๊ฐ€ ์ฒ˜๋ฆฌ๋จ
  document.addEventListener("hello", function(event) { // (1)
    alert("Hello from " + event.target.tagName); // Hello from H1
  });

  // ์ด๋ฒคํŠธ(hello)๋ฅผ ๋งŒ๋“ค๊ณ  elem์—์„œ ์ด๋ฒคํŠธ ๋””์ŠคํŒจ์น˜
  let event = new Event("hello", {bubbles: true}); // (2)
  elem.dispatchEvent(event);

  // document์— ํ• ๋‹น๋œ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋™์ž‘ํ•˜๊ณ  ๋ฉ”์‹œ์ง€๊ฐ€ ์–ผ๋Ÿฟ์ฐฝ์— ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

</script>

์œ„ ์˜ˆ์‹œ์—์„œ ์ฃผ์˜ํ•ด์„œ ๋ณผ ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. on<event>์€ ๋‚ด์žฅ ์ด๋ฒคํŠธ์—๋งŒ ํ•ด๋‹นํ•˜๋Š” ๋ฌธ๋ฒ•์ด๊ธฐ ๋•Œ๋ฌธ์— document.onhello๋ผ๊ณ  ํ•˜๋ฉด ์›ํ•˜๋Š” ๋Œ€๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ปค์Šคํ…€ ์ด๋ฒคํŠธ๋Š” ๋ฐ˜๋“œ์‹œ addEventListener๋ฅผ ์‚ฌ์šฉํ•ด ํ•ธ๋“ค๋งํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  2. bubbles:true๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ์ด๋ฒคํŠธ๊ฐ€ ๋ฒ„๋ธ”๋ง ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚ด์žฅ ์ด๋ฒคํŠธ(click)์™€ ์ปค์Šคํ…€ ์ด๋ฒคํŠธ(hello)์˜ ๋ฒ„๋ธ”๋ง ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

์ด์— ๋”ํ•˜์—ฌ ์ปค์Šคํ…€ ์ด๋ฒคํŠธ์—๋„ ๋‚ด์žฅ ์ด๋ฒคํŠธ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์บก์ณ๋ง, ๋ฒ„๋ธ”๋ง ๋‹จ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.


UI ์ด๋ฒคํŠธ ์ฃผ์˜์ 

๋ช…์„ธ์„œ์˜ UI ์ด๋ฒคํŠธ ์„น์…˜์—” ๋‹ค์–‘ํ•œ UI ์ด๋ฒคํŠธ ํด๋ž˜์Šค๊ฐ€ ๋ช…์‹œ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ์ค‘ ์ผ๋ถ€๋ฅผ ์ถ”๋ฆฌ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • UIEvent
  • FocusEvent
  • MouseEvent
  • WheelEvent
  • KeyboardEvent
  • ๋“ฑ๋“ฑ…

๊ทธ๋Ÿฐ๋ฐ ์ด ์ด๋ฒคํŠธ๋“ค์€ new Event๋กœ ๋งŒ๋“ค๋ฉด ์•ˆ ๋˜๊ณ , ๋ฐ˜๋“œ์‹œ ๊ด€๋ จ ๋‚ด์žฅ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

๋งˆ์šฐ์Šค ํด๋ฆญ ์ด๋ฒคํŠธ๋ผ๋ฉด new MouseEvent("click")๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜์ฃ .

 

์ด๋ ‡๊ฒŒ ์ œ๋Œ€๋กœ ๋œ ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•ด์•ผ๋งŒ ํ•ด๋‹น ์ด๋ฒคํŠธ ์ „์šฉ ํ‘œ์ค€ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ช…์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

new MouseEvent("click")๋ฅผ ์‚ฌ์šฉํ•ด ๋งˆ์šฐ์Šค ์ด๋ฒคํŠธ์˜ clientX, clientY ํ”„๋กœํผํ‹ฐ๋ฅผ ์„ค์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

let event = new MouseEvent("click", {
  bubbles: true,
  cancelable: true,
  clientX: 100,
  clientY: 100
});

alert(event.clientX); // 100
// ์ž‘๋™ ์•ˆ๋จ !!!!!!!!!!!!!!!!!!!!!!
let event = new Event("click", {
  bubbles: true, // Event ์ƒ์„ฑ์ž์—์„ 
  cancelable: true, // bubbles์™€ cancelable ํ”„๋กœํผํ‹ฐ๋งŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  clientX: 100,
  clientY: 100
});

alert(event.clientX); // undefined, ์•Œ ์ˆ˜ ์—†๋Š” ํ”„๋กœํผํ‹ฐ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค.

์ปค์Šคํ…€ ์ด๋ฒคํŠธ ๋งŒ๋“ค๊ธฐ

์ง€๊ธˆ๊นŒ์ง„ new Event๋กœ ์ปค์Šคํ…€ ์ด๋ฒคํŠธ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ œ๋Œ€๋กœ ๋œ ์ปค์Šคํ…€ ์ด๋ฒคํŠธ๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด new CustomEvent๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 

 

CustomEvent๋Š” Event์™€ ๊ฑฐ์˜ ์œ ์‚ฌํ•˜์ง€๋งŒ ํ•œ ๊ฐ€์ง€ ๋‹ค๋ฅธ ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

CustomEvent์˜ ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜์—” ๊ฐ์ฒด๊ฐ€ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š”๋ฐ, ๊ฐœ๋ฐœ์ž๋Š” ์ด ๊ฐ์ฒด์— detail์ด๋ผ๋Š” ํ”„๋กœํผํ‹ฐ๋ฅผ ์ถ”๊ฐ€ํ•ด ์ปค์Šคํ…€ ์ด๋ฒคํŠธ ๊ด€๋ จ ์ •๋ณด๋ฅผ ๋ช…์‹œํ•˜๊ณ , ์ •๋ณด๋ฅผ ์ด๋ฒคํŠธ์— ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<h1 id="elem">์ด๋ณด๋ผ๋‹˜, ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค!</h1>

<script>
  // ์ถ”๊ฐ€ ์ •๋ณด๋Š” ์ด๋ฒคํŠธ์™€ ํ•จ๊ป˜ ํ•ธ๋“ค๋Ÿฌ์— ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.
  elem.addEventListener("hello", function(event) {
    alert(event.detail.name);
  });

  elem.dispatchEvent(new CustomEvent("hello", {
    detail: { name: "๋ณด๋ผ" }
  }));
</script>

detail ํ”„๋กœํผํ‹ฐ์—” ์–ด๋–ค ๋ฐ์ดํ„ฐ๋„ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์‹ค new Event๋กœ ์ผ๋ฐ˜ ์ด๋ฒคํŠธ๋ฅผ ์ƒ์„ฑํ•œ ๋‹ค์Œ ์ถ”๊ฐ€ ์ •๋ณด๊ฐ€ ๋‹ด๊ธด ํ”„๋กœํผํ‹ฐ๋ฅผ ์ด๋ฒคํŠธ ๊ฐ์ฒด์— ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— detail ํ”„๋กœํผํ‹ฐ ์—†์ด๋„ ์ถฉ๋ถ„ํžˆ ์ด๋ฒคํŠธ์— ์›ํ•˜๋Š” ์ •๋ณด๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๊ธด ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ๋„ detail์ด๋ผ๋Š” ํŠน๋ณ„ํ•œ ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ๋‹ค๋ฅธ ์ด๋ฒคํŠธ ํ”„๋กœํผํ‹ฐ์™€ ์ถฉ๋Œ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด์„œ์ž…๋‹ˆ๋‹ค.

์ด ์™ธ์—๋„ new CustomEvent๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ ์ž์ฒด๋งŒ์œผ๋กœ '์ปค์Šคํ…€ ์ด๋ฒคํŠธ’๋ผ๊ณ  ์„ค๋ช…ํ•ด์ฃผ๋Š” ํšจ๊ณผ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.


๋™๊ธฐ์  ์ฒ˜๋ฆฌ (์ด๋ฒคํŠธ ์•ˆ ์ด๋ฒคํŠธ)

์ด๋ฒคํŠธ๋Š” ๋Œ€๊ฒŒ ํ์—์„œ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ onclick ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ๋Š”๋ฐ ๋งˆ์šฐ์Šค๋ฅผ ์›€์ง์—ฌ์„œ ์ƒˆ๋กœ์šด ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋ฉด ์ด ์ด๋ฒคํŠธ์— ์ƒ์‘ํ•˜๋Š” mousemove ํ•ธ๋“ค๋Ÿฌ๋Š” onclick ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ๊ฐ€ ๋๋‚œ ํ›„์— ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿฐ๋ฐ ์ด๋ฒคํŠธ ์•ˆ dispatchEvent ์ฒ˜๋Ÿผ ์ด๋ฒคํŠธ ์•ˆ์— ๋‹ค๋ฅธ ์ด๋ฒคํŠธ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ์—” ์œ„์™€ ๊ฐ™์€ ๊ทœ์น™์ด ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๋ฒคํŠธ ์•ˆ์— ์žˆ๋Š” ์ด๋ฒคํŠธ๋Š” ์ฆ‰์‹œ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ํ˜ธ์ถœ๋˜๊ณ  ๋‚œ ํ›„์— ํ˜„์žฌ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋ง์ด ์žฌ๊ฐœ๋ฉ๋‹ˆ๋‹ค.

 

์˜ˆ์‹œ๋ฅผ ์‚ดํŽด๋ด…์‹œ๋‹ค. 

menu-open ์ด๋ฒคํŠธ๋Š” onclick ์ด๋ฒคํŠธ๊ฐ€ ์ฒ˜๋ฆฌ๋˜๋Š” ๋„์ค‘์— ํŠธ๋ฆฌ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.

menu-open ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ๋Š” onclick ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋ฐ”๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

<button id="menu">๋ฉ”๋‰ด(ํด๋ฆญํ•ด์ฃผ์„ธ์š”)</button>

<script>
  menu.onclick = function() {
    alert(1);

    menu.dispatchEvent(new CustomEvent("menu-open", {
      bubbles: true
    }));

    alert(2);
  };

  // 1๊ณผ 2 ์‚ฌ์ด์— ํŠธ๋ฆฌ๊ฑฐ๋ฉ๋‹ˆ๋‹ค
  document.addEventListener('menu-open', () => alert('์ค‘์ฒฉ ์ด๋ฒคํŠธ'));
</script>
[์‹คํ–‰]
1
์ค‘์ฒฉ ์ด๋ฒคํŠธ
2

์–ผ๋Ÿฟ์ฐฝ์— ‘1’, ‘์ค‘์ฒฉ ์ด๋ฒคํŠธ’, '2’๊ฐ€ ์ฐจ๋ก€๋Œ€๋กœ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ด ์˜ˆ์‹œ์—์„œ ์ฃผ๋ชฉํ•ด์•ผ ํ•  ๊ฒƒ์€ ์ค‘์ฒฉ ์ด๋ฒคํŠธ menu-open์ด document์— ํ• ๋‹น๋œ ํ•ธ๋“ค๋Ÿฌ์—์„œ ์ฒ˜๋ฆฌ๋œ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค.

์ค‘์ฒฉ ์ด๋ฒคํŠธ์˜ ์ „ํŒŒ์™€ ํ•ธ๋“ค๋ง์ด ์™ธ๋ถ€ ์ฝ”๋“œ(onclick)์˜ ์ฒ˜๋ฆฌ๊ฐ€ ๋‹ค์‹œ ์‹œ์ž‘๋˜๊ธฐ ์ „์— ๋๋‚ฌ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฐ ์ผ์€ ์ค‘์ฒฉ ์ด๋ฒคํŠธ๊ฐ€ dispatchEvent์ผ ๋•Œ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ์•ˆ์—์„œ ๋‹ค๋ฅธ ์ด๋ฒคํŠธ๋ฅผ ํŠธ๋ฆฌ๊ฑฐ ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, ์ด๋ฒคํŠธ ์•ˆ ์ด๋ฒคํŠธ๋Š” ๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๋Š” ๊ฒƒ์ด์ฃ .


๋น„๋™๊ธฐ์  ์ฒ˜๋ฆฌํ•˜๊ธฐ

๊ทธ๋Ÿฐ๋ฐ ๋•Œ์— ๋”ฐ๋ผ ์ค‘์ฒฉ ์ด๋ฒคํŠธ๊ฐ€ ๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๋Š”๊ฑธ ์›์น˜ ์•Š๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๊ธฐ ๋งˆ๋ จ์ž…๋‹ˆ๋‹ค.

์œ„ ์˜ˆ์‹œ์—์„œ menu-open์ด๋ฒคํŠธ๋‚˜ ๋‹ค๋ฅธ ์ด๋ฒคํŠธ์˜ ์ฒ˜๋ฆฌ ์—ฌ๋ถ€์™€ ์ƒ๊ด€์—†์ด onclick ์ด๋ฒคํŠธ๋ฅผ ๋จผ์ € ์ฒ˜๋ฆฌํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ์š”?

  • onclick ๋์— dispatchEvent ๋“ฑ์˜ ์ด๋ฒคํŠธ ํŠธ๋ฆฌ๊ฑฐ ํ˜ธ์ถœ์„ ๋„ฃ๋Š” ๊ฒŒ ํ•˜๋‚˜์˜ ๋ฐฉ๋ฒ•์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด์— ๋”ํ•˜์—ฌ ์ค‘์ฒฉ ์ด๋ฒคํŠธ๋ฅผ ์ง€์—ฐ์‹œ๊ฐ„์ด 0์ธ setTimeout์œผ๋กœ ๊ฐ์‹ธ๋Š” ๊ฒƒ๋„ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
<button id="menu">Menu (click me)</button>

<script>
  menu.onclick = function() {
    alert(1);

    setTimeout(() => menu.dispatchEvent(new CustomEvent("menu-open", {
      bubbles: true
    })));

    alert(2);
  };

  document.addEventListener('menu-open', () => alert('์ค‘์ฒฉ ์ด๋ฒคํŠธ'));
</script>
[์‹คํ–‰]
1
2
์ค‘์ฒฉ ์ด๋ฒคํŠธ