jQueryでは豊富なセレクタと走査(traversal)メソッドを使って、特定条件に合う要素を柔軟に選択できます。本記事では基本セレクタ・属性セレクタ・フィルタ・親子兄弟の走査まで体系的に解説します。
この記事でわかること
- 全要素・特定タグ・クラス・IDで選択する基本
- 属性セレクタ・擬似クラスを使った絞り込み
- find()・children()・parent()などの走査メソッド
- filter()・not()によるフィルタリング
- パフォーマンスを考慮したセレクタの書き方
1. 基本セレクタ
// 全要素(非推奨: パフォーマンス低下)
var $all = $('*');
// タグ名で取得
var $divs = $('div');
var $links = $('a');
// クラスで取得
var $items = $('.list-item');
// IDで取得(ページ内で一意)
var $header = $('#site-header');
// タグ+クラスの組み合わせ
var $btns = $('button.primary-btn');
// 複数セレクタ(カンマ区切り)
var $mixed = $('h1, h2, h3');
// 子孫(スペース区切り)
var $navLinks = $('nav a'); // nav内の全aタグ
// 直接の子(>)
var $directChildren = $('ul > li'); // ulの直下のliのみ
2. 属性セレクタ
// 属性が存在する要素
$('[disabled]') // disabled属性を持つ全要素
$('[data-id]') // data-id属性を持つ全要素
// 属性値が一致
$('[type="text"]') // type='text'のinput等
$('[name="email"]') // name='email'
// 属性値が前方一致
$('[href^="https"]') // https://... のリンク
$('[src^="/images/"]') // /images/で始まるsrc
// 属性値が後方一致
$('[href$=".pdf"]') // .pdfで終わるリンク
// 属性値を含む
$('[class*="btn"]') // クラスに'btn'を含む
3. 擬似クラスセレクタ
// 状態による絞り込み
$(':'checked') // チェック済み
$(':'disabled') // 無効化された要素
$(':'visible') // 表示されている要素
$(':'hidden') // 非表示の要素
// 位置による絞り込み
$('li:first') // 最初のli(first()と同じ)
$('li:last') // 最後のli
$('li:even') // 偶数番目(0始まり)
$('li:odd') // 奇数番目
$('li:nth-child(3)') // 3番目の子要素
// テキスト内容
$(':contains("検索語")') // テキストを含む要素
$('input:not(:checked)') // チェックされていないinput
4. DOM走査メソッド
// 子孫を検索
$('#container').find('.item') // #container内の全.item
$('#container').find('a') // #container内の全リンク
// 直接の子要素
$('ul').children() // ulの直接の子要素全て
$('ul').children('li.active') // フィルタ付き
// 親要素
$(this).parent() // 直接の親
$(this).parents('.wrapper') // 祖先の中で.wrapperを全部
$(this).closest('.card') // 最も近い祖先の.card(自分を含む)
// 兄弟要素
$(this).siblings() // 同階層の全兄弟
$(this).siblings('.active') // フィルタ付き
$(this).next() // 次の兄弟
$(this).prev() // 前の兄弟
$(this).nextAll() // 後の全兄弟
$(this).prevAll() // 前の全兄弟
closest()はパフォーマンスが優れている
parents() は全祖先を検索しますが、closest() は最初にマッチした祖先で止まります。特定の祖先を1つだけ取得したい場合は closest() を使ってください。5. filter()とnot()でフィルタリング
// filter(): 条件に合う要素だけ残す
$('li').filter('.active') // .activeクラスを持つliのみ
$('input').filter('[type="text"]') // type='text'のinputのみ
// filter()に関数を渡す
$('li').filter(function () {
return $(this).text().length > 10; // テキストが10文字超の要素
});
// not(): 条件に合う要素を除外
$('input').not('[type="submit"]') // submitボタン以外のinput
$('li').not('.disabled') // .disabledでないli
$('li').not(':first') // 最初のliを除く全て
6. パフォーマンスを考慮したセレクタ
// △ 遅い: 全要素から検索
$('.item a');
// ◯ 速い: コンテキストを絞る
$('a', '#container'); // #container内のみ検索
$('#container').find('a'); // 同上(こちらが推奨)
// △ 遅い: セレクタが複雑
$('div:not(.skip):visible:first');
// ◯ 速い: まず基本セレクタで取得してからフィルタ
$('div').not('.skip').filter(':visible').first();
// △ IDより遅い
$('.unique-class');
// ◯ IDが使える場合はIDを使う(最速)
$('#unique-id');
まとめ
jQueryのセレクタは CSS セレクタに加え、擬似クラス・属性セレクタ・走査メソッドなど多彩です。パフォーマンスを意識するなら find() でスコープを絞り、IDセレクタを優先し、複雑なセレクタはメソッドチェーンで段階的に絞り込みましょう。
関連記事: jQueryのeach()でループ処理を行う方法 / jQueryのeq()で要素の順番を指定して選択する方法
よくある質問(FAQ)
Q特定のクラスを持つ全ての要素を取得するには?
A
$(".class-name") で全要素を取得できます。特定コンテナ内のみ対象にするには $("#container").find(".class-name") を使ってください。Qclosest()とparents()の違いは?
A
closest() は自分自身から上へ向かって最初にマッチした要素を1つ返します。parents() はマッチする全祖先を返します。1つだけ必要な場合は closest() の方が高速です。Q非表示の要素を含めて全要素を取得するには?
AjQueryのセレクタは非表示要素も取得します。表示中の要素のみに絞るには
:visible、非表示のみは :hidden フィルタを使います。Q動的に追加した要素もセレクタで取得できますか?
Aはい。セレクタはその時点でDOMに存在する要素を検索します。動的追加後に取得する場合はイベントハンドラー内や追加後のタイミングで取得してください。
Qテキストを含む要素を取得するには?
A
$(':contains("検索語")')} でテキスト内容で絞り込みができます。大文字小文字を区別する点に注意してください。