ブラウザでイベントを発生させて処理をしよう
イベントとは、クリックや読み込み完了など、システムで生じた動作などのことです。ボタンをクリックしたというイベントから何かを動作させる、といった動きはよくありますね。
基本的にはaddEventListener
でイベントを設定しますが、HTMLにonclick
などを書いて、そこからスクリプトに情報を送りたいときは時々あります。
目次
イベントの基本
イベントに対する動作は、addEventListener
や、HTMLのonclick
などへの設定を利用します。
しばしばwindow.onclick
に代入したり、window.onload
に代入するなどありますが、非推奨です。代入すると代入前に設定されていた動作は上書きされてしまうため、バグの原因になります。
ここで、イベントが起こることで機能が動作することを、発火と表現することがあります。
イベントを実行する方法
HTMLに設定する
クリック時にalert
を出してみましょう。
See the Pen Event onclick by Totori (@souki202) on CodePen.
ボタンを押すとアラートが出現しますね。onclick
内に設定するのはJavascriptのコードで、alert('clicked!!')
もシンプルなJavascriptのコードです。
また、Javascriptに書いた関数を呼び出すこともできています。
イベントを伝える
クリックなどのイベントが発生すると、その時の情報が生成されます。
イベントの情報はevent
という変数に格納されます。
また、イベントが発生した要素は、this
で取得できます。
<button onclick="popAlert(event, this)">Click me</button>
function popAlert(e, obj) { console.log(e); console.log(obj); alert(message); }
これで、イベントの情報とクリックされた要素をpopAlert
関数に送ることができ、様々な情報を取得できます。
PointerEvent {isTrusted: true, pointerId: 1, width: 1, height: 1, pressure: 0, …} isTrusted: true altKey: false altitudeAngle: 1.5707963267948966 azimuthAngle: 0 bubbles: true button: 0 buttons: 0 cancelBubble: false cancelable: true clientX: 43 clientY: 22 ...
See the Pen event onclick2 by Totori (@souki202) on CodePen.
addEventListenerを使う
Javascript側でaddEventListener
を使うことで、どの要素でどういったイベントが起こったら何の処理をするか、というのを設定できます。
<button>Click me!</button>
// イベント発生源を取得する const button = document.querySelector("button"); // それに対し、"click"イベントが起こったときに実行する内容を決める button.addEventListener("click", (e) => { console.log(e); });
addEventListener
には、第1引数にイベントの種類を、第2引数に動作させたい内容を関数で書きます。
See the Pen by Totori (@souki202) on CodePen.
関数の引数にはイベントの詳細情報が入っています。ここで情報を出力するとこのような情報が入っています。
PointerEvent {isTrusted: true, pointerId: 1, width: 1, height: 1, pressure: 0, …} isTrusted: true altKey: false altitudeAngle: 1.5707963267948966 azimuthAngle: 0 bubbles: true button: 0 buttons: 0 cancelBubble: false cancelable: true clientX: 43 clientY: 22 ...
よく利用するのはマウスの座標系と、target
です。target
にはイベントを起こした対象が入っています。(上の例だとbutton
要素)
イベントの種類
比較的よく使うイベント一覧です。その中でも特によく使うものは太字にしています。
- マウス関連
- click
- ターゲットをクリックしたとき
- mousemove
- ターゲット上でマウスが移動したとき
- mousedown
- ボタンを押した瞬間
- クリックでは, 押して離したときに発火する
- mouseup
- ボタンを離した瞬間
- mouseover
- カーソルがターゲット内に移動したとき
- mouseout
- カーソルがターゲット外に移動したとき
- click
- キーボード関連
- keypress
- フォーカスがあたっている状態でキーを押して離したとき
- 基本的にはフォームのinputなどに使用
- 長押しすると何度も発火する
- keydown
- フォーカスがあたっている状態でキーを押した瞬間
- 長押しすると何度も発火する
- keyup
- フォーカスがあたっている状態でキーを離した瞬間
- 長押ししても離すまでは発火しない
- keypress
- フォーム関連
- select
- テキストフィールドで文字選択をしたとき
- change
- 値が変化したとき
- ラジオボタンの付け替え, 入力文字列の変更など
- 値が変化したとき
- submit
- フォームのsubmitを行ったとき
- ボタンではなく, formに付ける
- reset
- フォームのresetを行ったとき
- ボタンではなく, formに付ける
- focus
- inputやtextareaなどがフォーカス状態になったとき
- blur
- inputやtextareaなどのフォーカスが外れたとき
- キーを離した瞬間
- select
- DOM関連
- DOMContentLoaded
- DOMの読み込みが終わったとき
- loadは, 画像などのリソースの読み込みも完了しないと発火しない
- DOMの読み込みが終わったとき
- DOMActivate
- ターゲットがアクティブになったとき
- DOMFocusIn
- ターゲットがフォーカス状態になったとき
- DOMFocusOut
- ターゲットからフォーカスが離れたとき
- DOMContentLoaded
- ウィンドウ関連
- load
- ページの読み込みが完了したとき
- しばしばwindowに付ける
- ページの読み込みが完了したとき
- resize
- 対象の大きさが変化したとき
- しばしばwindowに付ける
- 対象の大きさが変化したとき
- scroll
- 対象のスクロールバーの位置が変化したとき
- しばしばwindowに付ける
- 対象のスクロールバーの位置が変化したとき
- load
すべてを覚える必要はありません。したいイベントがあれば都度検索で十分ですが、太字だけは覚えておくと楽になります。
キーボードでShiftキーなどの複合イベント
Ctrlキーなど、修飾キー単体ではkeypressなどは発火しません。イベント発火時に、イベントのデータから押しているかどうかを取り出せます。
例えば、Shift+Aを押しているかを判定してみましょう。
Shiftキーの場合、大文字になるのでkey
の値で区別が付きます。
See the Pen Event keyshift by Totori (@souki202) on CodePen.
キーボード系のイベント時は、.key
に入るのはキー名です。
以前まで普通に使われていたkeyCode
は非推奨になりました。これは、システムのキーマップやロケールによって変化するため、正確ではないからです。
Altキーなどの修飾キーは、キーイベントのaltKey
、ctrlKey
、shiftKey
にその情報が入っています。
See the Pen event modifier key by Totori (@souki202) on CodePen.
ここで、基本的にはブラウザのショートカットの挙動が優先され、イベントを設定しても発火しないことが多いということに注意が必要です。(特にaltキー)
バブリング (イベントの連続発火)
例えば、重なっている要素それぞれにイベントを設定したとすると、内側から順番に発火していきます。これをバブリングといいます。
つまり、親要素でイベントを設定しておけば、そのどの子要素でイベントが発生しても反応できるということです。

See the Pen Event click2 by Totori (@souki202) on CodePen.
子のp
->inner
->親のout
の順で発火しました。
逆方向にイベントを伝播させる場合は、addEventListener
の第3引数にtrue
を設定します。
この機能はほとんど使いません。
See the Pen Event capture by Totori (@souki202) on CodePen.
バブリングを止める (stopPropagation)
イベントに対し、stopPropagation()
を実行します。
See the Pen Event stopprop by Totori (@souki202) on CodePen.
e.stopPropagation();
を実行したことで、outをクリック
は表示されていないことがわかります。
これは知っているとまれに役に立つ、という程度です。そういった機能があるということは把握しておくと良いでしょう。
デフォルトの挙動を止める(preventDefault)
イベントに対し、preventDefault()
を実行します。
See the Pen Event preventdefault by Totori (@souki202) on CodePen.
フォームはsubmitを行うと設定したurlに情報が送信され、ページが遷移しますが、e.preventDefault()
をしたことでフォームの送信イベントを動作させないようにできます。
これは、formの送信機能での送信ではなく、ajaxで送信したいときなどに頻繁に活躍します。
まとめ
イベントは、主にaddEventListener
で設定します。
イベントの制御では、preventDefault
は重要です。送信フォームを使ってajaxで送信するときなど、意外と活躍します。
イベントの設定ができると、できることの幅は一気に広がります。複雑なアニメーションや表示の制御など、使う頻度も多くあるため、どんどん使っていきましょう。
