| この記事の要点 |
|
.find() の基本
jQuery .find() は、マッチした要素の子孫からセレクタに一致する要素を抽出します。直下の子のみではなく、孫・ひ孫まで深く探索します。
<div id="wrap">
<p>直下の段落</p>
<section>
<p>セクション内の段落</p>
<article>
<p>記事内の段落</p>
</article>
</section>
</div>// 子孫すべての p
$('#wrap').find('p').length; // → 3
// 直下の p のみ
$('#wrap').children('p').length; // → 1
// セレクタ必須 (省略すると空)
$('#wrap').find(); // → 空オブジェクト
.find() vs .children() vs .closest()
| メソッド | 方向 | 対象 | 用途例 |
|---|---|---|---|
.find(s) | 下向き | 子孫全要素 | 表内の全 input を集める |
.children(s) | 下向き | 直下の子のみ | リストの件数カウント |
.closest(s) | 上向き | 自身含む最も近い祖先 | クリックされた行の tr 特定 |
.parents(s) | 上向き | 祖先すべて | 祖先の form をすべて取る |
.siblings(s) | 横方向 | 兄弟要素 | 選択肢の他を非アクティブ化 |
複数セレクタとフィルタ
// カンマで複数指定
$('#form').find('input, select, textarea');
// 属性セレクタ
$('table').find('[data-id]');
// :checkbox / :radio / :hidden / :visible
$('form').find(':checkbox:checked');
// jQuery オブジェクトを引数に取れる
const $targets = $('.item');
$('#wrap').find($targets); // wrap 配下の .item
// DOM 要素も渡せる
$('#wrap').find(document.querySelector('.target'));
典型的なユースケース
1. テーブル全行の値を集計
const total = $('#cart').find('.price').toArray()
.map(el => parseInt($(el).text(), 10))
.reduce((a, b) => a + b, 0);
$('#total').text(total.toLocaleString());
2. 動的に挿入した要素にも対応
$('#chat').on('messageAdded', function() {
// 最新追加分を含めて取り直す
$(this).find('.message').addClass('animated fadeIn');
});
// イベント委譲 (find したのと同じ要素群に効く)
$('#chat').on('click', '.message', function() {
$(this).toggleClass('selected');
});
3. フォーム内の全入力値を取得
const $form = $('#myForm');
const data = {};
$form.find(':input').each(function() {
data[this.name] = $(this).val();
});
// または serializeArray
const data2 = $form.serializeArray();
生 DOM API での同等処理
const wrap = document.getElementById('wrap');
// 子孫全件 (find 相当)
wrap.querySelectorAll('p'); // 3 件
wrap.querySelectorAll('input, select');
// 1 件目だけ (find().first() 相当)
wrap.querySelector('.first-item');
// closest (祖先方向)
document.querySelector('.btn').closest('form');
// :scope で「自身から見て」を明示
wrap.querySelectorAll(':scope > p'); // 直下のみ
wrap.querySelectorAll(':scope > * > p'); // 孫のみ
// matches で自身がセレクタにマッチするか確認
wrap.matches('.parent'); // boolean
パフォーマンスと最適化
| パターン | 速度 | 備考 |
|---|---|---|
$("#a .b") | 速い | jQuery 内部で Sizzle / querySelectorAll |
$("#a").find(".b") | 同等〜速い | キャッシュ済の親があれば再利用しやすい |
$(".b", "#a") | 遅い | 古い書き方、内部で find に変換される |
el.querySelectorAll(".b") | 最速 | ネイティブ |
| 自前 for ループ | 最遅 | JS 側で再帰探索すると桁違いに遅い |
大量の DOM に対して何度も検索するなら、結果をキャッシュして再利用するのが基本です。
// ❌ 毎回探す
$('#tbl').find('tr').each(function() {
$('#tbl').find('tr').first().addClass('header'); // ループ内で再検索
});
// ✅ キャッシュ
const $rows = $('#tbl').find('tr');
$rows.first().addClass('header');
$rows.slice(1).addClass('body');
現代の DOM 選択 API
| jQuery | ネイティブ |
|---|---|
$(sel).find(s) | el.querySelectorAll(s) |
$(sel).children(s) | el.querySelectorAll(":scope > " + s) |
$(sel).closest(s) | el.closest(s) |
$(sel).parent() | el.parentElement |
$(sel).is(s) | el.matches(s) |
FAQ
Q: .find() は自身を含む?
A: 含みません。自身も対象にしたい場合は .find('selector').addBack() や .add('selector')。
Q: .find() で複数の結果が来たときに 1 件だけ欲しい
A: .first() / .eq(0) / .last() / .eq(-1) でフィルタ。
Q: ネイティブ querySelectorAll とどちらを使う?
A: 新規開発ならネイティブ推奨。jQuery 既存コードを保守するなら統一感のため .find() を使い続けます。
子ページ
子ページはありません
同階層のページ
- .find()
- .children()
- .eq()
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- Git pushした変更の取消し|revert・履歴変更と保護の注意点 2026-10-15 23:49:01
- Gitでローカルを戻す前に|reset・restoreの違いと退避範囲 2026-10-15 23:49:01
- Git rebaseの使い方|対象範囲・競合解決・pushの判断 2026-10-15 22:50:59
- Git pullの使い方|取込み先・ff-only・競合とstashの注意点 2026-10-15 22:50:59
- Git pushの使い方|送信先・タグ・force-with-leaseの条件 2026-10-15 22:12:47
- Git remoteの設定・確認・削除|SSH URLとfetch/pushの違い 2026-10-15 22:12:47
- Gitリモートリポジトリの作成|初回push・既存履歴・mirrorの注意 2026-10-15 15:48:16
- Gitのuser.name・user.email設定|local/global・確認と過去履歴の注意 2026-10-15 15:30:07
- LinuxにGitをインストール|配布元・初期設定・TLSと認証の確認 2026-10-15 15:30:06
- Git導入と初回push|Linuxサーバー・Windows/macOS・SSH設定 2026-10-15 14:51:54
- Db2のCREATE INDEX|索引定義・INCLUDEと実行計画の確認 2026-10-15 14:10:22
- Db2の自動採番|IDENTITY・ID取得とRESTARTの注意点 2026-10-15 14:10:22
- 【DB2】特定スキーマの全テーブルの全カラム情報を取得する方法 2026-10-15 13:53:15
- Db2のシーケンスとIDENTITYの違い|採番とカタログの確認SQL 2026-10-15 13:53:15
- Db2で複数カラムをUPDATEする方法|SET・WHEREと更新前の値 2026-10-15 13:53:15