[JS] ๐ ์๋ฐ์คํฌ๋ฆฝํธ ์ปค์คํ ์ด๋ฒคํธ ๋ค๋ฃจ๊ธฐ ๐ฏ ์ ๋ฆฌ
์ด๋ฒคํธ ๋์คํจ์น
์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ๋ฉด ํธ๋ค๋ฌ๋ฅผ ํ ๋นํ ์ ์์ ๋ฟ๋ง ์๋๋ผ ์ด๋ฒคํธ๋ฅผ ์ง์ ๋ง๋ค ์๋ ์์ต๋๋ค.
์๋ก์ด ์ปค์คํ ์ด๋ฒคํธ๋ฟ๋ง ์๋๋ผ ๋ชฉ์ ์ ๋ฐ๋ผ 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์ธ ๊ฒฝ์ฐ ๋ธ๋ผ์ฐ์ '๊ธฐ๋ณธ ๋์’์ด ์คํ๋์ง ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ ์ปค์คํ ์ด๋ฒคํธ ์น์ ์์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
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>
์ ์์์์ ์ฃผ์ํด์ ๋ณผ ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- on<event>์ ๋ด์ฅ ์ด๋ฒคํธ์๋ง ํด๋นํ๋ ๋ฌธ๋ฒ์ด๊ธฐ ๋๋ฌธ์ document.onhello๋ผ๊ณ ํ๋ฉด ์ํ๋ ๋๋ก ๋์ํ์ง ์์ต๋๋ค. ์ปค์คํ ์ด๋ฒคํธ๋ ๋ฐ๋์ addEventListener๋ฅผ ์ฌ์ฉํด ํธ๋ค๋งํด์ผ ํฉ๋๋ค.
- 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
์ค์ฒฉ ์ด๋ฒคํธ