jQueryで子孫要素(下の全ての階層)を含む要素を絞る - has

公開:2015-02-22
更新:
jQueryのhasメソッドで要素を絞り込む様子です。以下で構成した基本構造のどの親・子・兄弟要素が選択されたか、ボタンのOn/Offで一目でわかります。
- boxA 赤
- boxB 青
- boxC 緑
- boxD 紫
[実行する]ボタンを押すと適合した要素のborderが濃い赤になります。
boxAの中からhasで絞る
$('.boxA').has('div')を
boxAの文
boxBの文
boxCの文
boxDの文
- リストD1
- リストD2
- リストA1
- リストA2
$('.boxA').has('p')を
boxAの文
boxBの文
boxCの文
boxDの文
- リストD1
- リストD2
- リストA1
- リストA2
$('.boxA').has('span')を
boxAの文
boxBの文
boxCの文
boxDの文
- リストD1
- リストD2
- リストA1
- リストA2
$('.boxD').has('ul')を
boxAの文
boxBの文
boxCの文
boxDの文
- リストD1
- リストD2
- リストA1
- リストA2
has('~')の引数で指定した要素を階層構造の下まで探し、それらを含むセレクタ([1] [2]の場合はboxA、[4]はboxD)が選ばれました。
[3]はspanが含まれていないため選択(実行)されませんでした。
セレクタ自身は含むか
セレクタそのものに適合する引数を渡した際に、セレクタそのものが選択されるか否か試してみます。boxDの中にはdivはなく、もしセレクタそのものが選択されるのであればboxDのborderは赤くなるはずです。
$('.boxD').has('div')を
boxAの文
boxBの文
boxCの文
boxDの文
- リストD1
- リストD2
- リストA1
- リストA2
セレクタそのものは含みませんでした。
おおまかなコードとhasのまとめ
上をかなり大雑把に書くと以下のようになります。
<input type="button" value="実行する"> <div class="boxA"> <div class="boxB"> ・・・ </div> </div>
.boxB { border-width: 5px; border-style: solid; border-color: #9cf; /* 水色 */ } .selected { border-color: red; }
$('input').click(function(){ $('.boxA').has('div').toggleClass('selected'); });
(見やすくするためにCSSは上記以外に多少の装飾をしています。また、HTML/CSS/jQueryで実際はこのページ用に複雑な処理をしています。)
CSSでborderを赤くするクラスを用意し、jQueryは
1行目:ボタンをクリックすると、
2行目:boxAの中から. divを探し. それを含むセレクタのクラスを切り替える。
という処理です。
divをpなどに替えればそれらを含むセレクタが選ばれます。
hasメソッドで指定した子孫要素(下の全ての階層)を含む(持つ)要素を絞る(探す)ことができました。