アイコンWeb制作実験

HTML/CSS/jQuery/Fabric.js
を試した様子と結果です.

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を探し. それを含むセレクタのクラスを切り替える。
という処理です。

divpなどに替えればそれらを含むセレクタが選ばれます。

hasメソッドで指定した子孫要素(下の全ての階層)を含む(持つ)要素を絞る(探す)ことができました。