最近ネットでシズルの解析記事を読んだのですが、マッチング順序に関しては右から左への逆マッチング方式が使われていることが多いのですが、具体的な内容は詳しく紹介されていない、というかそんな感じです。以前の記事では、コードは 1 行ずつ詳細に紹介されていますが、全体的な概念が不足しています。ここでは、Sizzle の jQuery-1.10.2 バージョンのマッチング ロジック (プリコンパイルされた結果) についての全体的な説明を省略します。ここに多くの詳細があります。
Sizzle のマッチング処理は、右から左への逆マッチング方式をベースにした改良版を使用しています。そのため、HTML 検索には独自の最適化が必要です。最初に明確にしておきますが、以下で説明するリレーションシップ セレクターは W3C の Combinator セレクターを指します。リレーションシップ セレクターという名前の方が実際の意味に近いと思うので、このように名付けました。
1. Sizzle によってコンパイルおよび実行される 2 つの主要な関数を簡単に紹介します。
a) matcherFromTokens - ブロック セレクターの実行関数を生成します。いわゆるブロック セレクターは、カンマ区切りを含まないセレクター文字列です。
b) matcherFromGroupMatchers - さまざまなブロック セレクターを生成する最終実行関数。この関数は、最終結果から重複オブジェクトを除外する役割も果たします。
2. matcherFromTokens 関数は、さまざまな種類のセレクターに対してさまざまな実行関数 を生成します。疑似クラスが含まれている場合は setMatcher が返され、それ以外の場合は elementMatcher が返されます。このコードは、マッチャーにexpando 属性が含まれているかどうかを識別することで setMatcher と elementMatcher を区別します。
a) 非疑似クラスおよび非リレーショナル セレクターの場合、実行関数は左から右に直接生成され、各関数は同じマッチャー配列の異なる要素として存在します。b) リレーションシップ セレクターの場合、以前に生成されたマッチャーが新しいマッチャー配列にプッシュされます。
c) 疑似クラス セレクターの場合、setMatcher 関数を呼び出すと実行関数が生成され、preFilter、selector、matcher、postFilter、postFinder、postSelector という 6 つのパラメーターが渡されます。
PreFilter は、setMatcher 関数を実行する前に生成された matchers 配列に対して elementMatcher 関数によって処理される最後の関数であり、elementMatcher(matchers) は各 matchers 要素関数を後ろから前に実行する新しい関数を返します。
セレクターは、マッチャーに対応するセレクター文字列です。
matcher は、疑似クラス自体のマッチング関数です。
PostFilter は、擬似クラスと最初の擬似クラスまたは関係シンボルの間のセレクター文字列に対応するマッチング関数です。これは、ネストされた matcherFromTokens 関数の呼び出しの結果です。PostFinder は、postFilter に対応するセレクターの後のすべてのセレクターによって生成されるマッチング関数です。これは、ネストされた matcherFromTokens 関数の呼び出しの結果でもあります。
PostSelector は、postFinder に対応するセレクター文字列です。d) セレクター文字列に疑似クラスがない場合は、elementMatcher(matchers) によって生成された最終的な一致関数が返されます。
上記の説明からわかるように、生成された実行関数の間には入れ子の関係があります。簡単に言えば、setMatcher にはマッチャーが含まれ、リレーショナル セレクター マッチング関数には非疑似クラスおよび非リレーショナル セレクター マッチング関数が含まれます。
3. 実行プロセスの概要:
a) 実行ブロックセレクターの実行関数:
elementMatcher の場合は、外側から内側、後ろから前、つまり最外配列から最内配列の順に実行され、同じ配列内では最後の要素から最初の要素まで順番に実行されます。要素。
setMatcher の場合、最初に preFilter と selector に基づいて一致結果を取得し、次に matcher 関数を実行して一致結果を取得し、次に postFilter 関数を実行して、最後に postFinder と postSelector に基づいて一致結果を取得します。c) 各ブロックセレクターの実行関数を順番に実行した後、重複データをフィルタリングして結果を返します。
上記の一般的なプロセスを読んだ後、各メソッドの詳細な紹介を参照すると、最初の結果セット (シード) の生成やその結果の関数の実行など、一部の詳細についてはここでは説明されていないため、より理解しやすくなるはずです。ロジックの詳細など