fungsi addCombinator(padan, penggabung, asas)
1、源码
return combinator.first ?
// Semak terhadap unsur moyang terdekat/terdahulu
fungsi(elemen, konteks, xml) {
manakala ((elem = elem[dir])) {
if (elem.nodeType === 1 || checkNonElements) {
pemadan pulangan(elemen, konteks, xml);
}
}
} :
// Semak terhadap semua unsur moyang/sebelumnya
fungsi(elemen, konteks, xml) {
var data, cache, outerCache, dirkey = dirruns " " doneName;
// Kami tidak boleh menetapkan data sembarangan pada nod XML, jadi mereka tidak
// mendapat manfaat daripada dir caching
jika (xml) {
manakala ((elem = elem[dir])) {
if (elem.nodeType === 1 || checkNonElements) {
if (padan(elemen, konteks, xml)) {
kembali benar;
}
}
}
} lain {
manakala ((elem = elem[dir])) {
if (elem.nodeType === 1 || checkNonElements) {
outerCache = elem[expando] || (elem[expando] = {});
jika ((cache = outerCache[dir])
&& cache[0] === dirkey) {
jika ((data = cache[1]) === benar
|| data === cachedruns) {
pulangkan data === benar;
}
} lain {
cache = outerCache[dir] = [ dirkey ];
cache[1] = matcher(elem, konteks, xml)
|| cachedruns;
jika (cache[1] === benar) {
kembali benar;
}
}
}
}
}
};
}
2、功能
生成关系选择器的执行函数。
3、参数
match——位置关系前连续的过滤选择器匹配函数数组,该函数用于匹配逳讇佳说否符合选择器要求。在实际执行过程中,该函数可能是关系选择器前已生成的elementMatcher(matchers)。例如:div.map>span,在Sizzle编译遇到>时,会将div.map的编译函数作为第小作为第一一为第一作为第小用以检查获取的span父节点是否满足div.map这两个条件。
combinator——关系选择器对应Expr.relative中的值,Expr.relative中各种关系选择器的值如下。使用该参返回的是仅检查紧邻对象的函数还是遍历所有可能对象的函数。将通过如下代码:elem = elem[dir],获取指定位置关系的节点,其中com dirbinator.🎉。
base - Parameter ini, bersama-sama dengan combinator.dir, menentukan nilai pembolehubah checkNonElement Kodnya adalah seperti berikut. Nilai ini secara literal difahami bermaksud bahawa semakan semasa ialah elemen bukan DOM, iaitu, apabila elem.nodeType!=1, jika nilainya benar, fungsi padanan akan dilaksanakan, jika tidak gelung akan tamat.
4. Kembalikan fungsi
4.1 Jika pemilih perhubungan ialah >
Jika nod jenis elemen disemak (iaitu checkNonElements==false), secara berulang dapatkan nod jenis elemen pertama bagi hubungan kedudukan yang ditentukan elem (elem.nodeType == 1), laksanakan fungsi padanan, semak sama ada nod memenuhi keperluan, dan kembalikan benar jika ia memenuhi keperluan , jika tidak, kembalikan palsu;
Jika semua jenis nod ditandakan (iaitu checkNonElements==true), dapatkan nod bersebelahan dengan hubungan kedudukan yang ditentukan bagi elem, laksanakan fungsi padanan, semak sama ada nod memenuhi keperluan, kembalikan benar jika ia memenuhi keperluan , jika tidak, pulangkan palsu;
Mungkin ada yang bertanya, bukankah dikatakan hubungan jiran yang rapat? Jadi mengapa proses pemerolehan berulang muncul dalam kod? Ini kerana sesetengah penyemak imbas akan menganggap pemisah baris antara teks nod sebagai TextNode, jadi semasa pemprosesan, nod ini perlu dilangkau sehingga nod elemen seterusnya.
elem – elemen nod tunggal untuk diperiksa.
konteks - nod konteks yang melaksanakan keseluruhan padanan rentetan pemilih, selalunya ia tidak berguna.
4.2 Jika pemilih perhubungan ialah ~ atau ruang, fungsi berikut akan dikembalikan:
manakala ((elem = elem[dir])) {
if (elem.nodeType === 1 || checkNonElements) {
Jika (padan(elemen, konteks, xml)) {
Kembalikan benar;
}
}
}
} lain {
manakala ((elem = elem[dir])) {
if (elem.nodeType === 1 || checkNonElements) {
outerCache = elem[expando] ||. (elem[expando] = {});
Jika ((cache = outerCache[dir])
&& cache[0] === dirkey) {
Jika ((data = cache[1]) === benar
||. data === cachedruns) {
pulangkan data === benar;
}
} lain {
cache = outerCache[dir] = [dirkey];
cache[1] = matcher(elem, konteks, xml)
||. cachedruns;
Jika (cache[1] === benar) {
kembali benar;
}
}
}
}
}
};
4.2.1 Fungsi
Jika anda menyemak dokumen XML, prosesnya adalah sama dengan fungsi pemulangan dalam 4.1 Lihat kod dalam kurungan kerinting dalam if (XML) { ... } dalam kod di atas.
Jika ia adalah dokumen HTML, padankan elemen semasa mengikut pemadanan Jika padanan berjaya, kembalikan benar;
4.2.2 Parameter
elem – elemen nod tunggal untuk diperiksa.
konteks - nod konteks yang melaksanakan keseluruhan padanan rentetan pemilih, selalunya ia tidak berguna.
xml——Adakah objek carian semasa adalah dokumen HTML atau XML Jika ia HTML, parameter xml adalah palsu.
4.2.3 Penerangan Kod
Pembolehubah dalaman
dirkey - kunci yang digunakan untuk cache hasil pengesanan nod. Semasa pelaksanaan, jika nod disemak, hasil pengesanan (benar atau salah) akan direkodkan dalam atribut dirkey nod (nama atribut ialah nilai dirkey Kemudian semasa pelaksanaan ini, jika ia ditemui semula Apabila mencapai ini nod, tidak perlu mengesannya lagi. Sebab caching diperlukan adalah kerana berbilang nod akan mempunyai nod induk atau nod adik beradik yang sama Menggunakan caching boleh mengurangkan bilangan pengesanan dan meningkatkan prestasi.
dirruns - Setiap kali kod prakompilasi yang dianjurkan oleh matcherFromGroupMatchers dilaksanakan, nombor pseudo-rawak akan dijana untuk membezakan proses pelaksanaan yang berbeza.
doneName——Setiap kali fungsi addCombinator dilaksanakan, pembolehubah yang dilakukan akan dinaikkan sebanyak 1 untuk membezakan fungsi pemadanan hubungan kedudukan terjana yang berbeza.
cachedruns - digunakan untuk merekod elemen DOM yang mana padanan ini. Contohnya: div.map>span, terdapat 3 elemen yang sepadan dengan pemilih span, kemudian apabila fungsi pemadanan > dilaksanakan untuk setiap elemen, cachedrun adalah 0, 1 dan 2 dalam susunan. Mengikut kod tersebut, peranan cachedruns boleh difahami secara langsung seperti semasa proses pelaksanaan, apabila menggunakan elementMatchers untuk elemen yang sama untuk pemadanan, apabila elemen yang sama ditemui semula, hasil yang tidak sepadan boleh diperolehi terus daripada Inilah yang berlaku. Jika sesiapa menemuinya, sila beritahu saya, terima kasih!
Penjelasan kod