概要: このチュートリアルでは、JavaScriptイベント、イベントモデル、イベントの処理方法について学習します。
JavaScriptイベント入門
イベントとは、Webブラウザが検出して応答できるアクションのことです。例えば、マウスクリックやページの読み込みなどです。
たとえば、ユーザーがボタンをクリックしたときに警告を表示したい場合などです。
イベントには、イベントハンドラと呼ばれる、イベント発生時に実行される関数を含めることができます。イベントハンドラは、イベントリスナーとも呼ばれ、イベントをリッスンし、イベントが発生したときに実行されます。
id が btn
のボタンがあるとします。
<button id="btn">Click Me!</button>
Code language: HTML, XML (xml)
ボタンがクリックされたときに実行される関数を定義するには、addEventListener()
メソッドを使用してイベントハンドラを登録する必要があります。
let btn = document.querySelector('#btn');
function handleClick() {
alert('It was clicked!');
}
btn.addEventListener('click', handleClick);
Code language: JavaScript (javascript)
仕組み
- まず、
querySelector()
メソッドを使用して、id がbtn
のボタンを選択します。 - 次に、イベントハンドラとして
handleClick()
という関数を定義します。 - 3 番目に、
addEventListener()
を使用してイベントハンドラを登録します。これにより、ユーザーがボタンをクリックすると、display()
関数が実行されます。
イベントハンドラを登録するより短い方法は、すべてのコードを無名関数に配置することです。次のようにします。
let btn = document.querySelector('#btn');
btn.addEventListener('click',function() {
alert('It was clicked!');
});
Code language: JavaScript (javascript)
または、アロー関数を使用することもできます。
let btn = document.querySelector('#btn');
btn.addEventListener('click',() => {
alert('It was clicked!');
});
Code language: JavaScript (javascript)
イベントフロー
次のHTMLドキュメントがあると仮定します。
<!DOCTYPE html>
<html>
<head>
<title>JS Event Demo</title>
</head>
<body>
<div id="container">
<button id='btn'>Click Me!</button>
</div>
</body>
Code language: HTML, XML (xml)
ボタンをクリックすると、クリックイベントはボタンだけでなく、ボタンのコンテナである div
とWebページ全体でも発生します。
イベントフローは、イベントが発生した要素からページでイベントが受信され、DOMツリーを介して伝播される順序を説明します。
主なイベントモデルは2つあります。
- イベントバブリング
- イベントキャプチャリング
イベントバブリング
イベントバブリングモデルでは、イベントは最も具体的な要素から開始され、最も具体的な要素 (document
または window
) に向かって上方向に流れます。
ボタンをクリックすると、click
イベントは次の順序で発生します。
- ボタン
- id が container の div
- body
- html
- document
click
イベントは、クリックされた要素であるボタンで最初に発生します。次に、click
イベントはDOMツリーを上に移動し、document
オブジェクトに到達するまで、そのパスに沿って各ノードで発生します。
次の図は、ユーザーがボタンをクリックしたときのイベントバブリングの効果を示しています。

最新のWebブラウザは、イベントを window
オブジェクトまでバブルアップすることに注意してください。
イベントキャプチャリング
イベントキャプチャリングモデルでは、イベントは最も具体的な要素から開始され、最も具体的な要素に向かって下方向に流れます。
ボタンをクリックすると、click
イベントは次の順序で発生します。
- document
- html
- body
- id が container の div
- ボタン
次の図は、イベントキャプチャリングの効果を示しています。

DOMレベル2イベントフロー
DOMレベル2イベントは、イベントフローに3つのフェーズがあることを指定しています。
- まず、イベントキャプチャリングが発生し、イベントをインターセプトする機会が提供されます。
- 次に、実際のターゲットがイベントを受信します。
- 最後に、イベントバブリングが発生し、イベントへの最終的な応答が可能になります。
次の図は、ユーザーがボタンをクリックしたときのDOMレベル2イベントモデルを示しています。

イベントオブジェクト
イベントが発生すると、Webブラウザは Event
オブジェクトをイベントハンドラに渡します。
let btn = document.querySelector('#btn');
btn.addEventListener('click', function(event) {
console.log(event.type);
});
Code language: JavaScript (javascript)
出力
'click'
Code language: JavaScript (javascript)
次の表に、event
オブジェクトの最も一般的に使用されるプロパティとメソッドを示します。
プロパティ/メソッド | 説明 |
---|---|
bubbles | イベントがバブルアップする場合はtrue |
cancelable | イベントのデフォルトの動作をキャンセルできる場合はtrue |
currentTarget | イベントが発生している現在の要素 |
defaultPrevented | preventDefault() が呼び出された場合は true を返します。 |
detail | イベントに関する詳細情報 |
eventPhase | キャプチャリングフェーズの場合は1、ターゲットの場合は2、バブリングの場合は3 |
preventDefault() | イベントのデフォルトの動作をキャンセルします。このメソッドは、cancelable プロパティが true の場合にのみ有効です。 |
stopPropagation() | それ以上のイベントキャプチャリングまたはバブリングをキャンセルします。このメソッドは、bubbles プロパティが true の場合にのみ使用できます。 |
target | イベントのターゲット要素 |
type | 発生したイベントのタイプ |
event
オブジェクトは、イベントハンドラ内でのみアクセスできることに注意してください。すべてのイベントハンドラが実行されると、イベントオブジェクトは自動的に破棄されます。
preventDefault()
イベントのデフォルトの動作を防ぐには、preventDefault()
メソッドを使用します。
たとえば、リンクをクリックすると、ブラウザは href
属性で指定されたURLに移動します。
<a href="https://javascripttutorial.dokyumento.jp/">JS Tutorial</a>
Code language: HTML, XML (xml)
ただし、event
オブジェクトの preventDefault()
メソッドを使用することで、この動作を防ぐことができます。
let link = document.querySelector('a');
link.addEventListener('click',function(event) {
console.log('clicked');
event.preventDefault();
});
Code language: JavaScript (javascript)
preventDefault()
メソッドは、イベントがDOMをバブルアップするのを停止しないことに注意してください。イベントは、その cancelable
プロパティが true
の場合にキャンセルできます。
stopPropagation()
stopPropagation()
メソッドは、DOMツリーを介したイベントのフローを直ちに停止します。ただし、ブラウザのデフォルトの動作は停止しません。
次の例を参照してください。
let btn = document.querySelector('#btn');
btn.addEventListener('click', function(event) {
console.log('The button was clicked!');
event.stopPropagation();
});
document.body.addEventListener('click',function(event) {
console.log('The body was clicked!');
});
Code language: JavaScript (javascript)
stopPropagation()
メソッドがない場合、コンソールウィンドウに2つのメッセージが表示されます。
ただし、ボタンの click
イベントハンドラで stopPropagation()
が呼び出されたため、click
イベントは body
に到達しません。
まとめ
- イベントとは、Webブラウザで発生したアクションのことです。たとえば、マウスクリックなどです。
- イベントフローには、イベントバブリングとイベントキャプチャリングの2つの主要なモデルがあります。
- DOMレベル2イベントは、イベントフローに3つのフェーズがあることを指定しています。イベントバブリング、正確な要素で発生するイベント、イベントキャプチャリングです。
addEventListener()
を使用して、イベントをイベントリスナーに接続するイベントを登録します。event
オブジェクトは、イベントリスナー内でのみアクセスできます。preventDefault()
メソッドを使用して、イベントのデフォルトの動作を防ぎますが、イベントフローは停止しません。stopPropagation()
メソッドを使用して、DOMツリーを介したイベントのフローを停止しますが、ブラウザのデフォルトの動作はキャンセルしません。