【JavaScript】ブラウザイベント入門 - ブラウザのイベントに応じて処理(イベントハンドラー)を実行する

【JavaScript】ブラウザイベント入門 - ブラウザのイベントに応じて処理(イベントハンドラー)を実行する

JavaScriptのブラウザイベントについて解説します。

検証環境

ブラウザイベント

ブラウザイベントは“ブラウザ動作のWEBページで発生するイベント”です。

JavaScriptはクリックやキーボード入力など様々なイベントを検知できます。

イベントハンドラー

イベントハンドラーは“イベント発生時の処理”です。

※ イベントハンドラーはイベントリスナーと呼ぶことがあります。

JavaScriptはイベントハンドラーをHTML属性値やDOMを利用したコールバック関数として設定して実行できます。

このドキュメントではクリックイベントを例に各設定方法を確認します。

HTML属性値

HTML属性を利用してイベントハンドラーを設定します。

基本構文

<タグ名 イベント属性="処理">

イベント属性はイベントに対応する属性です。

例えばクリックイベントはonclickになります。

処理はJavaScriptのコードです。

サンプル

___ih_hl_start
<button onclick="console.log('Hello World!');">ボタン</button>
___ih_hl_end
Hello World!

ボタンをクリックするとonclick属性の処理を実行し、コンソールにHello World!を出力します。

※ プレビューには影響しませんので、ご自身の動作環境でお試しください。

また、script要素や外部JSファイルの関数等の処理を呼び出すことが可能です。

___ih_hl_start
<button onclick="result();">ボタン</button>
___ih_hl_end
<p id="result"></p>

<script>
    function result() {
        let result = document.getElementById('result');
        result.textContent = 'Hello World!';
    }
</script>

このボタンをクリックするとp要素のテキストをHello World!に設定します。

HTML属性値のコードは管理や可読性、汎用性等の観点から簡潔であることが望まれます。

そのため、一般的にはコード量が複数行ある場合は、script要素や外部JSファイルに関数として定義し、HTML属性値では関数の呼び出しのみを行います。

ただし、そのようなケースに合わない場合もあるので都度判断してコーディングすることが大切です。

DOM

DOMのイベントハンドラー設定はプロパティまたはメソッドのいずれかを利用します。

プロパティ

DOMのイベントプロパティはイベントハンドラーの登録や解除を行えます。

登録

イベントプロパティにイベントハンドラーを登録(代入)します。

基本構文
要素ノード.イベント種別 = 処理
サンプル
<button id="btn">ボタン</button>
<p id="result"></p>
    
<script type="text/javascript">
    function result() {
        let result = document.getElementById('result');
        result.textContent = 'Hello World!';
    }
    
    let btn = document.getElementById('btn');
    
    ___ih_hl_start
    btn.onclick = result;
    ___ih_hl_end
</script>

12行目がイベントハンドラーの登録です。

onclickプロパティはクリック時のイベントハンドラーになります。

解除

イベントハンドラーの解除はイベントプロパティの値をnullに設定します。

基本構文
変数.イベント種別 = null
サンプル
<button id="btn">ボタン</button>
<p id="result"></p>
    
<script type="text/javascript">
    function result() {
        let result = document.getElementById('result');
        result.textContent = 'Hello World!';
    }
    
    let btn = document.getElementById('btn');
    
    btn.onclick = result;
    
    ___ih_diff_start
+    btn.onclick = null;
    ___ih_diff_end
</script>

1つ前のサンプルコードにイベントハンドラー解除の処理を追加しました。

12行目でイベントハンドラーを登録していますが、14行目で解除しているため、ボタンをクリックしてもresult関数は呼び出されません。

メソッド

DOMにはイベントハンドラーの登録や解除、複数登録を行えます。

登録

addEventListenerメソッドでイベントハンドラーを登録します。

基本構文
要素ノード.addEventListener(イベント種別, 処理)
サンプル
<button id="btn">ボタン</button>
<p id="result"></p>
    
<script type="text/javascript">
    function result() {
        let result = document.getElementById('result');
        result.textContent = 'Hello World!';
    }
    
    let btn = document.getElementById('btn');
    
    ___ih_hl_start
    btn.addEventListener('click', result);
    ___ih_hl_end
</script>

12行目がaddEventListenerメソッドを利用したイベントハンドラーの登録です。

イベント種別の'click'はクリック時のイベントハンドラーになります。

複数登録

addEventListenerメソッドで登録したコールバック関数はイベントハンドラーに追加されます。

コールバック関数を置き換えではなく、追加なので、複数登録が可能です。

<button id="btn">ボタン</button>
<p id="result1"></p>
<p id="result2"></p>
    
<script type="text/javascript">
    function result1() {
        let result = document.getElementById('result1');
        result.textContent = 'Hello World!';
    }
    
    function result2() {
        let result = document.getElementById('result2');
        result.textContent = 'Good Morning!';
    }
    
    let btn = document.getElementById('btn');
    
    ___ih_hl_start
    btn.addEventListener('click', result1);
    ___ih_hl_end
    
    ___ih_hl_start
    btn.addEventListener('click', result2);
    ___ih_hl_end
</script>

18行目と20行目でbutton要素に2つのイベントハンドラーを登録しています。

プレビューのボタンをクリックした時の動作から、各イベントハンドラーを実行したことが確認できます。

解除

removeEventListenerメソッドでイベントハンドラーを解除します。

基本構文
要素ノード.removeEventListener(イベント種別, 処理)
サンプル
<button id="btn">ボタン</button>
<p id="result1"></p>
<p id="result2"></p>
    
<script type="text/javascript">
    function result1() {
        let result = document.getElementById('result1');
        result.textContent = 'Hello World!';
    }
    
    function result2() {
        let result = document.getElementById('result2');
        result.textContent = 'Good Morning!';
    }
    
    let btn = document.getElementById('btn');
    
    btn.addEventListener('click', result1);
    
    btn.addEventListener('click', result2);
    
    ___ih_hl_start
    btn.removeEventListener('click', result1);
    ___ih_hl_end
</script>

22行目がremoveEventListenerメソッドを利用したイベントハンドラーの解除です。

18行目で登録したresult1関数を解除しています。

プレビューのボタンをクリックした時の動作から、正常に解除されたことが分かります。

イベントの種類

イベントにはクリック以外にも様々な種類があります。

HTML属性とaddEventListenerメソッドでイベント種別の名称が異なりますが、HTML属性は名称の先頭にonが付き、addEventListenerメソッドは付かないという違いのため、簡単に覚えられます。

代表的なイベント
HTML属性 addEventListener 意味
onclick click クリックした時
oncontextmenu contextmenu 右クリックした時
ondblclick dblclick ダブルクリックした時
onkeydown keydown キー(キーボードなど)が押された時
onkeyup keyup キー(キーボードなど)が押されている状態から離された時
onkeypress keypress キー(キーボードなど)が押されている状態
onfocus focus フォーカスが当たった時
onblur blur フォーカスが外れた時
onchange change 値の変更が確定した時
oninput input 値を変更した時
onsubmit submit 送信された時
onmousedown mousedown 押した時
onmouseup mouseup 押している状態から離した時
onmousemove mousemove 要素上をマウスが移動した時
onmouseover mouseover 要素上にマウスが被さった時
onmouseout mouseout 要素上からマウスが外れた時
onwheel wheel マウスホイールが回転した時
onselect select テキストが選択された時
onreset reset リセットした時
onload load データ(ページや画像、外部ファイルなど)が読み込まれた時
onerror error エラーが発生した時