Rumah > hujung hadapan web > tutorial js > Tafsiran kod sumber pemilih jQuery (8): addCombinator function_jquery

Tafsiran kod sumber pemilih jQuery (8): addCombinator function_jquery

WBOY
Lepaskan: 2016-05-16 16:06:54
asal
1041 orang telah melayarinya

fungsi addCombinator(padan, penggabung, asas)

1、源码

复制代码 代码如下:

fungsi addCombinator(padan, penggabung, asas) {
 var dir = combinator.dir, checkNonElements = base
   && dir === "parentNode", doneName = selesai ;

 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.🎉。

复制代码 代码如下:
Expr.relative : {
 ">" : {
  dir : "parentNode",
  pertama : benar
 },
 " " : {
  dir : "parentNode"
 },
 " " : {
  dir : "sibling sebelumnya",
  pertama : benar
 },
 "~" : {
  dir : "sibling sebelumnya"
 }
}

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 >

Salin kod Kod adalah seperti berikut:
fungsi(elemen, konteks, xml) {
manakala ((elem = elem[dir])) {
if (elem.nodeType === 1 || checkNonElements) {
Penjodoh kembali(elemen, konteks, xml);
}
}
}

4.1.1 Fungsi

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.

4.1.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 Jika pemilih perhubungan ialah ~ atau ruang, fungsi berikut akan dikembalikan:


Salin kod Kod adalah seperti berikut: //Semak semua unsur nenek 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) {
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

Salin kod Kod adalah seperti berikut:

manakala ((elem = elem[dir])) {
if (elem.nodeType === 1 || checkNonElements) {
// Jika atribut expando nod elem tidak wujud, berikan objek kosong dan berikan kepada outerCache
pada masa yang sama. // Jika atribut expando nod elem wujud, tetapkan nilainya kepada outerCache
outerCache = elem[expando] ||. (elem[expando] = {});
/*
* Jika outCache[dir] mempunyai nilai dan elemen pertamanya adalah sama dengan dirkey semasa,
* Ini bermakna pemilih kedudukan semasa telah mengesan nod semasa pelaksanaan ini, melaksanakan pernyataan dalam if, dan memperoleh keputusan terus daripada cache
* Jika outCache[dir] tidak wujud, atau elemen pertama tidak sama dengan dirkey semasa,
* * Ini bermakna bahawa pemilih kedudukan semasa tidak mengesan nod semasa pelaksanaan ini, melaksanakan pernyataan dalam lain, memadankan nod dan meletakkan hasilnya ke dalam cache
*/
jika ((cache = outerCache[dir])
&& cache[0] === dirkey) {
// Jika hasil pengesanan dalam cache adalah sama dengan benar atau nilai cachedruns, hasil pengesanan akan dikembalikan (sama ada palsu atau benar),
// Jika tidak, teruskan gelung untuk mendapatkan nod sebelumnya yang sepadan dengan hubungan kedudukan untuk pemadanan
jika ((data = cache[1]) === benar
||. data === cachedruns) {
Kembalikan data === benar;
}
} lain {
//Tetapkan tatasusunan [dirkey] kepada outerCache[dir] dan cache
cache = outerCache[dir] = [ dirkey ];
// Jika perlawanan berjaya, tetapkan benar kepada cache[1], jika tidak tetapkan nilai cachedruns kepada cache[1]
cache[1] = matcher(elem, konteks, xml)
||. cachedruns;
// Jika hasil padanan adalah benar, kembalikan benar, jika tidak, teruskan gelung untuk mendapatkan nod sebelumnya yang sepadan dengan hubungan kedudukan untuk pemadanan
jika (cache[1] === benar) {
Kembalikan benar;
}
}
}
}
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan