第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

章節(jié)
問(wèn)答
課簽
筆記
評(píng)論
占位
占位

Sizzle超級(jí)匹配器(下)

這是第一組終極匹配器的生成流程了,可見(jiàn)過(guò)程極其復(fù)雜,被包裝了三層,依次:

addCombinator
elementMatcher
Expr.relative

三個(gè)方法嵌套處理出來(lái)的結(jié)構(gòu):

然后繼續(xù)分解下一組,遇到關(guān)系選擇器又繼續(xù)依照以上的過(guò)程分解,但是有一個(gè)不同的地方,下一個(gè)分組會(huì)把上一個(gè)分組給一并合并了。

所以整個(gè)關(guān)系就是一個(gè)依賴(lài)嵌套很深的結(jié)構(gòu),最終暴露出來(lái)的終極匹配器其實(shí)只有一個(gè)閉包,但是有內(nèi)嵌很深的分組閉包了,依照從左邊往右依次生成閉包,然后把上一組閉包又push到下一組閉包。

就跟棧是一種后進(jìn)先出的數(shù)據(jù)結(jié)構(gòu)一樣處理了,所以在最外層也就是:

type=["checkbox"]

我們回到superMatcher方法的處理了,在遍歷seed種子合集,依次匹配matchers閉包函數(shù),傳入每一個(gè)seed的元素與之匹配(這里就是input),在對(duì)應(yīng)的編譯處理器中通過(guò)對(duì)input的處理,找到最優(yōu)匹配結(jié)果:

function( elem, context, xml ) {
    var i = matchers.length;
    while ( i-- ) {
        if ( !matchers[i]( elem, context, xml ) ) {
            return false;
        }
    }
    return true;
} :

這里注意了,是i--,從后往前找,所以第一次開(kāi)始匹配的就是:

check: "checkbox"
name: "type"
operator: "="

那么就找到對(duì)應(yīng)的Attr處理方法:

Sizzle.attr( elem, name )

傳入elem元素就是seed中的input元素,找到是否有'type'類(lèi)型的屬性,比如:

<input type="text">"

所以第一次匹配input就出錯(cuò)了,返回的type是text,而不是我們需要的'checkbox',這里返回的結(jié)果就是false,所以整個(gè)之后的處理就直接return了,繼續(xù)拿出第二個(gè)input。

繼續(xù)上一個(gè)流程,這時(shí)候發(fā)現(xiàn)檢測(cè)到的屬性:

var result = Sizzle.attr( elem, name );
result: "checkbox"

此時(shí)滿(mǎn)足第一條匹配,然后繼續(xù) i = 0

!matchers[i]( elem, context, xml )

找到第0個(gè)編譯函數(shù):

addCombinator

如果是不緊密的位置關(guān)系,那么一直匹配到true為止,如祖宗關(guān)系的話,就一直找父親節(jié)點(diǎn)直到有一個(gè)祖先節(jié)點(diǎn)符合規(guī)則為止。

直接遞歸調(diào)用:

matcher( elem, context, xml )

其實(shí)就是下一組閉包隊(duì)列了,傳入的上下文是 div.aaron,也就是<input type="checkbox">的父節(jié)點(diǎn):

function (elem, context, xml) {
                var i = matchers.length;
                //從右到左開(kāi)始匹配
                while (i--) {
                    //如果有一個(gè)沒(méi)匹配中,那就說(shuō)明該節(jié)點(diǎn)elem不符合規(guī)則
                    if (!matchers[i](elem, context, xml)) {
                        return false;
                    }
                }
                return true;
        }

依照上面的規(guī)則,這樣遞歸下去了,一層一層的匹配,可見(jiàn)它原來(lái)不是一層一層往下查,卻有點(diǎn)倒回去向上做匹配、過(guò)濾的意思。Expr里面只有find和preFilter返回的是集合。

盡管到這里暫時(shí)還帶著一點(diǎn)疑問(wèn),但是我想Sizzle最基本的“編譯原理”應(yīng)該已經(jīng)解釋清楚了。

任務(wù)

?不會(huì)了怎么辦
||

提問(wèn)題

寫(xiě)筆記

公開(kāi)筆記
提交
||

請(qǐng)驗(yàn)證,完成請(qǐng)求

由于請(qǐng)求次數(shù)過(guò)多,請(qǐng)先驗(yàn)證,完成再次請(qǐng)求

加群二維碼

打開(kāi)微信掃碼自動(dòng)綁定

您還未綁定服務(wù)號(hào)

綁定后可得到

  • · 粉絲專(zhuān)屬優(yōu)惠福利
  • · 大咖直播交流干貨
  • · 課程更新,問(wèn)題答復(fù)提醒
  • · 賬號(hào)支付安全提醒

收藏課程后,能更快找到我哦~

使用 Ctrl+D 可將課程添加到書(shū)簽

邀請(qǐng)您關(guān)注公眾號(hào)
關(guān)注后,及時(shí)獲悉本課程動(dòng)態(tài)

舉報(bào)

0/150
提交
取消
全部 精華 我要發(fā)布
全部 我要發(fā)布
最熱 最新
只看我的

手記推薦

更多

本次提問(wèn)將花費(fèi)2個(gè)積分

你的積分不足,無(wú)法發(fā)表

為什么扣積分?

本次提問(wèn)將花費(fèi)2個(gè)積分

繼續(xù)發(fā)表請(qǐng)點(diǎn)擊 "確定"

為什么扣積分?