5
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

el.querySelectorはセレクタに自身を含めて検索できる

Last updated at Posted at 2016-06-30

はじめに

あるDOM要素を起点に querySelector をして、その直下の要素だけを取得したいと思いました。
まずは、素直にこのように書いたのですが、これはエラーになったのでどうすればいいのかな?という話です。

var select = document.querySelector('select.foo');
// "> option" は CSS セレクタの構文として誤っており、エラーになる
select.querySelectorAll('> option');

結論

var select = document.querySelector('select.foo');

// 自身を含んだセレクタを記述できる
select.querySelectorAll('select.foo > option');

// また、ブラウザサポート範囲は不明だが :scope 擬似セレクタ
select.querySelectorAll(':scope > option');

検証

このような HTML を用意し、

<!DOCTYPE html>
<html>
  <body>
    <ul class="list1">
      <li class="item1">list1-item1</li>
    </ul>
    <ul class="list2">
      <li class="item1">list2-item1</li>
      <li class="item2">list2-item2</li>
    </ul>
  </body>
</html>

Chrome の Console で要素抽出をしてみる。

全体から .item1 を抽出:

document.querySelectorAll('.item1')
> [<li class=​"item1">​list1-item1​</li>​, <li class=​"item1">​list2-item1​</li>​]

.list1 を起点に .item1 を抽出:

document.querySelector('.list1').querySelectorAll('.item1')
> [<li class=​"item1">​list1-item1​</li>​]

.list1 を起点に .list1 .item1 を抽出:

document.querySelector('.list1').querySelectorAll('.list1 .item1')
> [<li class=​"item1">​list1-item1​</li>​]

.list1 を起点に :scope .item1 を抽出:

document.querySelector('.list1').querySelectorAll(':scope .item1')
> [<li class=​"item1">​list1-item1​</li>​]

.list1 を起点に .list2 .item1 を抽出:

document.querySelector('.list1').querySelectorAll('.list2 .item1')
> []

参考

5
6
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?