DOMおれおれAdvent Calendar 2015 – 22日目
jQueryなら $el.trigger('foo')
とするだけで簡単なんだけど、DOMでやるとちょっと面倒くさいです。
独自イベントを作る
CustomEventというコンストラクターを使います。第一引数にイベント名を与えます。
var type = 'foo'; var myEvent = new CustomEvent(type); console.log(myEvent, myEvent.type);
基本的にこれで良いのだけど、IEはエラーになります。しかもCustomEventコンストラクターはあるのに使っちゃ駄目っていう仕様です。(だから有無だけじゃ判断できない。) IEてそういうところあるよね……。
というわけで
仕方ないからIEでも動くやり方にします。
var type = 'foo'; var myEvent = document.createEvent('CustomEvent'); myEvent.initCustomEvent(type, false, false, null); console.log(myEvent, myEvent.type);
IEでも動くんならこれでいいんじゃ?
と思う方もおられるかと思いますが、なんでもこっちのやり方は廃止の予定だそうで。 new CustomEvent()
の方を使ってね、だそうです。
イベントに情報を持たせる
CustomEventの場合、 event.detail
で参照できる情報を設定する事ができます。
var type = 'foo'; var detail = { sushi:'tuna' }; var event1 = document.createEvent('CustomEvent'); event1.initCustomEvent(type, false, false, detail); console.log(event1.detail.sushi); // => "tuna" var event2 = new CustomEvent(type, { detail:detail }); console.log(event2.detail.sushi); // => "tuna"
本物?のイベントの見分け方
ユーザー操作からウェブブラウザーが生成した本物のイベントは、 isTrusted
プロパティが true
になります。JavaScriptから生成した場合はこれが false
になるので、ここを見ると「あ、こいつ騙りだ!」と分かります。
クリックイベントを作る
引数が多くて割と面倒くさい。
var event = document.createEvent('MouseEvents'); event.initMouseEvent('click', true, // bubbles true, // cancelable window, // view null, // detail 0, // screenX 0, // screenY 0, // clientX 0, // clientY false, // ctrlKey false, // altKey false, // shiftKey false, // metaKey 0, // button null // relatedTarget );
IEを捨てられるなら new MouseEvent('click')
だけで事足ります。情報を与える必要がある場合は第二引数にオブジェクトを指定します。
var event = new MouseEvent('click', { bubbles: true, button: 1 });
イベントを発火させる
dispatchEvent()
でイベントを発火させる事ができます。
// eventは作成済みとします var el = document.querySelector('#el'); el.addEventListener('click', function(event) { console.log(event.type); }); el.dispatchEvent(event);
上記の例の通り、イベントは普通に addEventListener()
で監視できます。ちなみに監視はあくまでイベント名を対象に行うので、MouseEventでもCustomEventでも、 type
が "click"
であれば反応します。
ちなみにjQuery
jQueryはjQuery.Eventという独自のコンストラクターを用意して、DOMのイベントとは無関係にやってるみたいです。なので本来の event
にあるはずのプロパティがなかったりする。
元のイベントは event.originalEvent
に格納されるので、適宜そちらを利用します。携帯端末のタップ関係とかこっち使うね。
参考
- document.createEvent – Web API インターフェイス | MDN
- event.initEvent – Web API インターフェイス | MDN
- CustomEvent.initCustomEvent() – Web APIs | MDN
- MouseEvent.initMouseEvent() – Web APIs | MDN
- Event() – Web APIs | MDN
- CustomEvent() – Web APIs | MDN
- MouseEvent() – Web APIs | MDN
- javascript – Why aren’t my parameters getting passed through to a dispatched event? – Stack Overflow … IE 9+でカスタムイベントを作る