Heim  >  Artikel  >  Web-Frontend  >  Interpretation des Quellcodes des jQuery-Selektors (6): Sizzle-Selektor-Matching-Logikanalyse_jquery

Interpretation des Quellcodes des jQuery-Selektors (6): Sizzle-Selektor-Matching-Logikanalyse_jquery

WBOY
WBOYOriginal
2016-05-16 16:06:441085Durchsuche

Ich habe kürzlich im Internet einige Analyseartikel über Sizzle gelesen. In Bezug auf die Zuordnungsreihenfolge wird oft gesagt, dass die umgekehrte Zuordnungsmethode von rechts nach links verwendet wird, aber die spezifischen Details werden nicht im Detail vorgestellt In meinen vorherigen Artikeln wird der Code Zeile für Zeile ausführlich vorgestellt, es fehlt jedoch eine allgemeine Erklärung der passenden Logik (vorkompilierte Ergebnisse) der jQuery-1.10.2-Version viele Details hier.

Der Matching-Prozess von Sizzle verwendet eine verbesserte Version, die auf der Reverse-Matching-Methode basiert. Schließlich unterscheidet sich die HTML-Suche von der Text-Matching-Methode. Lassen Sie mich zunächst klarstellen, dass sich der unten erwähnte Beziehungsselektor auf den Combinator-Selektor im W3C bezieht. Da ich der Meinung bin, dass der Namensbeziehungsselektor der tatsächlichen Bedeutung näher kommt als andere, habe ich ihn so benannt.

1. Stellen Sie kurz die beiden von Sizzle kompilierten und ausgeführten Hauptfunktionen vor:

a) matcherFromTokens – Generieren Sie eine Ausführungsfunktion für einen Blockselektor. Der sogenannte Blockselektor ist ein Selektorstring, der keine Kommatrennung enthält.

b) matcherFromGroupMatchers – die endgültige Ausführungsfunktion, die verschiedene Blockselektoren generiert. Diese Funktion ist auch dafür verantwortlich, doppelte Objekte aus den Endergebnissen herauszufiltern.

2. Die Funktion matcherFromTokens generiert verschiedene Ausführungsfunktionen für verschiedene Arten von Selektoren. Wenn es eine Pseudoklasse enthält, wird setMatcher zurückgegeben, andernfalls wird elementMatcher zurückgegeben. Der Code unterscheidet setMatcher und elementMatcher, indem er identifiziert, ob der Matcher das Expando-Attribut enthält:

a) Für Nicht-Pseudoklassen- und nicht-relationale Selektoren werden Ausführungsfunktionen direkt von links nach rechts generiert, und jede Funktion existiert als anderes Element desselben Matchers-Arrays.

b) Für den Beziehungsselektor werden die zuvor generierten Matcher in ein neues Matcher-Array verschoben.

c) Für den Pseudoklassenselektor wird über die setMatcher-Funktion eine Ausführungsfunktion generiert. Beim Aufruf von setMatcher werden sechs Parameter übergeben, nämlich preFilter, selector, matcher, postFilter, postFinder und postSelector.

PreFilter ist die letzte Funktion, die von der Funktion „elementMatcher“ im Array „matchers“ verarbeitet wird, bevor die Funktion „setMatcher“ ausgeführt wird. elementMatcher(matchers) gibt eine neue Funktion zurück, die jede Funktion des Elements „matchers“ von hinten nach vorne ausführt.

Selektor ist die Selektorzeichenfolge, die den Matchern

entspricht

matcher ist die Matching-Funktion der Pseudoklasse selbst

PostFilter ist die Matching-Funktion, die der Selektorzeichenfolge zwischen der Pseudoklasse und der ersten Pseudoklasse oder dem Beziehungssymbol entspricht. Es ist das Rückgabeergebnis der verschachtelten Aufruffunktion matcherFromTokens

PostFinder ist die Matching-Funktion, die von allen Selektoren nach dem entsprechenden PostFilter-Selektor generiert wird. Es ist auch das Rückgabeergebnis des verschachtelten Aufrufs der matcherFromTokens-Funktion

PostSelector ist die Selektorzeichenfolge, die postFinder entspricht.

d) Wenn die Selektorzeichenfolge keine Pseudoklasse enthält, wird die endgültige von elementMatcher(matchers) generierte Matching-Funktion zurückgegeben.

Wie aus der obigen Einführung hervorgeht, besteht eine verschachtelte Beziehung zwischen den generierten Ausführungsfunktionen. Einfach ausgedrückt enthält setMatcher Matcher, und die relationale Selektor-Matching-Funktion enthält Nicht-Pseudoklassen- und nicht-relationale Selektor-Matching-Funktionen.

3. Einführung in den Ausführungsprozess:

a) Ausführungsfunktion des Ausführungsblockselektors:

Für elementMatcher wird es der Reihe nach von außen nach innen und von hinten nach vorne ausgeführt, also vom äußersten Array zum innersten Array. Im selben Array wird es der Reihe nach vom letzten zum ersten Element ausgeführt Element.

Rufen Sie für setMatcher zuerst das Matching-Ergebnis basierend auf preFilter und Selector ab. Führen Sie dann die Matcher-Funktion aus, um das Matching-Ergebnis zu erhalten. Führen Sie dann die PostFilter-Funktion aus und erhalten Sie schließlich das Matching-Ergebnis basierend auf PostFinder und PostSelector.

c) Nachdem Sie die Ausführungsfunktion jedes Blockselektors nacheinander ausgeführt haben, filtern Sie doppelte Daten heraus und geben Sie das Ergebnis zurück.

Nachdem Sie den obigen allgemeinen Prozess gelesen haben, sollte es einfacher sein, ihn zu verstehen, wenn Sie sich die detaillierte Einführung jeder Methode ansehen. Natürlich werden einige Details hier nicht besprochen, wie z. B. die Generierung des anfänglichen Ergebnissatzes (Seed) und die resultierende Funktionsausführung Logikdetails. Unterschiede usw.

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn