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日

相关文章

  • jQuery UI Sortable disable() 方法

    jQuery UI Sortable disable() 方法详解 jQuery UI Sortable是一个排序插件,它允许用户通过拖动元素来重新排序。在本文中,我们将详细介绍Sortable disable() 方法的用和示例。 disable() 方法 disable() 方法是Sortable插件的方法,它用于禁用Sortable列表。使用该方法可以…

    jquery 2023年5月11日
    00
  • jQuery手动点击实现图片轮播特效

    下面是详细讲解“jQuery手动点击实现图片轮播特效”的完整攻略: 步骤一:创建HTML结构 首先需要在HTML中创建图片轮播需要的结构,比如下面这一段: <div id="slider"> <img src="img1.jpg"> <img src="img2.jpg&quot…

    jquery 2023年5月28日
    00
  • jQWidgets jqxDragDrop不透明度属性

    以下是关于“jQWidgets jqxDragDrop不透明度属性”的完整攻略,包含两个示例说明: 简介 jqxDragDrop 控件的 opacity 属性用于设置拖动元素的不透明度。该属性用于在拖动元素时变元素的透明度。 完整攻略 下面是 jqxDragDrop 控件 opacity 属性的完整攻略: 设置 opacity 属性 $("#dra…

    jquery 2023年5月10日
    00
  • jQWidgets jqxSlider disabled 属性

    jQWidgets是一个基于jQuery框架的UI组件库,其中包含了一个滑块控件(jqSlider),可以用于用户进行数值选择、范围选择等操作。 disabled属性用于禁用或启用控件。当设置为true时,控件将处于禁用状态,用户将无法交互操作。当设置为false时,控件将处于可用状态。 下面是一个jqxSlider控件的简单示例: <!DOCTYPE…

    jquery 2023年5月11日
    00
  • JQuery EasyUI 日期控件如何控制日期选择区间

    JQuery EasyUI 日期控件可以使用属性和方法控制日期选择区间。在此,我将为大家详细讲解如何使用 JQuery EasyUI 日期控件控制日期选择区间。 一、属性控制日期选择区间 JQuery EasyUI 日期控件中有两个属性可以帮助我们控制日期选择区间,分别是minDate和maxDate。 minDate minDate属性可以设置日期选择的最…

    jquery 2023年5月28日
    00
  • 如何找到所有名称属性中包含 geek的div并设置背景色

    要找到所有名称属性中包含geek的div元素并设置其背景色,我们可以使用jQuery的选择器和CSS样式来实现。 方法1:使用属性选择器 我们可以使用jQuery的属性选择器来选择所有名称属性中包含geek的div元素,并使用CSS样式设置其背景色。以下是示例代码: $("div[name*=’geek’]").css("bac…

    jquery 2023年5月9日
    00
  • jQuery中element选择器用法实例

    对于“jQuery中element选择器用法实例”的完整攻略,可以按照以下步骤进行: 1. 什么是element选择器 首先我们要了解一下什么是element选择器,element选择器是CSS选择器的一种,它可以根据HTML页面中的标记名称来选择对应的元素。在jQuery中,element选择器使用的是同样的语法,比如$(‘div’)表示选择所有的<…

    jquery 2023年5月28日
    00
  • jQuery Misc each()方法

    jQuery Misc each() 方法是 jQuery 提供的一个遍历方法,主要用于遍历 jQuery 对象中的每个元素并应用回调函数。本文将详细讲解该方法的用法及注意事项。 语法 jQuery Misc each() 语法: $(selector).each(function(index, element)) 参数说明: selector : 必选参数…

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