jQuery で子ノードを選択するには、children() だけでなく find() も使用できます。
例えば:
$(this).children('.foo');
次と同じ結果が得られます。
$(this).find('.foo');
では、どのオプションが最速または優先され、その理由は?
jQuery で子ノードを選択するには、children() だけでなく find() も使用できます。
例えば:
$(this).children('.foo');
次と同じ結果が得られます。
$(this).find('.foo');
では、どのオプションが最速または優先され、その理由は?
children()
ノードの直下の子のみを調べ、ノードのfind()
下の DOM 全体をトラバースするため、同等の実装を考えると高速になるchildren()
はずです。ただし、ブラウザで解釈されるJavaScriptfind()
を使用しながら、ネイティブブラウザ メソッドをchildren()
使用します。私の実験では、典型的なケースではパフォーマンスに大きな違いはありません。
どちらを使用するかは、直下の子孫のみを考慮するか、DOM 内のこのノードより下のすべてのノードを考慮するかによって異なります。つまり、メソッドの速度ではなく、必要な結果に基づいて適切なメソッドを選択します。パフォーマンスが本当に問題である場合は、実験して最適な解決策を見つけ、それを使用してください (または、ここで他の回答のベンチマークの一部を参照してください)。
このjsPerfテストは、find()の方が高速であることを示しています。より徹底的なテストを作成しましたが、それでもfind()がchildren()よりも優れているように見えます。
更新: tvanfossonのコメントに従って、16レベルのネストを使用して別のテストケースを作成しました。find()は、可能なすべてのdivを検索する場合にのみ遅くなりますが、最初のレベルのdivを選択する場合は、find()の方がchildren()よりも優れています。
ネストのレベルが100を超え、find()がトラバースするdivが約4000以上になると、children()はfind()よりもパフォーマンスが向上し始めます。これは基本的なテストケースですが、ほとんどの場合、find()はchildren()よりも高速だと思います。
ChromeデベロッパーツールでjQueryコードをステップ実行したところ、children()が内部でsibling()、filter()を呼び出し、find()よりもいくつかの正規表現を実行していることに気付きました。
find()とchildren()は異なるニーズを満たしますが、find()とchildren()が同じ結果を出力する場合は、find()を使用することをお勧めします。
これらは必ずしも同じ結果をもたらすとは限りませfind()
ん。子孫ノードを取得しますが、一致する直接の子children()
のみを取得します。
ある時点で、find()
直接の子だけでなく、一致する可能性のあるすべての子孫ノードを検索する必要があったため、 は非常に遅くなりました。しかし、これはもはや真実ではありません。find()
ネイティブのブラウザ メソッドを使用するため、はるかに高速です。
find()
メソッドとメソッドの両方をchildren()
使用して、一致した要素の子をフィルター処理します。ただし、前者は任意のレベルを下に移動し、後者は 1 レベル下に移動します。
単純化するには:
find()
– 一致した要素の子、孫、ひ孫をすべて下のレベルで検索します。children()
– 一致した要素の子のみを検索します (シングル レベル ダウン)。