jQuery选择器源码解读(四):tokenize方法的Expr.preFilter

jQuery选择器源码解读(四):tokenize方法的Expr.preFilter

在jQuery的Sizzle引擎中,tokenize方法负责将输入的选择器划分成一个个的Token。这些Token是选择器的构成部分,是后续处理的基础。而Expr.preFilter就是在Tokenize方法中使用的一个辅助方法,用于处理一些特殊的选择器表达式。

Expr.preFilter函数的定义:

Expr.preFilter = {
    "ATTR": function (match) {
        match[1] = match[1].replace(runescape, funescape);
        match[3] = (match[3] || match[4] || match[5] || "").replace(runescape, funescape);
        if (match[2] === "~=") {
            match[3] = " " + match[3] + " ";
        }
        return match.slice(0, 4);
    },
    "CHILD": function (match) {
        /* ... */
    },
    "PSEUDO": function (match) {
        /* ... */
    }
};

这个函数是一个对象,包括了三个属性:ATTR、CHILD、PSEUDO。每个属性都是一个方法,用来处理对应的选择器表达式。
在tokenize方法中,在对选择器字符串进行划分之前,会遍历这个对象,对选择器表达式进行预处理。

例如,对于选择器[attr~=value],tokenize方法首先会将整个表达式分成三个Token:attr、~=、value。在对attr Token之后,就会遇到EXPR.preFilter中的ATTR属性,将Token进行处理:

match[1] = match[1].replace(runescape, funescape);
match[3] = (match[3] || match[4] || match[5] || "").replace(runescape, funescape);
if (match[2] === "~=") {
    match[3] = " " + match[3] + " ";
}
return match.slice(0, 4);

这里的match是一个数组,包含了刚刚划分出来的Token:["attr", "~=", "value"]。此时preFilter的ATTR方法就将这个Token改写成了形如["attr", "~=", " value "]的形式(注意value前后有空格)。这样,后续处理就可以直接把Token的值比对在空格的情况下是否相等,而不必再特别处理。

再例如,对于选择器div:nth-child(2n),tokenize方法会将其划分成七个Token,其中第五个Token是":nth-child",此时就会遇到EXPR.preFilter中的CHILD属性。而CHILD方法的实现中,就是将":nth-child"改写成了两个Token:":nth"和"child"。

Expr.preFilter.CHILD = function(match) {
    /* 匹配div:nth-child(2n) */

    /* 将match[0]从":nth-child"改为":nth"和"child" */
    match[1] = match[1].toLowerCase();

    if (match[1].slice(0, 3) === "nth") {
        /* 处理类似,":nth-child(2n)"的选择器 */

        /* 如果没有指定start,默认从0开始 */
        if (!match[3]) {
            match[3] = "0";
        }

        /* 如果没有指定end,默认到最后一个元素 */
        if (!match[4]) {
            match[4] = "-1";
        }

        /* 如果指定了start,添加前缀 */
        if (match[3] === "-1") {
            match[2] = match[4];
            match[4] = "1";
        } else {
            match[2] = match[4];
            match[4] = match[3];
        }

        /* 将start和end作为额外的Token */
        match[3] = (match[5] || match[6] || "0")
            .replace(/^\+|\s*/g, '') + '0'.slice(match[2] < 0 ? -1 * match[2].length : 0);
        match[4] = +((match[7] + match[8] || match[3] === 'odd') ? 1 : 0);
        match[2] = +match[2];
    } else if (match[5]) {
        /* 处理类似,":first-child"的选择器 */

        match[2] = match[4] = match[5];
    }

    return match.slice(0, 3);
};

这里通过判断选择器表达式的开头几个字符,来判断这个选择器表达式的具体类型(比如是":nth-child"还是":first-child")。然后在根据选择器表达式的不同类型,将原来的Token改写成新的Token。最终返回处理后的Token数组。

以上就是Expr.preFilter辅助方法的基本工作原理,它可以辅助tokenize函数更好地处理选择器表达式,方便后续的操作。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:jQuery选择器源码解读(四):tokenize方法的Expr.preFilter - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • jQWidgets jqxTreeMap高度属性

    以下是关于 jQWidgets jqxTreeMap 组件中高度属性的详细攻略。 jQWidgets jqxTreeMap 高度属性 jQWidgets jqxTreeMap的高度属性用于设置组件的高度。您可以使用此属性控制组件的高度,以便更好地展示数据。 语法 $(‘#treemap’).jqxTreeMap({ height: }); 参数 height…

    jquery 2023年5月12日
    00
  • jquery库或JS文件在eclipse下报错问题解决方法

    当使用jQuery库或JS文件在Eclipse中时,有时可能会遇到以下错误: jQuery未定义 无法解析$或jQuery 找不到jQuery库 这些错误可能是由于Eclipse没有正确地连接jQuery库或者JS文件导致的。以下是解决这些问题的步骤: 步骤一:在Eclipse中添加jQuery库或JS文件 在Eclipse的“WebContent”文件夹下…

    jquery 2023年5月27日
    00
  • jQuery无刷新上传之uploadify3.1简单使用

    为了详细讲解“jQuery无刷新上传之uploadify3.1简单使用”的完整攻略,我们需要按照一定的顺序进行介绍和操作。下面是教程的步骤: 1. 引入uploadify插件和jquery插件 为了使用uploadify插件,我们首先需要引入jQuery插件和uploadify插件的js文件和css文件。通常情况下,我们可以在html文档中直接引入这些文件。…

    jquery 2023年5月27日
    00
  • 可输入文字查找ajax下拉框控件 ComBox的实现方法

    下面是关于“可输入文字查找ajax下拉框控件 ComBox的实现方法” 的完整攻略。 1. 使用jQuery UI Autocomplete组件实现 jQuery UI Autocomplete组件是一个强大的搜索框组件,支持可输入文字查找,可以方便地实现ajax下拉框控件 ComBox。下面是一个使用示例: HTML代码 <label for=&qu…

    jquery 2023年5月27日
    00
  • jQWidgets jqxDataTable rowDetails属性

    以下是关于“jQWidgets jqxDataTable rowDetails属性”的完整攻略,包含两个示例说明: 简介 jqxDataTable 控件的 rowDetails 属性用于在表格中显示行的详细信息。通过设置 rowDetails 属性,可以在表格中添加一个可展开的区域,用于显示行的详细信息,例如行的描述、图片等。 整攻 以下是 jqx 控 ro…

    jquery 2023年5月11日
    00
  • jQWidgets jqxTimePicker高度属性

    以下是关于 jQWidgets jqxTimePicker 组件中 height 属性的详细攻略。 jQWidgets jqxTimePicker height 属性 jQWidgets jqxTimePicker 组件的 height 属性用于设置时间选择器的高度。可以使用该属性设置时间选择器的高度,以适应您应用程序的布局和设计。 语法 $(‘#timep…

    jquery 2023年5月11日
    00
  • jQWidgets jqxRadioButton animationShowDelay属性

    以下是关于 jQWidgets jqxRadioButton 组件中 animationShowDelay 属性的详细攻略。 jQWidgets jqxRadioButton animationShowDelay 属性 jQWidgets jqxRadioButton 组件的 animationShowDelay 属性用于设置动画显示的延迟时间。 语法 //…

    jquery 2023年5月12日
    00
  • jQuery使用JSONP实现跨域获取数据的三种方法详解

    让我来详细讲解一下“jQuery使用JSONP实现跨域获取数据的三种方法详解”的攻略。 什么是JSONP JSONP(JSON with Padding)是一种跨域访问的技术,它的原理是利用script标签的跨域特性,动态创建script标签来加载并执行远程服务器上的JavaScript代码,从而实现跨域通信。 JSONP实现跨域获取数据的三种方法 第一种方…

    jquery 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部