ホームページ > 記事 > ウェブフロントエンド > jQueryセレクターのソースコード解釈(8):addCombinator function_jquery
関数 addCombinator(マッチャー、コンビネーター、ベース)
1、ソースコード
combinator.first を返します ?
// 最も近い祖先/前の要素と照合します
関数(要素、コンテキスト、xml) {
while ((elem = elem[dir])) {
if (elem.nodeType === 1 || checkNonElements) {
return matcher(elem, context, xml);
}
}
} :
// すべての祖先/先行要素と照合します
関数(要素、コンテキスト、xml) {
var data、cache、outerCache、dirkey = dirruns " " DoneName;
// XML ノードには任意のデータを設定できないため、
// dir キャッシュの恩恵を受ける
if (xml) {
while ((elem = elem[dir])) {
if (elem.nodeType === 1 || checkNonElements) {
if (matcher(elem, context, xml)) {
true を返します;
}
}
}
} else {
while ((elem = elem[dir])) {
if (elem.nodeType === 1 || checkNonElements) {
externalCache = elem[expando] || (elem[expando] = {});
if ((キャッシュ = externalCache[dir])
&& キャッシュ[0] === dirkey) {
if ((データ = キャッシュ[1]) === true
||データ === キャッシュラン) {
戻りデータ === true;
}
} else {
キャッシュ = externalCache[dir] = [ dirkey ];
キャッシュ[1] = matcher(elem, context, xml)
||キャッシュされた実行;
if (キャッシュ[1] === true) {
true を返します;
}
}
}
}
}
};
}
2、機能
システム選択器の実行関数を生成します。
3、パラメータ
matcher - 位置関連で継続的に実行されるフィルタ・セレクタ関数の数グループ。この関数は、位置関連によって取得されるポイントが、実際の実行中にシステム・セレクタの要求に適合するかどうかを照合するために使用されます。例: div.map>span、Sizzle での評価に到達したとき、div.map の関数を最初のパラメータとして addCombinator 関数として使用し、取得したスパンの父ポイントがあるかどうかを検査します。この 2 つの条件を div.map に満たします。
コンビネータ - Expr.relative の関連システム セレクションの値。このパラメータの最初のプロパティを使用して、返されるオブジェクトがすべて検査される関数であることを確認します。
次のコード: elem = elem[dir] によって、dir が combinator.dir に等しい位置関係のポイントを取得します。
base - このパラメータは combinator.dir とともに、変数 checkNonElement の値を決定します。コードは次のとおりです。この値は文字通り、現在のチェックが非 DOM 要素であることを意味すると理解されます。つまり、elem.nodeType!=1 の場合、値が true の場合、一致する関数が実行され、それ以外の場合はループが終了します。
4. 戻り関数
4.1 関係セレクターが > または の場合、次の関数が返されます。
要素型ノードがチェックされている場合(つまり、checkNonElements==false)、要素指定の位置関係(elem.nodeType == 1)の最初の要素型ノードを反復的に取得し、マッチング関数を実行し、ノードが要件を満たしているかどうかを確認します。要件を満たしている場合は true を返し、そうでない場合は
を返します。
4.1.2 パラメータ
elem – チェックされる単一のノード要素。
context - セレクター文字列全体のマッチングを実行するコンテキスト ノード。ほとんどの場合、役に立ちません。
xml——現在の検索オブジェクトは HTML ドキュメントですか?それとも XML ドキュメントですか? HTML の場合、xml パラメータは false です。
4.2 リレーションシップセレクターが ~ またはスペースの場合、次の関数が返されます:
if (xml) {
while ((elem = elem[dir])) {
if (elem.nodeType === 1 || checkNonElements) {
If (matcher(elem, context, xml)) {
true を返します;
}
}
}
} else {
while ((elem = elem[dir])) {
if (elem.nodeType === 1 || checkNonElements) {
externalCache = elem[expando] || (elem[expando] = {});
If ((キャッシュ = externalCache[dir])
&& キャッシュ[0] === dirkey) {
If ((data = キャッシュ[1]) === true
|| データ === キャッシュ実行) {
データを返す === true;
}
} else {
キャッシュ = externalCache[dir] = [dirkey];
キャッシュ[1] = matcher(elem, context, xml)
|| キャッシュされた実行;
If (cache[1] === true) {
true を返します;
}
}
}
}
}
};
4.2.1 機能
XML ドキュメントをチェックしている場合、プロセスは 4.1 の return 関数と同じです。上記のコードの if (XML) { ... } の中の中括弧内のコードを参照してください。
HTML ドキュメントの場合は、マッチャーに従って現在の要素と一致し、一致した場合は true を返し、それ以外の場合は false を返します。
4.2.2 パラメータ
elem – チェックされる単一のノード要素。
context - セレクター文字列全体のマッチングを実行するコンテキスト ノード。ほとんどの場合、役に立ちません。
xml——現在の検索オブジェクトは HTML ドキュメントですか?それとも XML ドキュメントですか? HTML の場合、xml パラメータは false です。
4.2.3 コードの説明
内部変数
dirkey - ノード検出結果をキャッシュするために使用されるキー。実行中にノードがチェックされると、検出結果 (true または false) がノードの dirkey 属性に記録されます (属性名は dirkey の値です)。この実行中に再び検出された場合は、これに到達します。ノードを再度検出する必要はありません。キャッシュが必要な理由は、複数のノードに同じ親ノードまたは兄弟ノードがあるため、キャッシュを使用すると検出数が減り、パフォーマンスが向上するためです。
dirruns - matcherFromGroupMatchers によって編成されたプリコンパイル済みコードが実行されるたびに、異なる実行プロセスを区別するために疑似乱数が生成されます。
DoneName - addCombinator 関数が実行されるたびに、生成されたさまざまな位置関係マッチング関数を区別するために、done 変数が 1 ずつ増加します。
cachedruns - この一致がどの DOM 要素であるかを記録するために使用されます。たとえば、div.map>span の場合、span セレクターに一致する要素が 3 つあり、各要素に対して > 一致関数が実行されると、cachedrun は順番に 0、1、2 になります。コードによれば、cachedruns の役割は、実行プロセス中に、一致するために同じ要素に対して elementMatchers を使用するときに、同じ要素に再び遭遇したときに、一致しない結果を直接取得できることが起こると直接理解できます。誰かがそれに遭遇したら、私に知らせてください、ありがとう!
コードの説明