章节
问答
笔记
评论
占位
占位

Sizzle编译原理(中)

我们在经过词法分析,简单过滤,找到适合的种子集合之后,最终的选择器抽出了input这个种子合集seed,重组的选择器selectorAaron [name=ttt],还有词法分析合集group,通过tokenize最终分类出来的group分别都有对应的几种 type:

var match = [{
        matches: ["div"],
        type: "TAG",
        value: "Aaron"
}, {
        type: " ",
        value: " "
}, {
        matches: ["name", "=", "ttt"],
        type: "ATTR",
        value: "[name=ttt]"
}]

每一种type都会有对应的处理方法 Expr.filter:

Expr.filter = {
    ATTR   : function (name, operator, check) {
    CHILD  : function (type, what, argument, first, last) {
    CLASS  : function (className) {
    ID     : function (id) {
    PSEUDO : function (pseudo, argument) {
    TAG    : function (nodeNameSelector) {
}

可以把“元”理解为“原子”,也就是最小的那个匹配器。

每条选择器规则最小的几个单元可以划分为:ATTR | CHILD | CLASS | ID | PSEUDO | TAG

在Sizzle里边有一些工厂方法用来生成对应的这些元匹配器,它就是Expr.filter。

举2个例子(ID类型的匹配器由Expr.filter["ID"]生成,应该是判断elem的id属性跟目标属性是否一致),到这里应该想到Sizzle其实是不是就是通过对selector做“分词”,打散之后再分别从Expr.filter 里面去找对应的方法来执行具体的查询或者过滤的操作?

答案基本是肯定的。

但是这样常规的做法逻辑上是OK的,但是效率如何?

所以Sizzle有更具体和巧妙的做法,Sizzle在这里引入了编译函数的概念。

任务

?不会了怎么办
||

提问题

写笔记

截图
提交
||

请验证,完成请求

由于请求次数过多,请先验证,完成再次请求

加群二维码

打开微信扫码自动绑定

您还未绑定服务号

绑定后可得到

  • · 粉丝专属优惠福利
  • · 大咖直播交流干货
  • · 课程更新,问题答复提醒
  • · 账号支付安全提醒

举报

0/150
提交
取消
全部 精华 我要发布
全部 我要发布
最新 点赞
只看我的

手记推荐

更多

本次提问将花费2个积分

你的积分不足,无法发表

为什么扣积分?

本次提问将花费2个积分

继续发表请点击 "确定"

为什么扣积分?