jquery 1.7.2源码解析(三) 选择器Sizzle

选择器Sizzle

一)Sizzle( selector, context, results, seed )

该函数用于查找与选择器表达式selector匹配的元素集合,是选择器引擎的入口。

var Sizzle = function( selector, context, results, seed ) {

selector: CSS选择器表达式

context: DOM元素或者文档对象,作为查找元素的上下文,用于限定查找范围。默认值是当前文档对象。

results: 可选的数组或者类数组,把查找到的元素添加到其中。

seed:可选的元素集合,从该集合中过滤出匹配选择器表达式的元素集合。

//修正results, context
results = results || [];
context = context || document;

//备份上下文
var origContext = context;

if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
    return [];
}

if ( !selector || typeof selector !== "string" ) {
    return results;
}
//定义局部变量
var m, set, checkSet, extra, ret, cur, pop, i,
    prune = true,
    contextXML = Sizzle.isXML( context ),
    parts = [],
    soFar = selector;
    // Reset the position of the chunker regexp (start from head)
    do {
        chunker.exec( "" );
        m = chunker.exec( soFar );

        if ( m ) {
            soFar = m[3];

            parts.push( m[1] );

            if ( m[2] ) {
                extra = m[3];
                break;
            }
        }
    } while ( m );
//如果存在位置伪类,则从左向右查找
if ( parts.length > 1 && origPOS.exec( selector ) ) {

    if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
        set = posProcess( parts[0] + parts[1], context, seed );

    } else {
        set = Expr.relative[ parts[0] ] ?
            [ context ] :
            Sizzle( parts.shift(), context );

        while ( parts.length ) {
            selector = parts.shift();

            if ( Expr.relative[ selector ] ) {
                selector += parts.shift();
            }

            set = posProcess( selector, set, seed );
        }
    }

}
/*
* 在指定的上下文数组context下,查找与选择器表达式
* selector匹配的元素集合,并且支持位置伪类。selector
* 由一个块间关系符和一个块表达式组成。
* */
var posProcess = function( selector, context, seed ) {
    var match,
        tmpSet = [],
        later = "",
        root = context.nodeType ? [context] : context;

    // Position selectors must be done after the filter
    // And so must :not(positional) so we move all PSEUDOs to the end
    //删除selector中所以的伪类,并累积在later中。
    while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
        later += match[0];
        selector = selector.replace( Expr.match.PSEUDO, "" );
    }
    //如果删除伪类的选择器表达式中只剩一个块间关系符,则追加一个通配符"*"
    selector = Expr.relative[selector] ? selector + "*" : selector;

    for ( var i = 0, l = root.length; i < l; i++ ) {
        Sizzle( selector, root[i], tmpSet, seed );
    }

    return Sizzle.filter( later, tmpSet );
};

原文地址:https://www.cnblogs.com/Shadowplay/p/9816329.html

时间: 2024-10-29 05:14:42

jquery 1.7.2源码解析(三) 选择器Sizzle的相关文章

转载Aaron ---- jQuery 2.0.3 源码分析core - 选择器

jQuery 2.0.3 源码分析core - 选择器(02) 声明:本文为原创文章,如需转载,请注明来源并保留原文链接Aaron,谢谢! 打开jQuery源码,一眼看去到处都充斥着正则表达式,jQuery框架的基础就是查询了,查询文档元素对象,所以狭隘的说呢,jQuery就是一个选择器,并这个基础上构建和运行查询过滤器! 工欲善其事,必先利其器,所以先从正则入手 我们来分解一个表达式 // A simple way to check for HTML strings // Prioritize

jQuery 2.0.3 源码分析core - 选择器

转载http://www.cnblogs.com/aaronjs/p/3281911.html 声明:本文为原创文章,如需转载,请注明来源并保留原文链接Aaron,谢谢! 打开jQuery源码,一眼看去到处都充斥着正则表达式,jQuery框架的基础就是查询了,查询文档元素对象,所以狭隘的说呢,jQuery就是一个选择器,并这个基础上构建和运行查询过滤器! 工欲善其事,必先利其器,所以先从正则入手 我们来分解一个表达式 // A simple way to check for HTML strin

jquery 1.7.2源码解析(四) 异步队列Deferred Object

异步队列Deferred Object 一)jQuery.Callbacks( flags ) 1.总体结构 该函数返回一个链式工具对象(回调函数列表),用于管理一组回调函数. 2.源码分析 1.工具函数createFlags(flags) 该函数用于将字符串标记转换为对象格式标记,并把转换结果缓存起来. // String to Object flags format cache var flagsCache = {}; // Convert String-formatted flags in

AFNetworking2.0源码解析&lt;三&gt;

本篇说说安全相关的AFSecurityPolicy模块,AFSecurityPolicy用于验证HTTPS请求的证书,先来看看HTTPS的原理和证书相关的几个问题. HTTPS HTTPS连接建立过程大致是,客户端和服务端建立一个连接,服务端返回一个证书,客户端里存有各个受信任的证书机构根证书,用这些根证书对服务端 返回的证书进行验证,经验证如果证书是可信任的,就生成一个pre-master  secret,用这个证书的公钥加密后发送给服务端,服务端用私钥解密后得到pre-master secr

volley源码解析(三)--Volley核心之RequestQueue类

上一篇文章给大家说明了Request<T>的内部结构,对于这个类而言,volley让我们关注的主要请求获得响应以后,怎么根据自己的需要解析响应,然后在主线程中回调监听器的方法,至于是怎么获得响应的,线程又是怎么开启的,都跟Request无关. 前面已经提到,Request会放在队列里面等待线程的提取,RequestQueue类作为volley的核心类,可以说是连接请求与响应的桥梁.另外,RequestQueue类作为一个集合,还给我们统一管理请求带来更大的方便,这样的思想是很值得我们学习的.

Mybatis 源码解析(三) - properties标签

文章个人学习源码所得,若存在不足或者错误之处,请大家指出. Properties配置格式如下: Configuration.xml中: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-c

jQuery源码解读三选择器

直接上jQuery源码截取代码 // Map over jQuery in case of overwrite _jQuery = window.jQuery, // Map over the $ in case of overwrite _$ = window.$, // Define a local copy of jQuery 可以看出创建了jQuery.fn.init这样的一个函数返回给$,这样就可以使用$实例了 jQuery = function (selector, context)

jQuery 源码解析(三十一) 动画模块 便捷动画详解

jquery在$.animate()这个接口上又封装了几个API,用于进行匹配元素的便捷动画,如下: $(selector).show(speed,easing,callback)        ;如果被选元素已被隐藏,则显示这些元素 $(selector).hide(speed,easing,callback)         ;如果被选的元素已被显示,则隐藏该元素 $(selector).toggle(speed,easing,callback)     ;切换元素的可见状态,如果被选元素可

netcore3.0 IConfiguration配置源码解析(三)

前面两篇文章主要讲到netcore的配置以及各种配置源. 本篇主要讲到把配置值转换成C#的实体类,体现在IConfiguration各种扩展方法: public static class ConfigurationBinder { /// <summary> /// Attempts to bind the configuration instance to a new instance of type T. /// If this configuration section has a va