言語
日本語
English

Caution

お使いのブラウザはJavaScriptが無効になっております。
当サイトでは検索などの処理にJavaScriptを使用しています。
より快適にご利用頂くため、JavaScriptを有効にしたうえで当サイトを閲覧することをお勧めいたします。

JavaScript辞典

  1. トップページ
  2. JavaScript辞典
  3. イベントオブジェクト.target / currentTarget

イベントオブジェクト.target / currentTarget

対応: DOM Level 2(2000)

イベントオブジェクトのプロパティで、イベントが発生したHTML要素やイベントの種類を取得できます。イベントリスナーのコールバック関数に渡されるイベントオブジェクトから参照します。

構文

element.addEventListener("イベント名", function(e) {
	e.target;        // イベントが実際に発生したHTML要素
	e.currentTarget; // イベントリスナーが登録されているHTML要素
	e.type;          // イベントの種類
});

プロパティ一覧

プロパティ概要
event.targetイベントが実際に発生したHTML要素を返します。クリックされたHTML要素そのものが返されるため、子要素がクリックされた場合はその子要素になります。
event.currentTargetイベントリスナーが登録されているHTML要素を返します。イベントがバブリングしても常にリスナーが登録されたHTML要素が返されます。
event.type発生したイベントの種類を文字列で返します。『click』『input』『submit』などの値が返されます。

サンプルコード

sample_eventTarget.html
<div id="container">
	<button id="btn"><span>クリック</span></button>
</div>
<p id="output"></p>
<ul id="fighter-list">
	<li data-fighter="iori"><span>八神庵</span></li>
	<li data-fighter="kyo"><span>草薙京</span></li>
	<li data-fighter="terry"><span>テリー・ボガード</span></li>
</ul>
<form id="login-form">
	<input type="text" name="username" placeholder="ユーザー名">
	<button type="submit">ログイン</button>
</form>
sample_eventTarget.js
// パターン1: e.target / e.currentTarget / e.type の基本
var container = document.getElementById("container");
var output = document.getElementById("output");
container.addEventListener("click", function(e) {
	console.log("target: " + e.target.tagName);         // 実際にクリックされた要素
	console.log("currentTarget: " + e.currentTarget.tagName); // リスナー登録先
	console.log("type: " + e.type);                     // 『click』と出力されます。
	output.textContent = "target=" + e.target.tagName + ", currentTarget=" + e.currentTarget.tagName;
});
// span をクリックした場合: target=SPAN, currentTarget=DIV

// パターン2: e.target を使ったイベント委任(動的HTML要素にも対応)
var fighterList = document.getElementById("fighter-list");
fighterList.addEventListener("click", function(e) {
	// クリックされた要素がliでなくその中のspanであっても、closest()でliを取得します。
	var li = e.target.closest("li");
	if (!li) { return; }
	console.log("選択: " + li.getAttribute("data-fighter"));
	// 「iori」「kyo」「terry」のいずれかが出力されます。
});

// パターン3: フォーム送信でe.targetからフォームデータを取得する
var form = document.getElementById("login-form");
form.addEventListener("submit", function(e) {
	e.preventDefault(); // ページ遷移を防ぎます。
	var username = e.target.querySelector("[name='username']").value;
	console.log("ログイン試行: " + username);
	console.log("フォームのid: " + e.currentTarget.id); // 『login-form』と出力されます。
});

サンプルページはこちら

実行結果

ボタン内の『<span>』部分をクリックした場合、『target』は実際にクリックされた『<span>』になりますが、『currentTarget』はリスナーが登録された『<div>』になります。

// <span>をクリックした場合
target: SPAN            // 実際にクリックされたHTML要素
currentTarget: DIV      // リスナーが登録されたHTML要素
type: click             // イベントの種類
<p id="output">target=SPAN, currentTarget=DIV</p>

概要

『event.target』と『event.currentTarget』の違いは、イベントのバブリング(子要素から親要素への伝播)を理解すると明確になります。子要素がクリックされたとき、イベントは子要素から親要素へと伝わります。このとき『event.target』は実際にクリックされた子要素を指し、『event.currentTarget』はリスナーが登録された親要素を指します。

イベント委任のパターンでは、親要素にリスナーを登録しておき、『event.target』でクリックされた子要素を判別して処理を分岐します。この手法は『HTML要素.closest()』と組み合わせるとさらに強力で、動的に追加されたHTML要素にも対応できます。

『event.type』は1つの関数で複数のイベントを処理する場合に便利です。例えば『mouseover』と『mouseout』を同じ関数で処理し、『event.type』の値に応じて処理を分岐するといった使い方ができます。

対応ブラウザ

Chrome Chrome
49 以降
Firefox Firefox
57 以降
Safari Safari
18 以降
Edge Edge
80 以降
11 以前 ×
IE IE
11 以降
8 以前 ×
Opera Opera
48 以降
6 以前 ×
iOS Safari iOS Safari
18 以降
Android Browser Android Browser
37 以降
4 以前 ×
Chrome Android Chrome Android
36 以降
17 以前 ×
Firefox Android Firefox Android
79 以降
3 以前 ×

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。