[jQuery] find()とchildren()の使い分け
スポンサーリンク
jQueryのメソッドfind()とchildren()は、ともに指定した要素が持つ子要素を取得するためのものですが、children()が直下の要素だけを取得するのに対し、find()は全ての子要素を探索するという違いがあります。両者の違いと使い方についてまとめました。
//html example <div> <dl> <dt>カテゴリー</dt> <dd><a href="./foo.html">foo</a></dd> <dd><a href="./bar.html">bar</a></dd> <dd><a href="./hoge.html">hoge</a></dd> </dl> </div>
find()は強力な検索機能を持っています。例えば上のhtmlのdivの中から、一番最後のリンク先を取得したい場合、このようなコードで可能になります。
var a = $("div").find("dd:last>a").attr("href");
find('dd:last>a')
で、一番最後にあるddの直下のa要素を選択しています。目的の要素がどれだけ深い位置にあり、入り組んだhtmlとなっていても、find()
で正しく指定すれば1行のコードで事足ります。
children()はfind()のようなことはできません。children()は直下の要素しか取得できませんので、find()で行ったのと同じ事をするには、下のような冗長なコードになってしまいます。
var a = $("div").children().children('dd:last').children().attr("href");
そのかわりchildren()は、直下の要素だけをまとめて取得したい場合に重宝します。
<ul> <li>8581</li> <li>2290</li> <li>324</li> <li>1292</li> <li>9823</li> </ul>
例えばこのようなリストがあり、数字をすべて足したいとすると、children()を使った以下のようなコードが考えられます。
//ulをクリックでリスト中のすべての数値を加算 $("ul").click(function(){ var obj = $(this).children(); num = 0; for( var i=0;i<obj.length;i++ ){ num += parseInt( obj.eq(i).text() ); } alert( num );//22310 });
ちなみに上の例ですと、$(this).children()
の部分を$(this).find('li')
にすると同じことができるのですが、find()だと今度は下のような場合に異なった値となります。
<ul> <li>8581</li> <li>2290</li> <li>324 <ul> <li>5329</li> <li>231</li> <li>2111</li> </ul> </li> <li>1292</li> <li>9823</li> </ul> <script> //ulをクリックでリスト中のすべての数値を加算 $("ul").click(function(){ //children版 var obj = $(this).children(); num = 0; for( var i=0;i<obj.length;i++ ){ num += parseInt( obj.eq(i).text() ); } alert( num );//22310になる //find版 var obj = $(this).find('li'); num = 0; for( var i=0;i<obj.length;i++ ){ num += parseInt( obj.eq(i).text() ); } alert( num );//29881になる }); </script>
リストの中に入れ子で別のリストがあるのですが、children()の場合は、外側の<ul>直下の<li>内の数値だけを加算しているのですが、find()は全ての<li>内の数値を加算しています。
ということで、直下の要素に限定して取得したい場合には、find()よりchildren()の方が良いでしょう。
スポンサーリンク
jQueryカテゴリーの投稿
- [jQuery] $.ajaxのコールバック関数にcontextで値を渡す
- [jQuery] 文字列が含まれているかどうかの判定
- [jQuery] rowspanを持つtableで行の表示・非表示を切り替える
- jQueryとPHPでAJAX通信を行う
- [jQuery] $('form').change()でフォーム全体の変更を監視する
- [jQuery] 属性が存在するかどうかチェックするコード
- [JS][jQuery] 要素の存在を確認する6通りのコードと実行速度
- [jQuery] tableの内容を取得する
- [jQuery] clone()で操作対象のエレメントを元の位置に保つ
- [jQuery] index()でクリックされたhtml要素が何番目の要素かを知る