jQueryで最速のchildren()またはfind()とは何ですか?


320

jQueryで子ノードを選択するには、children()だけでなくfind()も使用できます。

例えば:

$(this).children('.foo');

同じ結果が得られます:

$(this).find('.foo');

さて、どのオプションが最速または優先されますか、そしてその理由は?


27
.find().children()同じではありません。後者は、子セレクターのように、DOMツリーの単一レベルだけを移動します。
Timothy003

1
@ Timothy003あなたはそれを間違って説明しました、前者は後者ではなく単一レベルを下ります
Dipesh Rana

5
@DipeshRanaは、質問ではなく、Timothy003自身の文に適用された「後半」です。
Jayesh Bhoot、2015年

1
この問題を提起してくれてありがとう。多くの場合、パフォーマンスの違いは取るに足らないものですが、ドキュメントには、これら2つのメソッドの実装方法が異なることは実際には記載されていません。ベストプラクティスのために、find()ほぼ常に高速であることを知っておくとよいでしょう。
スティーブベナー

ですから、私は英語で「前者」や「後者」の構文を好きになりませんでした。どちらを意味するか言ってください。シーッシュ。
クリスウォーカー

回答:


415

children()ノードの直接の子を見てのみ、一方でfind()ノードの下横断全体DOM、そうchildren() すべきであるより速く与えられたと同等の実装可能。しかし、find()使用してネイティブながら、ブラウザのメソッドをchildren()使用のJavaScriptがブラウザで解釈。私の実験では、一般的なケースではパフォーマンスに大きな違いはありません。

どちらを使用するかは、直接の子孫のみを考慮するか、DOM内のこのノードの下にあるすべてのノードを考慮するかによって異なります。つまり、メソッドの速度ではなく、希望する結果に基づいて適切なメソッドを選択します。パフォーマンスが本当に問題である場合は、実験を行って最適なソリューションを見つけ、それを使用してください(または、ここにある他の回答のベンチマークのいくつかを参照してください)。


9
もちろん、親要素に子ノードしかない場合はどうなりますか?これについていくつかのプロファイリングを行います。
ジェイソン

11
子と検索のパフォーマンスは、ブラウザと、DOMサブツリーが検索する複雑さによって異なります。最近のブラウザーでは、find()は内部的にquerySelectorAllを使用します。これは、複雑なセレクターや小規模から中程度のDOMサブツリーで、children()よりも簡単にパフォーマンスを上げることができます。
LeJared

あなたの実験のいくつかの定量的な結果を提供するのに役立ちます。
ルーク

5〜20の階層のネストがあるすべてのテストで、find()は常にchildren()よりも優れていました。(Google Chrome 54でテスト済み)私は反対を期待していました。。。だから、)(子供を経由してそれらを横断する私の要素の代わりに(...)今、私は簡単な方法を取ると見つけることができますから、子供()子供()...
Ruwen

179

このjsPerfテストは、find()の方が高速であることを示唆しています。私はより徹底的なテストを作成しました、find()がchildren()よりも優れているように見えます。

更新: tvanfossonのコメントに従って、16レベルのネストを持つ別のテストケースを作成しました。find()はすべての可能なdivを見つけるときにのみ遅くなりますが、find()は、divの最初のレベルを選択するとき、children()よりも優れています。

children()は、ネストのレベルが100を超え、find()がトラバースする約4,000以上のdivがある場合、find()よりも優れたパフォーマンスを示します。これは初歩的なテストケースですが、ほとんどの場合、find()はchildren()よりも速いと私は思います。

ChromeデベロッパーツールでjQueryコードをステップ実行したところ、children()が内部でsibling()、filter()を呼び出し、find()が実行するよりもいくつかの正規表現を使用していることに気付きました。

find()とchildren()は異なるニーズを満たしますが、find()とchildren()が同じ結果を出力する場合は、find()の使用をお勧めします。


4
子供はdomトラバーサルメソッドを使用し、findはより高速なセレクターapiを使用しているようです。
topek

4
ネストのレベルが1つしかないため、かなり縮退したテストケースです。一般的なケースが必要な場合は、任意のネストの深さを設定し、find()がchildren()よりも深いツリーをトラバースするときにパフォーマンスを確認する必要があります。
tvanfosson 2011年

特定の単一の子要素(たとえば、event.target)が特定のdom要素(たとえば、$( '。navbar'))にあるかどうかを確認している場合、$。contains(this、event.target)が断然最速です(8,433,609 /秒vs最速のjquery検索の140k)。 jsperf.com/child-is-in-parent
Chris Sattinger、2015

92

実行できるパフォーマンステストがあるリンクを次に示します。find()実際にはの約2倍高速ですchildren()

OSX10.7.6上のChrome


$ .contains(document.getElementById( 'list')、$( '。test')[0])は8,433,609 /秒です。特定の要素があり、BがAにあるかどうかを知りたいだけなら、これが最適です。jsperf.com/child-is-in-parent
Chris Sattinger、2015

いいテストだ。var $test = $list.find('.test');$ listがjQueryオブジェクトであるようなものを実行すると、さらに高速になる可能性があることに注意してください。jsperf.com/jquery-selectors-context/101
Maciej Krawczyk

24

それらは必ずしも同じ結果が得られません。find()あなたに取得する子孫ノードを、一方children()だけあなたを取得します直接の子を一致していること。

ある時点でfind()は、直接の子だけでなく、一致する可能性のあるすべての子孫ノードを検索する必要があったため、処理速度が大幅に低下しました。ただし、これはもはや正しくありません。find()ネイティブブラウザメソッドを使用しているため、はるかに高速です。


1
他の回答によると、笑:p。あなたが非常に、非常に、非常に大きなDOMツリーを持っているときだけ..
pgarciacamou 2014年

1
@Camouこの回答は4歳です。find()当時ははるかに低速でした!
John Feminella、2014年

@camouは、パフォーマンスの部分は「他の回答によらない」と言っています。この回答の最初の段落は正確です。
Don Cheadle

14

他の回答のいずれも使用した場合について述べていない.children()か、.find(">")するだけで、親要素の直下の子を検索します。それで、私は子供を区別する3つの異なる方法を使用して、を見つけるためのjsPerfテストを作成しました。

偶然にも、余分な「>」セレクタを用いた場合であっても、.find()まだたくさんより速いです.children()。私のシステムでは10倍です。

ですから、私の見方では、のフィルタリングメカニズムを使用する理由はまったくないよう.children()です。


3
このコメントをありがとう!jQueryは、.children(x)を.find( ">" + x)のエイリアスにするように切り替えるべきかどうか疑問に思いますが、おそらく私が考えていない他の複雑化があります。
マイケルスコットカスバート

1
これは最も適切な比較のようです。ありがとう!
GollyJer

3

find()children()メソッドの両方を使用して、一致する要素の子をフィルタリングします。ただし、前者は任意のレベルの下位に移動し、後者は単一のレベルの下位に移動します。

簡略化するには:

  1. find() –一致した要素の子、孫、ひ孫の検索...すべてのレベルまで
  2. children() –一致した要素の子のみを検索します(1レベル下)。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.