jQueryでHTMLの親要素を取得する方法をまとめました。

結論から書くと、直近の親だけなら .parent()、条件に合う祖先を1つ探すなら .closest()、祖先をすべて集めるなら .parents() を使います。実務でいちばん出番が多いのは .closest() です。

▼メソッドの使い分け

メソッド 取得するもの 自分自身 件数
.parent() 直近の親1つだけ 含まない 1件
.parents() 祖先すべて 含まない 複数
.closest() 条件に合う最も近い祖先1つ 含む 0〜1件
.parentsUntil() 指定要素の手前までの祖先 含まない 複数

以下、それぞれの挙動をコード付きで解説します。素のJavaScriptで同じことをする書き方も添えました。

要素の親を取得する方法

jQueryの.parent()メソッドを使用する方法

結論:.parent() は、対象の要素の直接の親要素だけを取得します。1つ上しか見ません。

<div class="container">
  <p>これは親要素を取得する例です。</p>
</div>
const childElement = $('.container p');
const parentElement = childElement.parent();

parentElementには<div class="container">が取得されます。

引数にセレクタを渡すと、直近の親がその条件に合うときだけ取得します。合わなければ空になります。

// 直近の親が .container のときだけ取得される
$('.container p').parent('.container');

jQueryの.parents()メソッドを使用する方法

結論:.parents() は、対象の要素のすべての祖先要素を取得します。html 要素まで遡ります。

<div class="grandparent">
  <div class="parent">
    <p>これは祖先要素を取得する例です。</p>
  </div>
</div>
const childElement = $('.parent p');
const ancestorElements = childElement.parents();

ancestorElementsには<div class="parent"><div class="grandparent">が、近い順に取得されます。実際にはさらに bodyhtml も含まれます。

絞り込みたい場合はセレクタを渡します。

// div の祖先だけに絞る
$('.parent p').parents('div');

条件に合う最も近い祖先を取得する

jQueryの.closest()メソッドを使用する方法

結論:.closest() は、条件に合う祖先のうち最も近いものを1つだけ取得します。見つかった時点で遡るのをやめます。

.parents() との違いは2つあります。取得件数が最大1件であることと、自分自身も判定の対象に含まれることです。

<ul class="list">
  <li class="item">
    <button class="delete">削除</button>
  </li>
</ul>
$('.delete').on('click', function () {
  // 押されたボタンが属する li だけを消す
  $(this).closest('.item').remove();
});

クリックされた要素から、対応する行や項目を辿るというのは非常によくある処理です。この用途では .parents('.item').first() と書くより .closest('.item') のほうが速く、意図も明確になります。

自分自身が条件に合う場合は、自分自身が返ります。

// .item 自身をクリックしたら、その .item が返る
$('.item').closest('.item'); // → .item 自身

要素の祖先を絞り込む方法

jQueryの.parentsUntil()メソッドを使用する方法

結論:.parentsUntil() は、指定した要素に達する手前までの祖先要素を取得します。指定した要素そのものは結果に含まれません。

<div class="grandparent">
  <div class="parent">
    <p>これは祖先要素を絞り込む例です。</p>
  </div>
  <div class="uncle">
    <p>別の親族要素</p>
  </div>
</div>
const childElement = $('.uncle p');
const ancestorElements = childElement.parentsUntil('.grandparent');

ancestorElementsには<div class="uncle">が取得されます。.uncle p から遡った経路にあるのは .uncle で、その次の .grandparent は停止条件なので含まれません。

取得されるのは「その要素から実際に遡った経路上の祖先」だけです。同じ階層にある別の要素(この例の .parent)は経路上にないため含まれません。ここは間違えやすいところなので、遡る道筋を意識して使ってください。

素のJavaScriptで同じことをする

結論:親要素の取得は、jQueryを読み込まなくても標準のDOM APIでできます。.closest() は同じ名前のメソッドがそのまま使えます。

▼jQueryと素のJavaScriptの対応

jQuery 素のJavaScript
$(el).parent() el.parentElement
$(el).closest('.item') el.closest('.item')
$(el).parents() ループで parentElement を辿る
$(el).parents('div') 同上+matches('div') で絞る

先ほどのボタンの例を素のJavaScriptで書くとこうなります。

document.querySelectorAll('.delete').forEach((button) => {
  button.addEventListener('click', () => {
    button.closest('.item').remove();
  });
});

closest() はすべての主要ブラウザが対応しています。親要素を辿るためだけにjQueryを読み込む必要はありません。

祖先をすべて集めたい場合は、ループで遡ります。

function getParents(el) {
  const result = [];
  let current = el.parentElement;
  while (current) {
    result.push(current);
    current = current.parentElement;
  }
  return result;
}

parentElementparentNode は似ていますが、parentNode は要素以外(ドキュメント自体など)も返します。要素だけを辿りたいなら parentElement を使ってください。

どれを使うか迷ったときの判断

結論:「クリックされた要素から親のブロックを探す」なら .closest() です。この用途が全体の大半を占めます。

.parents() は祖先を全部集めるので、そこから .first() で1つ取り出す書き方をよく見かけますが、無駄に全部を辿っています。.closest() なら見つかった時点で止まるため、深い階層ほど差が出ます。

一方で .parent() は、1つ上と決まっている場合に使います。セレクタで条件を書かない分、構造が変わったときに壊れやすいので、階層が変わりうる場所では .closest() のほうが安全です。

jQueryの他の使い方は、jQueryでドロップダウンメニューを実装する5つの方法CSSとjQueryでアコーディオンを実装するでも扱っています。どちらも .closest().children() で要素を辿る処理が出てきます。

HTML/CSS/JavaScriptを基礎から固めたい場合は、Webコーディングにオススメの学習本に学習順をまとめています。

ABOUT ME
りん
このブログでは、Web開発やプログラミングに関する情報を中心に、私が日々感じたことや学んだことをシェアしています。技術と生活の両方を楽しめるブログを目指して、日常で触れた出来事や本、グルメの話題も取り入れています。気軽に覗いて、少しでも役立つ情報や楽しいひとときを見つけてもらえたら嬉しいです。