ç§ãã¡ã¯ããã³ãã©ãå²ãå½ã¦ãã ãã§ãªããJavaScript ããã¤ãã³ããçæãããã¨ãã§ãã¾ãã
ã«ã¹ã¿ã ã¤ãã³ãã使ç¨ãã¦ãã°ã©ãã£ãã¯ã³ã³ãã¼ãã³ããã使ã§ãã¾ããä¾ãã°ãã¡ãã¥ã¼ã®ã«ã¼ãè¦ç´ ã¯ãã¡ãã¥ã¼ã§èµ·ãããã¨ãä¼ããã¤ãã³ããããªã¬ãããã¨ãã§ãã¾ã: open (ã¡ãã¥ã¼ãéã), select (é
ç®ã鏿ããã) ãªã©ã
click, mousedown ãªã©ã®ãããªãçµã¿è¾¼ã¿ã®ã¤ãã³ããçæãããã¨ãã§ãããã¹ããããã¨ãã«ä¾¿å©ã§ãã
ã¤ãã³ãã³ã³ã¹ãã©ã¯ã¿
ã¤ãã³ãã¯DOM è¦ç´ ã¯ã©ã¹ã¨åæ§ãé層ãå½¢æãã¾ããã«ã¼ãã¯çµã¿è¾¼ã¿ã® Event ã¯ã©ã¹ã§ãã
ãã®ããã«ã㦠Event ãªãã¸ã§ã¯ããçæã§ãã¾ã:
let event = new Event(event type[, options]);
弿°:
-
event type â
"click"ãç¬èªã®"hey-ho!"ã®ãããªä»»æã®æååã§ãã -
options â 2ã¤ã®ãªãã·ã§ã³ã®ããããã£ãæã¤ãªãã¸ã§ã¯ãã§ã:
bubbles: true/falseâtrueã®å ´åãã¤ãã³ããããã«ãã¾ããcancelable: true/falseâtrueã®å ´åãâããã©ã«ãã¢ã¯ã·ã§ã³â ãé²ããã¾ããå¾ã»ã©ã ã«ã¹ã¿ã ã¤ãã³ãã«å¯¾ãã¦æå³ãã¦ãããã¨ãè¦ã¦ãã¾ãã
ããã©ã«ãã§ã¯ã両æ¹ã¨ã false ã§ã:
{bubbles: false, cancelable: false}.
dispatchEvent
ã¤ãã³ããªãã¸ã§ã¯ãã使ããå¾ãelem.dispatchEvent(event) ã使ã£ã¦ãè¦ç´ ä¸ã§ âå®è¡â ããå¿
è¦ãããã¾ãã
ãã®å¾ããã³ãã©ã¯ããããæ£è¦ã®çµã¿è¾¼ã¿ã¤ãã³ãã§ãããã®ããã«ããã«åå¿ãã¾ãããã bubbles ãã©ã°ã§ã¤ãã³ãã使ããã¦ããå ´åãããã«ãã¾ãã
ä¸ã®ä¾ã§ã¯ãclick ã¤ãã³ãã JavaScript ã®ä¸ã§éå§ããã¾ãããã³ãã©ã¯ãã¿ã³ãã¯ãªãã¯ããããã®ããã«åä½ãã¾ãã:
<button id="elem" onclick="alert('Click!');">Autoclick</button>
<script>
let event = new Event("click");
elem.dispatchEvent(event);
</script>
âæ¬å½ã®â ã¦ã¼ã¶ã¤ãã³ãã§ãããã¨ãä¼ããæ¹æ³ãããã¾ãã
æ¬å½ã®ã¦ã¼ã¶ã¢ã¯ã·ã§ã³ããæ¥ãã¤ãã³ãã®å ´åããããã㣠event.isTrusted 㯠true ã«ãªãã¾ããã¹ã¯ãªããã§çæãããã¤ãã³ã㯠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
});
// ...elem ã§ãã£ã¹ããã!
let event = new Event("hello", {bubbles: true}); // (2)
elem.dispatchEvent(event);
</script>
è£è¶³:
- ã«ã¹ã¿ã ã¤ãã³ãã«å¯¾ãã¦ã¯ã
addEventListenerã使ãã¹ãã§ãããªããªããon<event>ã¯çµã¿è¾¼ã¿ã¤ãã³ãã«å¯¾ãã¦ã®ã¿åå¨ããããã§ããdocument.onhelloã¯åä½ãã¾ããã bubbles:trueãè¨å®ããªããã°ãªãã¾ããããããªãã¨ãã¤ãã³ãã¯ããã«ãã¾ããã
ãããªã³ã°ã®ä»çµã¿ã¯ãçµã¿è¾¼ã¿ (click) 㨠ã«ã¹ã¿ã (hello) ã¤ãã³ãã§åãã§ãããã£ããã£ãªã³ã°ã¨ãããªã³ã°ã®ãã§ã¼ãºãããã¾ãã
MouseEvent, KeyboardEvent ç
以ä¸ã¯ UI Event specification ã®UIã¤ãã³ãã®ã¯ã©ã¹ã®ãªã¹ãã®ä¸é¨ã§ãã:
UIEventFocusEventMouseEventWheelEventKeyboardEvent- â¦
ãããã®ã¤ãã³ããçæãããã¨ãã¯ãnew Event ã®ä»£ããã«ããããã使ãã¹ãã§ããä¾ãã°ã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, // bubbles 㨠cancelable ã®ã¿
cancelable: true, // Event constructor ã§åä½ãã¾ã
clientX: 100,
clientY: 100
});
alert(event.clientX); // undefined, æªç¥ã®ããããã£ã¯ç¡è¦ããã¾ã!
æè¡çã«ã¯ãçæå¾ã«ç´æ¥ event.clientX=100 ãå²ãå½ã¦ããã¨ã§åé¿ã§ãã¾ããããã¯å©ä¾¿æ§ã®åé¡ã§ãããã«ã¼ã«ã«å¾ãããã§ãããã©ã¦ã¶ã§çæãããã¤ãã³ãã¯å¸¸ã«æ£ããã¿ã¤ããæã£ã¦ãã¾ãã
ç°ãªãUIã¤ãã³ãã®ãããããã£ã®å®å ¨ãªãªã¹ãã¯ä»æ§ã«ããã¾ããä¾ãã°ãMouseEvent ãªã©ã
ã«ã¹ã¿ã ã¤ãã³ã
"hello" ã®ãããªç¬èªã®ã«ã¹ã¿ã ã¤ãã³ãã«å¯¾ãã¦ã¯ãnew CustomEvent ã使ãã¹ãã§ããæè¡çã«ã¯ CustomEvent ã¯1ã¤ã®ä¾ãé¤ã㦠Event ã¨åãã§ãã
2ã¤ç®ã®å¼æ°(ãªãã¸ã§ã¯ã)ã§ã¯ãã¤ãã³ãã¨ä¸ç·ã«æ¸¡ãããä»»æã®æ
å ±ã®ããã«ã追å ã®ãããã㣠detail ã追å ãããã¨ãåºæ¥ã¾ãã
ä¾:
<h1 id="elem">Hello for John!</h1>
<script>
// ã¤ãã³ãã¨ä¸ç·ã«ãã³ãã©ã«æ¥ã追å ã®è©³ç´°æ
å ±ã§ã
elem.addEventListener("hello", function(event) {
alert(event.detail.name);
});
elem.dispatchEvent(new CustomEvent("hello", {
detail: { name: "John" }
});
</script>
detail ããããã£ã¯ä»»æã®ãã¼ã¿ãæã¦ã¾ããæè¡çã«ã¯ãé常㮠new Event ãªãã¸ã§ã¯ããä½ã£ãå¾ãããã«ä»»æã®ããããã£ãå²ãå½ã¦ãäºãã§ããããããããªãã§ãçãã¦ãããã¨ã¯ã§ãã¾ããããããCustomEvent ã¯ä»ã®ã¤ãã³ãããããã£ã¨ã®è¡çªãé¿ããããã®ç¹å¥ãª detail ãã£ã¼ã«ããæä¾ãã¾ãã
ã¤ãã³ãã¯ã©ã¹ã¯ âã©ã®ãããªç¨®é¡ã®ã¤ãã³ãâ ãã示ããããã¤ãã³ããã«ã¹ã¿ã ã§ããã°ããããä½ã§ããããæç¢ºã«ããããã« CustomEvent ã使ãã¹ãã§ãã
event.preventDefault()
ãã cancelable:true ãã©ã°ãæå®ããã¦ããå ´åãã¹ã¯ãªããã§çæãããã¤ãã³ãã§ event.preventDefault() ãå¼ã³åºããã¨ãã§ãã¾ãã
ãã¡ãããã¤ãã³ãã鿍æºã®ååã§ããå ´åããã©ã¦ã¶ã¯ãããç¥ããªãã®ã§ããã®ããã® âããã©ã«ããã©ã¦ã¶ã¢ã¯ã·ã§ã³â ã¯ããã¾ããã
ããããã¤ãã³ããçæããã³ã¼ã㯠dispatchEvent ã®å¾ã«ããã¤ãã®ã¢ã¯ã·ã§ã³ãè¨ç»ããããããã¾ããã
event.preventDefault() ã®å¼ã³åºãã¯ããã³ãã©ããããã®ã¢ã¯ã·ã§ã³ãå®è¡ãã¹ãã§ã¯ãªãã¨ããä¿¡å·ãéä¿¡ããæ¹æ³ã§ãã
ãã®å ´åãelem.dispatchEvent(event) ã¸ã®å¼ã³åºã㯠false ãè¿ãã¾ããããã¦ãã¤ãã³ãçæã³ã¼ãã¯å¦çã¯ç¶ç¶ãã¹ãã§ãªãã¨ç¥ãã¾ãã
ä¾ãã°ãä¸ã®ä¾ã§ã¯ hide() 颿°ãããã¾ããããã¯è¦ç´ #rabbit ã§ "hide" ã¤ãã³ããçæãããã¹ã¦ã®é¢ä¿è
ã« ããã(rabbit)ãé ãããã¨ãéç¥ãã¾ãã
rabbit.addEventListener('hide',...) ã§è¨å®ããããã³ãã©ã¯ãããã«ã¤ãã¦å¦ã³ãå¿
è¦ãªå ´åã«ã¯ event.preventDefault() ãå¼ã³åºããã¨ã§ãã®ã¢ã¯ã·ã§ã³ãé²ããã¨ãã§ãã¾ããããã¨ããããã¯é ãã¾ããã:
<pre id="rabbit">
|\ /|
\|_|/
/. .\
=\_Y_/=
{>o<}
</pre>
<script>
// hide() ã¯2ç§å¾ã«èªåã§å¼ã³åºããã¾ã
function hide() {
let event = new CustomEvent("hide", {
cancelable: true // ãã®ãã©ã°ããªã㨠preventDefault ãåä½ãã¾ãã
});
if (!rabbit.dispatchEvent(event)) {
alert('the action was prevented by a handler');
} else {
rabbit.hidden = true;
}
}
rabbit.addEventListener('hide', function(event) {
if (confirm("Call preventDefault?")) {
event.preventDefault();
}
});
// hide in 2 seconds
setTimeout(hide, 2000);
</script>
ã¤ãã³ãä¸ã®ã¤ãã³ãã¯åæçã§ã
é常ãã¤ãã³ãã¯å¾
ã¡è¡åã«å
¥ãããã¦ããå¦çããã¾ããã¤ã¾ã: ãã©ã¦ã¶ã onclick ãå¦çãã¦ããããã®ããã»ã¹ã®ä¸ã§æ°ããã¤ãã³ããèµ·ããå ´åï¼ä¾ãã°ãã¦ã¹ãç§»åãããªã©ï¼ããã®å¦çã¯å¾
ã¡è¡åã«å
¥ãããã対å¿ãã mousemove ã®ãã³ãã©ã¯ onclick ã®å¦çãçµäºãããã¨ã«å¼ã°ãã¾ãã
注ç®ãã¹ãä¾å¤ã¯ãããã¤ãã³ããå¥ã®ã¤ãã³ãããéå§ãããå ´åï¼ä¾ãã° dispatchEvent ã®ä½¿ç¨ï¼ã§ãããã®ãããªã¤ãã³ãã¯ç´ã¡ã«å¦çããã¾ã: æ°ããã¤ãã³ããã³ãã©ãå¼ã°ããããããç¾å¨ã®ã¤ãã³ãå¦çãåéãã¾ãã
ä¾ãã°ã以ä¸ã®ã³ã¼ãã§ã¯ã menu-open ã¤ãã³ã㯠onclick ã®éä¸ã§ããªã¬ããã¾ãã
ããã¯ã onclick ã®ãã³ãã©ã®çµäºãå¾
ããã«ç´ã¡ã«å¦çããã¾ã:
<button id="menu">Menu (click me)</button>
<script>
// 1 -> nested -> 2
menu.onclick = function() {
alert(1);
// alert("nested")
menu.dispatchEvent(new CustomEvent("menu-open", {
bubbles: true
}));
alert(2);
};
document.addEventListener('menu-open', () => alert('nested'))
</script>
åºåã®é çªã¯æ¬¡ã®ã¨ããã§ã: 1 â nested â 2
ãã¹ããããã¤ãã³ã menu-open 㯠document ã§ææããããã¨ã«æ³¨æãã¦ãã ããããã¹ããããã¤ãã³ãã®ä¼æ¬ãå¦çã¯ãå¤é¨ã®ã³ã¼ã(onclick) ã«æ»ãåã«å®å
¨ã«çµäºãã¾ãã
ãã㯠dispatchEvent ã«ã¤ãã¦ã ãã§ãªããä»ã®ã±ã¼ã¹ãåæ§ã§ããããã¤ãã³ããã³ãã©ãä»ã®ã¤ãã³ããå¼ãèµ·ããã¡ã½ãããå¼ã³åºã㨠â ããããåæçã«ããã¹ãããã颿°ã®è¦é ã§å¦çããã¾ãã
ãããæ°ã«å
¥ããªãã¨ãã¾ãããã menu-open ãä»ã®ãã¹ããããã¤ãã³ãã¨ã¯ç¡é¢ä¿ã« onclick ãæåã«å®å
¨ã«å¦çãããã¨ãã¾ãã
ãã®å ´åã dispatchEvent ï¼ãããã¯ä»ã®ã¤ãã³ããå¼ãèµ·ããå¼ã³åºãï¼ã onclick ã®æå¾ã«ç½®ããããã£ã¨è¯ãæ¹æ³ã¨ãã¦ãããããã¼ãé
å»¶ã® setTimeout ã§ã©ãããã¾ã:
<button id="menu">Menu (click me)</button>
<script>
// 1 -> 2 -> nested
menu.onclick = function() {
alert(1);
// alert(2)
setTimeout(() => menu.dispatchEvent(new CustomEvent("menu-open", {
bubbles: true
})), 0);
alert(2);
};
document.addEventListener('menu-open', () => alert('nested'))
</script>
ããã§ç¾å¨ã®ã³ã¼ãã®å®è¡å¾ã«ã menu.onclick ãå«ãã dispatchEvent ãéåæã«å®è¡ã§ãã¾ããã¤ã¾ãã¤ãã³ããã³ãã©ãå®å
¨ã«åãé¢ããã¾ããã
åºåã®é çªã¯æ¬¡ã®éãã¨ãªãã¾ãã: 1 â 2 â nested
ãµããª
ã¤ãã³ããçæããããã«ã¯ãæåã«ã¤ãã³ããªãã¸ã§ã¯ãã使ããå¿ è¦ãããã¾ãã
æ±ç¨ç㪠Event(name, options) ã³ã³ã¹ãã©ã¯ã¿ã¯ãä»»æã®ã¤ãã³ãåã¨2ã¤ã®ããããã£ãæã¤ options ãªãã¸ã§ã¯ããåãåãã¾ãã:
- ã¤ãã³ããããã«ããã¹ãã§ããã°ã
bubbles: trueã cancelable: trueã¯event.preventDefault()ãåä½ãã¾ãã
ä»ã® MouseEvent, KeyboardEvent ãªã©ã®ãããªãã¤ãã£ãã¤ãã³ãã®ã³ã³ã¹ãã©ã¯ã¿ã¯ãã®ã¤ãã³ãã¿ã¤ãã«åºæã®ããããã£ãåãå
¥ãã¾ããä¾ãã°ããã¦ã¹ã¤ãã³ãã§ããã° clientX ã§ãã
ã«ã¹ã¿ã ã¤ãã³ãã®å ´åãCustomEvent ã³ã³ã¹ãã©ã¯ã¿ã使ãã¹ãã§ãããã㯠detail ã¨è¨ãåã®è¿½å ã®ãªãã·ã§ã³ãæã£ã¦ãããããã¸ã¤ãã³ãåºæã®ãã¼ã¿ãå²ãå½ã¦ãã¹ãã§ããããã¦ã以éãã¹ã¦ã®ãã³ãã©ã¯ event.detail ã§ããã«ã¢ã¯ã»ã¹ãããã¨ãã§ãã¾ãã
click ã keydown ã®ãããªãã©ã¦ã¶ã¤ãã³ããçæãããã¨ã¯æè¡çã«ã¯å¯è½æ§ã§ããã大ããªæ³¨æãæã£ã¦ä½¿ãã¹ãã§ãã
ãã³ãã©ãå®è¡ããããã«ããã©ã¦ã¶ã¤ãã³ããããã¯ãªæ¹æ³ã§çæããã¹ãã§ã¯ããã¾ããã ããã¯ãã»ã¨ãã©ã®å ´åãæªãã¢ã¼ããã¯ãã£ã§ãã
ãã¤ãã£ãã¤ãã³ãã¯æ¬¡ã®ãããªå ´åã«çæãããå ´åãããã¾ã:
- ãµã¼ããã¼ãã£ã©ã¤ãã©ãªãä»ã®ã¤ã³ã¿ã©ã¯ã·ã§ã³ã®ææ®µãæä¾ãã¦ããªãå ´åã«ãåä½ãããããã®æ±ãããã¯ã¨ãã¦ã
- èªåãã¹ãã®å ´åã§ãã¹ã¯ãªããã®ä¸ã§ âãã¿ã³ãã¯ãªãã¯â ããã¤ã³ã¿ãã§ã¼ã¹ãæ£ããåå¿ããããè¦ãããã«ã
ç¬èªã®ååãæã¤ã«ã¹ã¿ã ã¤ãã³ãã¯ãã¢ã¼ããã¯ãã£ä¸ã®ç®çã§ãã¡ãã¥ã¼ãã¹ã©ã¤ããã«ã«ã¼ã»ã«ãªã©ã®å é¨ã§ä½ãèµ·ããããä¼ããããã«çæããããã¨ãããããã¾ãã
ã³ã¡ã³ã
<code>ã¿ã°ã使ã£ã¦ãã ãããè¤æ°è¡ã®å ´åã¯<pre>ãã10è¡ãè¶ ããå ´åã«ã¯ãµã³ãããã¯ã¹ã使ã£ã¦ãã ãã(plnkr, JSBin, codepenâ¦)ã