ywork2020.com

Title

イベントとリスナーとハンドラーについて

目次 (INDEX)

イベントにまつわる言葉について

まず、初めに「イベント」という言葉と、それにまつわる言葉について理解しておく必要がありますので一応のおさらいをしておきます。

event
読み: イベント
意味: 出来事、行事
listener
読み: リスナー
意味: 聞き手、聴取者
handler
読み: ハンドラー
意味: 扱い手、調教師
bind
読み: バインド
意味: 紐づける、結びつける、関連付ける
attach
読み: アタッチ
意味: 接続、取り付ける

目次に戻る

イベントの概要

イベントとは一般的な意味として「出来事」とか「行事」といった意味をもった言葉ですが、プログラミングでも同じような意味の解釈で良いと思います。 例えば、webページ上にある要素をマウスでクリックすると「クリックイベント」が発生します。また、ページの読込みが終わったら「ロードイベント」が発生します。 つまり、「クリックの出来事」、「読込み完了の出来事」というとプログラミングにおけるイベントも一般的な言葉の意味で違和感なく通じますね。

目次に戻る

イベントリスナーとは

リスナーとは一般的な意味として「聞き手」とか「聴取者」といった意味をもった言葉です。 これはプログラミングでいうと少し意味が違うかなと思いますが、しかし、間違いでもありません。

まず、プログラミングにおける、リスナーについて、解釈上の答えから言ってしまうと以下のようになります。 いくつかの言葉のパターンで記述してみますのでニュアンスをつかんでいただけると良いのですが。

  • 英国風 : 「リスナー」 とは 「イベント」 「ハンドラー」 「バインド」 するためのものです。
  • 日本風 : 「聴取者」 とは 「行事」 「扱い(振る舞い)」 「紐づけ」 するためのものです。
  • 具体的 : 「イベントリスナー」 とは 「イベント」 「関数」 「関連付け」 するためのものです。

上記の言葉でも まだ伝わりにくい気がしましたので、もう一つ、プログラムの実行側からの言葉にすると、次のように言っていると解釈できます。

「私はプログラミングした 貴方の指示を聞いて 、イベントに関数の実行を関連付けます。」

ということで、「イベントリスナーはイベントに関数処理の実行を紐づけるためのもの」だということです。

目次に戻る

イベントハンドラーとは

ハンドラーとは一般的な意味として「扱い手」とか「調教師」といった意味をもった言葉です。 これはプログラミングでいうと少し伝わりにくいような気がしますが、しかし、ニュアンスとしては分かるところです。

例えば、これを「ハンドラー」ではなく「ハンドリング」【handling】という言葉に変えて意味を考えてみてください。 ハンドリングとは、「取り扱い」、「処理」、「操作」、「対処」、「対応」などの意味をもつ言葉です。これだと十分に意味が分かります。

前のセクションでも書いていますが、つまり、ハンドラーとは具体的にいうと「関数」【function】のことを指しています。 つまり、イベントが発生したときに実行されるプロセシングのことだと解釈できます。

目次に戻る

言葉による解釈の色々

世の中には言葉による解釈の違いで、イベントリスナーとイベントハンドラーについて色々な説明がなされています。

例えば、HTMLタグの「属性」からイベントを登録するものをイベントハンドラーと呼び、 javascriptの「addEventListener」メソッドからイベントを登録するものをイベントリスナーと呼ぶことが1つの解釈になっているようです。

このような解釈の仕方も私としては好きであり、イベントを処理するということの理解においては効率的な考え方だと思います。 そもそも、プログラミングにおいて、英語圏ではない人にとっては言葉の壁というのは大きく理解の妨げになります。 なので、初めのうちはニュアンスで理解することが多くなるのも事実だと思いますから、あまり細かなことに集中するよりは、とにかく書いたコードがどのように実行されるかを知ることの方が重要だと私は考えます。

しかし、構文からコードの書き方を読むときには少し理解しにくい場合があるのも事実です。 ということで、次のセクションでは少しだけ、構文形式での理解について書いてみようと思います。

なお、このページでの説明には私の考えた独自の「言葉」や「表現」が含まれていますので、 これを真とするのではなく、他の方法での学習や理解も合わせてお願いいたします。

目次に戻る

構文形式でみるイベント登録の色々

ここでは、イベント登録についての構文的な話をします。 とりあえず、よく使うであろう「クリック」イベントの登録を題材にして話をすすめていこうと思いますのでよろしくお願いします。

それでは次のコードと実際のサンプルを見てください。 なお、HTML と script のコードは別々にしていますが、HTML コードの中に script のコードが入っていると理解してください。

サンプルコード: HTML
<body>
	<button onclick="myFunction()">クリック A</button>
	<script>...</script>
</body>
サンプルコード: script
<script>
	function myFunction(){
		window.alert("クリック A");
	}
</script>

上記のHTMLサンプルの02行目は button要素 の onclick属性 を使って myFunction() という関数をバインドした例です。 私はこの属性を使った方法を「属性リスナー」と表現しています。 これを構文形式にすると以下の様になります。

構文形式: HTML
<Element Listener="Handler()">クリック</Element>

いかがでしょうか。構文形式で見るとリスナーとハンドラーの関係性が少し見てとれると思います。 続いて以下に javascript の addEventListener を使ってイベントに関数をバインドする例を掲載します。

サンプルコード: HTML
<body>
	<button id="idButton">クリック B</button>
	<script>...</script>
</body>
サンプルコード: script
<script>
	let elmButton = document.getElementById("idButton");
	elmButton.addEventListener(
		"click", function(){
			window.alert("クリック B");
		}
	);
</script>

それでは以下に javascriptサンプルの 03 行目~ 07 行目を構文形式で書いてみます。

構文形式: javascript
Element.addEventListener(Listener, Handler(){processing});

javascript のコードも書いたので、ついでに jQuery のコードでも書いておきましょう。 jQuery のコード では 以下のようになります。

サンプルコード: HTML
<head>
	<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
</head>
<body>
	<p><button id="idBtnC">クリック C</button></p>
	<p><button id="idBtnD">クリック D</button></p>
	<script>...</script>
</body>
サンプルコード: script (jQuery)
<script>
	$("#idBtnC").click(function(){
		window.alert("クリック C");
	});
	$("#idBtnD").on("click", function(){
		window.alert("クリック D");
	});
</script>

それでは、以下 jQuery を構文形式で表したものです。 ここでは click メソッドと on メソッドのコードを同時に書き出しています。

構文形式: jQuery
$(Selector).Listener(Handler(){processing});
$(Selector).on(Listener, Handler(){processing});

以上でイベントにハンドラーをバインドするサンプルは終りにしますが、コードを見ていただいてニュアンスは伝わったでしょうか。 ここでの構文形式というのは、構文とは違うと思いますが、リスナーとハンドラーがコードの中でどの位置に当てはまっているかを知ることは、 イベント処理の理解に役立ちます。そういう意味で、構文形式という方法をとりました。

このサンプルコードが言葉の壁によってイベント関連の理解にくるしんでいる方の助けになれば幸いです。

目次に戻る

リスナーとハンドラーの構文形式コード 【まとめ】

前のセクションでは、長々とコードを掲載しましたので HTMLの属性リスナー、 javascript の addEventListener メソッド と jQuery の リスナー系メソッドの構文形式コードをひとまとめにしたものを以下に掲載しておきます。

<Element Listener="Handler()">クリック</Element>
Element.addEventListener(Listener, Handler(){processing});
$(Selector).Listener(Handler(){processing});
$(Selector).on(Listener, Handler(){processing});

目次に戻る

参考: イベントの種類とリスナー

ここでは、全てではありませんが、イベント種類にマッチさせるためのリスナーを表にしました。 参考になれば幸いです。

リスナーとイベント 【一覧表】

属性リスナーイベント
onAbort画像の読み込みを中断した時
onBlurページやフォーム要素からフォーカスが外れた時
onChangeフォーム要素の選択、入力内容が変更された時
onClick要素やリンクをクリックした時
onDblClick要素をダブルクリックした時
onError画像の読み込み中にエラーが発生した時
onFocusページやフォーム要素にフォーカスが当たった時
onKeyDownキーを押した時
onKeyPressキーを押してる時
onKeyUp押していたキーをあげた時
onMouseDownマウスでクリックした時
onMouseMoveカーソルがターゲット内を動いている時
onMouseOutカーソルがターゲットの外に出た時
onMouseOverカーソルがターゲット上に侵入した時
onMouseUpクリックしたマウスを上げた時
onResetフォームがリセットされた時
onSelectテキストが選択された時
onSelectStartページ内の要素が選択されようとした時
onSubmitフォームを送信しようとした時
onLoadページや画像の読み込みが完了した時
onUnloadウィンドウを閉じた時、他のページに切り替えた時、ページ更新した時
onDragDropマウスでドラッグ&ドロップした時
イベントリスナーイベント
abortリソースの読み込みが中止された時。
animationstartCSSアニメーションが開始した時。
animationendCSSアニメーションが終了した時。
animationiterationCSSアニメーションが繰り返された時。
afterprintプリントダイアログを閉じた時。
beforeprintプリントダイアログを開いた時。
beforeunloadウィンドウ、文書、およびそのリソースがアンロードされる前。
blur要素がフォーカスを失った時
clickクリック時
closeWebSocket 接続が閉じられた時。
copy選択範囲がクリップボードにコピーされた時。
cut選択範囲が切り取られてクリップボードにコピーされた時。
cachedマニフェストにリストされているリソースがダウンロードされ、アプリケーションがキャッシュされる時。
DOMContentLoadedDOMツリーの構築が完了した時。(画像などの読込みを待たないでタグ構築が完了した時)
drag要素もしくは選択文字列がドラッグされている間。
dragendドラッグ操作が終わったとき。(マウスボタンが放された時、またはESCキーが押されたとき)
dragenter要素もしくは選択文字列がドラッグされて、有効なドロップ対象に入ったとき。
dragstartユーザが、要素もしくは選択文字列をドラッグし始めたとき。
dragleave要素もしくは選択文字列がドラッグされて、有効なドロップ対象からはずれたとき。
dragover要素もしくは選択文字列が、有効なドロップ対象の上をドラッグされている間。
drop要素が有効なドロップ対象にドロップされたとき。
errorリソースをロードできなかった時。
focus要素がフォーカスされた時 (バブリングなし)。
loadページの読み込みが全て完了した時。(DOMContentLoadedの方が適切である場合があるので注意)
keydown任意のキーが押された時。
keypressShift、Fn、CapsLockを除く任意のキーが押された状態にある時
keyup任意のキーが押された状態から解放される時。
messageWebSocket 経由でメッセージを受信した時。
mousedownマウスのボタンが押下された時
mouseupマウスのボタンを離した時
mouseoverカーソルがターゲット上に侵入した時
mousemoveカーソルがターゲット内を動いている時
mouseoutカーソルがターゲットの外に出た時
resizeブラウザのウィンドウ等のサイズが変更された時
scrollスクロールされた時
submitサブミットボタンが押された時。
offlineブラウザーがネットワークにアクセスできなかった時。
onlineブラウザーがネットワークにアクセスした時。
openWebSocket 接続が確立された時。
pageshowセッション履歴のエントリが移動されている時。
pagehideセッション履歴のエントリが横断されている時。
pasteクリップボードからアイテムが貼り付けられた時。
popstateセッション履歴エントリが(場合によっては)ナビゲートされている時。
resetリセットボタンが押された時。
transitionstartCSSトランジションが実際に始まった時。
transitioncancelCSSトランジションがキャンセルされた時。
transitionendCSSトランジションが終了した時。
transitionrunCSSトランジションが実行し始めた時。
unload文書または依存するリソースがアンロードされた時。
タッチパネル用イベント
touchstartタッチが開始された時
touchmove指を画面上で動かす時
touchend指を画面から離した時

目次に戻る