ìë°ì¤í¬ë¦½í¸ë¥¼ ì¬ì©íë©´ í¸ë¤ë¬ë¥¼ í ë¹í ì ìì ë¿ë§ ìëë¼ ì´ë²¤í¸ë¥¼ ì§ì ë§ë¤ ìë ììµëë¤.
ì´ë ê² ì§ì ë§ë 커ì¤í
ì´ë²¤í¸(custom event)ë 'ê·¸ëí½ ì»´í¬ëí¸(graphical component)'를 ë§ë¤ ë ì¬ì©ë©ëë¤. ìë°ì¤í¬ë¦½í¸ ê¸°ë° ë©ë´ê° ìë¤ê³ ê°ì í´ ë´
ìë¤. ê°ë°ìë ë©ë´ì ë£¨í¸ ììì open(ë©ë´ë¥¼ ì´ìì ë ì¤íë¨), select(í목ì ì ííì ë ì¤íë¨) ê°ì ì´ë²¤í¸ë¥¼ ë¬ì ìí©ì ë§ê² ì´ë²¤í¸ê° ì¤íëê² í ì ììµëë¤. ì´ë ê² ë£¨í¸ ììì ì´ë²¤í¸ í¸ë¤ë¬ë¥¼ ë¬ìëì¼ë©´ ë°ê¹¥ ì½ëììë ì´ë²¤í¸ 리ì¤ëì íµí´ ë©ë´ìì ì´ë¤ ì¼ì´ ì¼ì´ë¬ëì§ë¥¼ íì
í ì ììµëë¤.
ìë°ì¤í¬ë¦½í¸ë¥¼ ì¬ì©íë©´ ìë¡ì´ 커ì¤í
ì´ë²¤í¸ë¿ë§ ìëë¼ ëª©ì ì ë°ë¼ 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)를 í¸ì¶í´ ììì ìë ì´ë²¤í¸ë¥¼ ë°ëì 'ì¤íâìì¼ì¤ì¼ í©ëë¤(dispatchë ì¼ì 'ì²ë¦¬íë¤âë¼ë ë»ì ê°ì§ ìì´ë¨ì´ì
ëë¤ â ì®ê¸´ì´).
ì´ë ê² ì´ë²¤í¸ë¥¼ ì¤íìì¼ì¤ì¼ í¸ë¤ë¬ê° ì¼ë° ë¸ë¼ì°ì ì´ë²¤í¸ì²ë¼ ì´ë²¤í¸ì ë°ìí ì ììµëë¤. bubbles íë그를 trueë¡ í´ì ì´ë²¤í¸ë¥¼ ë§ë ê²½ì° ì´ë²¤í¸ë ì ëë¡ ë²ë¸ë§ ë©ëë¤.
ìì를 ì´í´ë´
ìë¤. ìë°ì¤í¬ë¦½í¸ë¥¼ ì¬ì©í´ click ì´ë²¤í¸ë¥¼ ë§ë¤ê³ ì¤í ìì¼ ë³´ììµëë¤. ë²í¼ì ì¤ì ë¡ í´ë¦íì§ ììì§ë§, ì´ë²¤í¸ í¸ë¤ë¬ê° ëìíë ê²ì íì¸í ì ììµëë¤.
<button id="elem" onclick="alert('í´ë¦!');">ìëì¼ë¡ í´ë¦ ëë ë²í¼</button>
<script>
let event = new Event("click");
elem.dispatchEvent(event);
</script>
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)ì ë²ë¸ë§ ë©ì»¤ëì¦ì ëì¼í©ëë¤. ì´ì ëíì¬ ì»¤ì¤í
ì´ë²¤í¸ìë ë´ì¥ ì´ë²¤í¸ì ë§ì°¬ê°ì§ë¡ 캡ì³ë§, ë²ë¸ë§ ë¨ê³ê° ììµëë¤.
MouseEvent, KeyboardEvent ë±ì ë¤ìí ì´ë²¤í¸
ëª ì¸ìì UI ì´ë²¤í¸ ì¹ì ì ë¤ìí UI ì´ë²¤í¸ í´ëì¤ê° ëª ìëì´ ììµëë¤. ê·¸ì¤ ì¼ë¶ë¥¼ ì¶ë¦¬ë©´ ë¤ìê³¼ ê°ìµëë¤.
UIEventFocusEventMouseEventWheelEventKeyboardEvent- ë±ë±â¦
ê·¸ë°ë° ì´ ì´ë²¤í¸ë¤ì 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
ì´ì ì¼ë° Event ìì±ì를 ì¬ì©í´ íì¤ íë¡í¼í°ë¥¼ ì¤ì í´ ë³´ê² ìµëë¤.
ì ëë¡ ëìíì§ ìëë¤ë ê²ì ì§ì íì¸í ì ììµëë¤.
let event = new Event("click", {
bubbles: true, // Event ìì±ììì
cancelable: true, // bubblesì cancelable íë¡í¼í°ë§ ëìí©ëë¤.
clientX: 100,
clientY: 100
});
alert(event.clientX); // undefined, ì ì ìë íë¡í¼í°ì´ê¸° ë문ì 무ìë©ëë¤.
new Eventë¡ ì´ë²¤í¸ë¥¼ ìì±í ë¤ì, event.clientX=100ì²ë¼ íë¡í¼í°ì ê°ì ì§ì ëª
ìí´ì£¼ë©´ ì´ë° ì ì½ì í¼í ì ì긴 í©ëë¤. ìì ê°ì ì ì½ì ë°ë¥´ë ê±´ ê°ë°ì ë§ìì´ê¸´ íì£ . ê·¸ë ì§ë§ ë¸ë¼ì°ì ìì ë§ë¤ì´ì§ë UI ì´ë²¤í¸ë ì íí ì´ë²¤í¸ íì
ì´ ìë¤ë ê²ì ììëë ê² ì¢ìµëë¤.
UI ì´ë²¤í¸ë³ íì¤ íë¡í¼í° 목ë¡ì ëª
ì¸ììì íì¸í ì ììµëë¤. MouseEventì íì¤ íë¡í¼í°ë ë§í¬ì ìì¼ë íì¸í´ ë³´ì기 ë°ëëë¤.
커ì¤í ì´ë²¤í¸
ì§ê¸ê¹ì§ 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를 ì¬ì©íë©´ ì½ë ìì²´ë§ì¼ë¡ '커ì¤í
ì´ë²¤í¸âë¼ê³ ì¤ëª
í´ì£¼ë í¨ê³¼ê° ììµëë¤.
event.preventDefault()
ë¸ë¼ì°ì ì´ë²¤í¸ ëë¤ìë '기본 ëìâê³¼ í¨ê» ì¤íë©ëë¤. ë§í¬ í´ë¦ ì í¹ì URLë¡ ì´ëí기, ì ì¡ ë²í¼ í´ë¦ ì ìë²ì í¼ ì ì¡í기 ê°ì ëìì ì´ë° 기본 ëìì ëíì ì¸ ìì ëë¤.
ì°ë¦¬ê° ì§ì ë§ë 커ì¤í ì´ë²¤í¸ìë ë¹ì°í 기본 ëìì´ ììµëë¤. íì§ë§ 커ì¤í ì´ë²¤í¸ë¥¼ ë§ë¤ê³ ëì¤í¨ì¹ í´ ì£¼ë ì½ëì ìíë ëìì ë£ì¼ë©´, 커ì¤í ì´ë²¤í¸ìë 기본 ëìì ì¤ì í´ì¤ ì ììµëë¤.
ì´ë²¤í¸ 기본 ëìì event.preventDefault()를 í¸ì¶í´ ì·¨ìí ì ììµëë¤. event.preventDefault()를 í¸ì¶íë©´ ì´ë²¤í¸ í¸ë¤ë¬ë 기본 ëìì´ ì·¨ìëì´ì¼ íë¤ë ì í¸ë¥¼ ë³´ë´ê¸° ë문ì
ëë¤.
ì´ë²¤í¸ 기본ëìì´ ì·¨ìëë©´ elem.dispatchEvent(event) í¸ì¶ ì falseê° ë°íë©ëë¤. í´ë¹ ì´ë²¤í¸ë¥¼ ëì¤í¨ì¹ íë ì½ëìì ì´ë¥¼ íµí´ 기본ëìì´ ì·¨ìëì´ì¼ íë¤ë ê²ì ì¸ì§í©ëë¤.
í ë¼ ì¨ê¸°ê¸° ìì를 íµí´ ì§ê¸ê¹ì§ ë°°ì´ ë´ì©ì ì§ì ì¤ìµí´ë´ ìë¤. ì°¸ê³ ë¡ ì´ ììë ë©ë´ ì¨ê¸°ê¸° ë±ì¼ë¡ ìì© ê°ë¥í©ëë¤.
ììì idê° rabbitì¸ ìì, "hide" ì´ë²¤í¸ë¥¼ ì¤íìí¤ë í¨ì hide()ê° ììµëë¤. hide()ë ë¤ë¥¸ ì½ëë¤ì´ ì´ë²¤í¸ ì¤í ì¬ë¶ë¥¼ ì ì ìê² í´ì¤ëë¤.
rabbit.addEventListener('hide',...)를 ì¬ì©íë©´ ì´ë¤ í¸ë¤ë¬ììë "hide"를 리ì¤ë í ì ììµëë¤. ê·¸ë¦¬ê³ íìíë¤ë©´ event.preventDefault()를 ì¬ì©í´ "hide" ì´ë²¤í¸ì 기본 ëìì ì·¨ìí ì ììµëë¤. ì´ë ê² ê¸°ë³¸ëìì´ ì·¨ìëë©´ í ë¼ê° íë©´ìì ì¬ë¼ì§ì§ ììµëë¤.
<pre id="rabbit">
|\ /|
\|_|/
/. .\
=\_Y_/=
{>o<}
</pre>
<button onclick="hide()">hide()를 í¸ì¶í´ í ë¼ ì¨ê¸°ê¸°</button>
<script>
// hide() will be called automatically in 2 seconds
function hide() {
let event = new CustomEvent("hide", {
cancelable: true // cancelable를 trueë¡ ì¤ì íì§ ìì¼ë©´ preventDefaultê° ëìíì§ ììµëë¤.
});
if (!rabbit.dispatchEvent(event)) {
alert('기본 ëìì´ í¸ë¤ë¬ì ìí´ ì·¨ìëììµëë¤.');
} else {
rabbit.hidden = true;
}
}
rabbit.addEventListener('hide', function(event) {
if (confirm("preventDefault를 í¸ì¶íìê² ìµëê¹?")) {
event.preventDefault();
}
});
</script>
ìììì 주ì ê¹ê² ë´ì¼ í ì ì cancelable: trueì
ëë¤. event.preventDefault()ê° ì ëë¡ ëìíê² íë ¤ë©´ ì´ë²¤í¸ hideì cancelableì ë°ëì trueë¡ ì§ì í´ì¤ì¼ í©ëë¤. ê·¸ë ì§ ìì¼ë©´ event.preventDefault()ê° ë¬´ìë©ëë¤.
ì´ë²¤í¸ ì ì´ë²¤í¸
ì´ë²¤í¸ë ëê² íìì ì²ë¦¬ë©ëë¤. ë°ë¼ì ë¸ë¼ì°ì ê° 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âê° ì°¨ë¡ëë¡ ì¶ë ¥ëë ê²ì íì¸í ì ììµëë¤.
ì´ ìììì 주목í´ì¼ í ê²ì ì¤ì²© ì´ë²¤í¸ 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>
ì´ì ìíë ëë¡ dispatchEventê° mouse.onclickì í¬í¨í íì¬ ì½ë ì¤íì´ ì¢
ë£ë ì´íì ì¤íë©ëë¤. ì´ë²¤í¸ í¸ë¤ë¬ë¤ì´ ìì í ë
립ì ì¼ë¡ ëìë¤ì.
ì¶ë ¥ ììë â1â, â2â, 'ì¤ì²© ì´ë²¤í¸âì ëë¤.
ìì½
ì½ë를 ì¬ì©í´ ì´ë²¤í¸ë¥¼ ì§ì ìì±íë ¤ë©´ 먼ì ì´ë²¤í¸ ê°ì²´ë¥¼ ë§ë¤ì´ì¼ í©ëë¤.
ë²ì©ì ì¼ë¡ ì°ì´ë Event(name, options) í´ëì¤ì ìì±ìë ììì ì´ë²¤í¸ ì´ë¦ê³¼ ë ê°ì íë¡í¼í°ê° ìë optionsë¼ë ê°ì²´ë¥¼ ë°ìµëë¤.
bubbles: trueì´ë©´ ì´ë²¤í¸ë ë²ë¸ë§ë©ëë¤.cancelable: trueì´ë©´event.preventDefault()ê° ëìí©ëë¤.
ì´ ì¸ì MouseEvent, KeyboardEvent ê°ì ë¤ì´í°ë¸ ì´ë²¤í¸ í´ëì¤ì ìì±ìë¤ì ì´ë²¤í¸ í¹ì ì íë¡í¼í°ë¥¼ ë°ìµëë¤. ë§ì°ì¤ ì´ë²¤í¸ì clientXê° ëíì ì¸ ìì
ëë¤.
ì´ë²¤í¸ë¥¼ ì§ì ë§ëë ê²½ì°ë¼ë©´ CustomEvent ìì±ì를 ì¨ì¼ í©ëë¤. CustomEvent ìì±ìì detailì´ë¼ë ì¶ê° íë¡í¼í°ë¥¼ ëª
ìí ì ìëë°, ì¬ê¸°ì ì´ë²¤í¸ ê´ë ¨ ì 보를 ì ì¥í´ì¼ í©ëë¤. ì´ë ê² íë©´ 모ë í¸ë¤ë¬ìì event.detailì íµí´ 커ì¤í
ì´ë²¤í¸ì ì 보를 ì ì ììµëë¤.
커ì¤í
ì´ë²¤í¸ì ì´ë¦ì clickë keydown ê°ì´ ë¸ë¼ì°ì ë´ì¥ ì´ë²¤í¸ì²ë¼ ì§ì ì ì긴 íë°, ì´ë° ê²½ì°ì ì주 ì¡°ì¬í´ì¼ í©ëë¤.
ëëë¡ì´ë©´ ë´ì¥ ì´ë²¤í¸ì ê°ì ì´ë¦ì ê°ì§ ë¸ë¼ì°ì ì´ë²¤í¸ë¥¼ ë§ë¤ì§ ë§ëë¡ í©ìë¤. ëë¶ë¶ì ê²½ì° ì¤ê³ ê´ì ìì ì주 ì¢ì§ ìì ìíì ë¼ì¹ê¸° ë문ì ëë¤.
ê·¸ë ì§ë§ ì´ë° ê²½ì°ìë ë¸ë¼ì°ì ì´ë²¤í¸ë¥¼ ë§ëëê² ë¶ê°í¼ íë, ì¬ì©í´ë ê´ì°®ìµëë¤.
- ìëíí° ë¼ì´ë¸ë¬ë¦¬ê° ì ëë¡ ëìíê² íë ¤ë©´ ê¼ íìí ê²½ì°. ë¤ì´í°ë¸ ì´ë²¤í¸ë¥¼ ë§ëë ê² ì´ì¸ìë ìëíí° ë¼ì´ë¸ë¬ë¦¬ì ìí¸ìì©í ì ìë ìë¨ì´ ìë ê²½ì°ì ê´ì°®ìµëë¤.
- í ì¤í ì ìëí íë ¤ë ê²½ì°. 'ë²í¼ í´ë¦âë±ì ì´ë²¤í¸ë¥¼ ì¬ì©ì ëì ìì´ ì½ëë§ì¼ë¡ ì ë°ìí¤ê³ ì ëë¡ ëìíëì§ ê·¸ 결과를 íì¸íê³ ì í ëë ê´ì°®ìµëë¤.
ë¤ì´í°ë¸ ì´ë²¤í¸ ì´ë¦ê³¼ ê²¹ì¹ì§ ìê² ì»¤ì¤í ì´ë²¤í¸ë¥¼ ë§ëë ê²ì ì¤ê³ 측면ìì ì주 ì°ì´ë ì ëµì ëë¤. 커ì¤í ì´ë²¤í¸ë¥¼ ìì©íë©´ ë©ë´ë ì¬ì´ëë°, ìºë¬ì ë±ì ììì ë°ìíë ì¼ì ìë ¤ì¤ ì ììµëë¤.
ëê¸
<code>í그를, ì¬ë¬ ì¤ë¡ 구ì±ë ì½ë를 ì½ì íê³ ì¶ë¤ë©´<pre>í그를 ì´ì©íì¸ì. 10ì¤ ì´ìì ì½ëë plnkr, JSBin, codepen ë±ì ìëë°ì¤ë¥¼ ì¬ì©íì¸ì.