0

jQuery セレクターのパフォーマンスに関する StackOverflow の投稿を読んでいると、jQuery はセレクターに対して下から上または右から左へのアプローチを使用しているという同じことを何度も読み続けています。

この例を見てください...

$("#dnsTitle a.save").removeClass("disabled");

私が読んでいることによると、代わりにこれを使用する方がパフォーマンスが優れています...

$("a.save #dnsTitle").removeClass("disabled");

私が直面している問題は、これがまったく機能しないことです! 誰かがセレクターを実行するための本当の最良の方法を明確にすることができますか?

非常に長いセレクターを含む既存のプロジェクトに取り組んでおり、できる限り改善しようとしていますが、情報が間違っているか時代遅れになっているようです。jQuery 2.0を使用しています

4

1 に答える 1

8

「下から上/右から左/葉から根」の概念は、セレクターパーサーの実装にのみ関連しており、使用中のセレクターの順序には関連していません。

使用法:

使用の観点から、セレクターは左から右に「読み取られ」ます。最初のセレクターはルートであり、後続のセレクターは子孫です。最後のセレクターに一致する要素が返されます。など:

#dnsTitle a.save- の id を持つ要素をdnsTitle探し、そこから、aclass を持つ子孫要素を探しsaveます。aclass を持つ要素で終わりますsave

a.save #dnsTitle-aクラスを持つ要素をsave探し、そこから id を持つ子孫を見つけdnsTitleます。あなたはidを持つどんな要素でも終わるdnsTitle

解析:

解析の観点からすると、セレクター文字列の解析には 2 つの一般的な方法があり、それらは「トップダウン」と「ボトムアップ」です。

  • トップダウン / 根から葉へ / 左から右へ

    データ構造のコースを受講したことがある場合、これは通常、ツリーを解析する方法です。開始したいノードを見つけます。これが最初のセレクターになります。次に、後続のノードを見つけるために下に進みます。

    このアプローチの問題点は、再帰的なアプローチを使用し、特にツリーが巨大な場合に大量のメモリを使用することです。また、後続のセレクターは子孫であり、一致の深さが異なる可能性があるため、バックトラッキングの問題が問題になります。次のセレクターは、偉大な ^N孫に一致する可能性があります。再帰は、N 歩深く進んで偉大な ^N 子を見つけ、N 歩戻って元に戻ります。

  • 下から上へ / 右から左へ / 葉から根へ

    このアプローチでは、パーサーは最後のセレクターに一致するすべての要素を探し、最終的には一致の配列になります。その一致の配列を使用して、それらが後続の前のセレクターと一致する場合にそれらをフィルター処理します。

    このアプローチの利点は、可変深さのツリーではなく、作業する固定配列があることです。また、この場合、複数の子を処理するトップダウンとは対照的に、ノードは 1 つの親しか持てないため、線形にフィルタリングしています。これは、再帰ではなく、ジョブを実行するためのループのみが必要であることも意味します。1 つのループは各結果を処理し、ネストされたもう 1 つのループは、後続の前のセレクターと一致する場合に各祖先を処理します。

于 2013-04-22T00:21:41.050 に答える