イベント

ドキュメントやブラウザ、要素に対して何か注目すべきことが発生した場合、ブラウザがイベントを生成します。

このタイミングで任意の関数が実行されるよう定義することができます。この関数のことをイベントハンドラと呼びます。

イベントタイプの種類

イベントには様々な種類があり、発生したイベントの種類を表す文字列をイベントタイプと呼びます。

例えば、要素をクリックした時のイベントタイプは click です。

代表的なイベントタイプは以下の通りです。

オブジェクト イベントタイプ 説明
window load ページの読み込みが完了した時
window DOMContentLoaded HTML ドキュメントの解析が完了した時
Element click 要素がクリックされた時
Element change 要素の値が変更された時
Element focus 要素にフォーカスが当たった時
Element mouseover 要素にマウスが乗った時
Element submit フォーム送信が行われた時

イベントハンドラプロパティの設定

これまでの説明で以下のようなコードが出てきました。

window.onload = function() {
  ...
};

このような onloadonclick といったイベントハンドラプロパティに対して関数を代入することができます。

ただし、この方法ではイベントタイプ毎に1つしかイベントハンドラを定義することはできません。

そのため、後述の addEventListener メソッドを使ってイベントハンドラを定義するのが一般的です。

イベントハンドラの登録・破棄

addEventListener メソッドでイベントハンドラを定義することができます。

第1引数にイベントタイプ、第2引数にイベントハンドラを指定します。 イベントハンドラの引数にはイベントオブジェクトが渡されます。

<section id="section">test</section>
var handler = function(event) {
  // イベントタイプを取得
  console.log(event.type);
  // イベント発生の起点となったオブジェクトを取得
  console.log(event.target);
};

document.getElementById('section').addEventListener('click', handler, false);

登録したイベントハンドラを破棄する場合は、removeEventListener メソッドを使用します。

document.getElementById('section').removeEventListener('click', handler, false);

イベントの伝播

マウスイベントやクリックイベントなどは、内包する要素間でイベントが伝播します。これをイベントバブリングと呼びます。

W3C の図がわかりやすいので貼っておきます。

キャプチャリングフェーズでは、イベントが発生した要素を起点にツリー構造のルートまで辿り、起点の要素までイベントを発生させます。 その後、バブリングフェーズでは起点の要素からルート要素までイベントを発生させます。

先ほどの addEventListener の第3引数に指定していた論理値は、キャプチャリングフェーズで実行するか、バブリングフェーズで実行するかを指定するものでした。 一般的にはバブリングフェーズで実行させるため false と指定していましたが、キャプチャリングフェーズで実行させたい場合は true を指定します。

<section>
  <div>test</div>
</section>

以下のコードの場合、バブリングフェーズで動作します。

document.getElementsByTagName('section')[0].addEventListener('click', function(e) {
  console.log('section click!');
}, false);

document.getElementsByTagName('div')[0].addEventListener('click', function(e) {
  console.log('div click!');
}, false);

以下のコードの場合、キャプチャリングフェーズで動作します。

document.getElementsByTagName('section')[0].addEventListener('click', function(e) {
  console.log('section click!');
}, true);

document.getElementsByTagName('div')[0].addEventListener('click', function(e) {
  console.log('div click!');
}, true);

stopPropagation メソッドを実行すると、イベントの伝播を止めることができます。

document.getElementsByTagName('section')[0].addEventListener('click', function(e) {
  // 実行されない
  console.log('section click!');
}, false);

document.getElementsByTagName('div')[0].addEventListener('click', function(e) {
  console.log('div click!');
  event.stopPropagation();
}, false);

イベントのキャンセル

フォームの送信処理など、イベントにはデフォルトで操作が定義されているものがあります。 デフォルトの操作をキャンセルしたい場合は、イベントオブジェクトの preventDefault メソッドを使用します。

<form action="http://www.google.co.jp" method="POST">
  <input type="text" name="q">
  <input type="submit">
</form>
var form = document.getElementsByTagName('form')[0];
form.addEventListener('submit', function(event) {
  console.log('stop submit');
  event.preventDefault();
});

results matching ""

    No results matching ""