その前段として、簡単なまとめ。
■「イベントハンドラ」とは…
JavaScriptで記述された、マウスの動きといった動作・操作に対して特定の処理を与えるための命令のこと。
onClick、onMouseOverなど。
(イベントハンドラとは (event handler): - IT用語辞典バイナリ)
■「イベントリスナ」とは…
何らかのイベントが発生した場合に呼ばれる関数を持つクラス。
■イベントハンドラを使うメリット
・簡単
・ブラウザの違いをあまり意識する必要がない
■イベントハンドラを使うデメリット
・HTML要素内にJavaScriptコードが混在することになり、HTMLの見た目が煩雑
・同じ要素に同じイベントハンドラを複数定義できない
(第6回 イベントハンドラから脱却しよう)
イベントリスナに追加する方法は、element.addEventListener - MDCに紹介されています。
以下の通り。
ただし、
上記の制約があるのですが、LiosK-free Blogさんで解決するコードが紹介されています。
([JavaScript]addEventListenerを手軽に使おう)
使い方は以下の通りです。
ブラウザ表示内のどこかをクリックすると、alertが表示されます(body onclick=~相当)。
ここから蛇足というか、補足ですが、上記の e に イベントオブジェクトが格納されています。
この e から、クリックされた場所のDOM要素(いつもなら(?)document.getElementByID(id)で取得されるもの)を取得可能です。
標準仕様では event.target で取得可能ですが、残念ながらと言うか例によって IE は対応していません。
代わりに event.srcElement というものが存在します。
なので、DOM要素を取得するためには以下のようにすればよいでしょう。
以下の通り。
if (el.addEventListener){
el.addEventListener('click', modifyText, false);
} else if (el.attachEvent){
el.attachEvent('onclick', modifyText);
}
ただし、
attachEvent の欠点が一つあります。this の値がイベントを起こした要素ではなく、window オブジェクトへの参照になってしまうことです。
上記の制約があるのですが、LiosK-free Blogさんで解決するコードが紹介されています。
function observe(target, type, listener) {
if (target.addEventListener) target.addEventListener(type, listener, false);
else if (target.attachEvent) target.attachEvent('on' + type, function() { listener.call(target, window.event); });
else target['on' + type] = function(e) { listener.call(target, e || window.event); };
}
([JavaScript]addEventListenerを手軽に使おう)
使い方は以下の通りです。
ブラウザ表示内のどこかをクリックすると、alertが表示されます(body onclick=~相当)。
observe(document, 'click', function(e) {
window.alert(e.type + ' on ' + this);
});
ここから蛇足というか、補足ですが、上記の e に イベントオブジェクトが格納されています。
この e から、クリックされた場所のDOM要素(いつもなら(?)document.getElementByID(id)で取得されるもの)を取得可能です。
標準仕様では event.target で取得可能ですが、残念ながらと言うか例によって IE は対応していません。
代わりに event.srcElement というものが存在します。
なので、DOM要素を取得するためには以下のようにすればよいでしょう。
var eventDOM = (event.target || event.srcElement);
Thoughts on イベントハンドラからイベントリスナへ