概要: このチュートリアルでは、子要素に複数のイベントハンドラを登録する代わりに、親要素に単一のイベントハンドラを追加するJavaScriptイベント委任の使用方法を学習します。
JavaScriptイベント委任入門
次のようなメニューがあるとします。
<ul id="menu">
<li><a id="home">home</a></li>
<li><a id="dashboard">Dashboard</a></li>
<li><a id="report">report</a></li>
</ul>
Code language: HTML, XML (xml)
各メニュー項目のclick
イベントを処理するには、対応するclick
イベントハンドラを追加します。
let home = document.querySelector('#home');
home.addEventListener('click',(event) => {
console.log('Home menu item was clicked');
});
let dashboard = document.querySelector('#dashboard');
dashboard.addEventListener('click',(event) => {
console.log('Dashboard menu item was clicked');
});
let report = document.querySelector('#report');
report.addEventListener('click',(event) => {
console.log('Report menu item was clicked');
});
Code language: JavaScript (javascript)
JavaScriptでは、ページに多数のイベントハンドラがあると、次の理由により、これらのイベントハンドラがパフォーマンスに直接影響します。
- 第一に、各イベントハンドラは、メモリを占有する関数であり、オブジェクトでもあります。メモリ内のオブジェクトが多いほど、パフォーマンスは低下します。
- 第二に、すべてのイベントハンドラを割り当てるには時間がかかり、ページのインタラクティブ性に遅延が生じます。
この問題を解決するには、イベントバブリングを活用できます。
複数のイベントハンドラを持つ代わりに、すべてのclick
イベントを処理する単一のイベントハンドラを割り当てることができます。
let menu = document.querySelector('#menu');
menu.addEventListener('click', (event) => {
let target = event.target;
switch(target.id) {
case 'home':
console.log('Home menu item was clicked');
break;
case 'dashboard':
console.log('Dashboard menu item was clicked');
break;
case 'report':
console.log('Report menu item was clicked');
break;
}
});
Code language: JavaScript (javascript)
仕組み
- IDが
menu
の<ul>
要素内の任意の<a>
要素をクリックすると、click
イベントは親要素である<ul>
要素にバブルアップします。そのため、個々の<a>
要素のclick
イベントを処理する代わりに、親要素でclick
イベントをキャプチャできます。 click
イベントリスナーでは、イベントをディスパッチする要素を参照するtarget
プロパティにアクセスできます。イベントが発生した要素のid
を取得するには、target.id
プロパティを使用します。click
イベントを発生させた要素のid
を取得したら、イベントを対応処理するコードを実行できます。
イベントハンドラが多すぎる問題を処理するこの方法を、イベント委任と呼びます。
イベント委任とは、イベントバブリングを使用して、イベントが発生した要素よりもDOMの上位レベルでイベントを処理する手法のことです。
JavaScriptイベント委任の利点
可能な場合は、document
に単一のイベントハンドラを設定して、特定のタイプのすべてのイベントを処理できます。これにより、次の利点が得られます。
- メモリ使用量の削減、パフォーマンスの向上。
- ページにイベントハンドラを設定するために必要な時間が短縮されます。
document
オブジェクトはすぐに使用できます。要素がレンダリングされるとすぐに、遅延なく正しく機能し始めます。DOMContentLoaded
イベントまたはload
イベントを待つ必要はありません。
まとめ
- 多数のイベントハンドラがあると、メモリが消費され、ページのパフォーマンスが低下します。
- イベント委任テクニックは、イベントバブリングを利用して、イベントが発生した要素よりもDOMの上位レベルでイベントを処理します。
このチュートリアルは役に立ちましたか?