DOMおれおれAdvent Calendar 2015 – 18日目分
jQueryだと on() で楽ちんなんだけど、DOMでは addEventListener() になります。な、長い!
var el = document.querySelector('#the-button');
el.addEventListener('click', function(event) {
alert('Hello world!');
});
第三引数
ふつうは addEventListener(type, listener) という形で使うけれど、実は addEventListener(type, listener, useCapture) のように三つめの引数 useCapture を取る事ができます。
昔は必須だったけど今は省略可能で、省略時は false となります。
で、MDNを見るとこんな註釈が挿入されてます。(英語版にも同様の註釈あり。)
注記: useCapture は、主要なブラウザの最近のバージョンでのみ省略可能です。例えば、Firefox 6 より前では省略できません。幅広い互換性を保つために、引数を省略すべきではありません。
Firefox 6のリリースは2011年。IE と違って何年も前のものを使い続ける事はないだろうし、省略しちゃっても全然構わないと思います。
用途の説明は省きます。使わんし。
bind() の併用
addEventListener() で登録した関数は、実行時は対象の要素オブジェクトを this として呼ばれます。MVxのViewとかに分けて作ってるとそういうの困るので、 bind() して使う事が多いかと思います。
var view = {
el: null,
initialize: function(options) {
this.el = options.el;
this.name = options.name;
this.el.addEventListener('click', this.onclick.bind(this));
},
onclick: function(event) {
alert(this.name); // => "Orange"
}
};
view.initialize({
el: document.querySelector('button'),
name: 'Orange'
});
環境
IE 9+。他は問題なし。
IE 8までは attachEvent() という別のメソッドで同様の結果を得られます。ほとんど一緒だけど、イベント名の前に "on" を追加する必要があります。(例: "click" → "onclick" ) あとはコールバック関数に与えられる引数の内容がちょっと違うとか。
