closest で親要素を探す
closest メソッドは、ある要素から親方向にたどって、指定したセレクタにマッチする最も近い祖先要素を取得します。イベント処理でとても重宝するメソッドです。
基本的な使い方
element.closest(selector) で、その要素自身も含めて親方向に探索します。
<div class="container">
<div class="box">
<button id="btn">クリック</button>
</div>
</div>const btn = document.getElementById('btn');
// 親方向に .box を探す
const box = btn.closest('.box');
console.log(box); // div.box
// 親方向に .container を探す
const container = btn.closest('.container');
console.log(container); // div.container自分自身もチェック対象
closest は自分自身もチェックします。
const box = document.querySelector('.box');
const result = box.closest('.box');
console.log(result === box); // true(自分自身がマッチ)見つからない場合
マッチする要素がなければ null が返ります。
const btn = document.getElementById('btn');
const table = btn.closest('table');
console.log(table); // null(親に table がない)イベント委譲での活用
closest が最も活躍するのはイベント委譲のパターンです。
HTML
CSS
JavaScript
<ul id="list">
<li>項目1 <button class="delete">削除</button></li>
<li>項目2 <button class="delete">削除</button></li>
<li>項目3 <button class="delete">削除</button></li>
</ul>document.getElementById('list').addEventListener('click', function(e) {
if (e.target.closest('.delete')) {
const li = e.target.closest('li');
li.remove();
}
});クリックされた要素から closest で親の li を探し、それを削除しています。これにより、後から追加された要素にも自動的にイベントが適用されます。
closest と parentNode の違い
closest
CSS セレクタで探せる。自分自身も含む。見つからなければ null
parentNode
直接の親のみ取得。セレクタは使えない。常に1つ上の親だけ
特定の条件を満たす親要素を探すなら closest のほうが便利です。