jQuery技术内幕:深入解析jQuery架构设计与实现原理. 3.1 总体结构

简介:

3.1 总体结构

Sizzle的总体源码结构如代码清单3-1所示,为了方便解释,代码中增加了注释:

代码清单3-1  Sizzle 的总体源码结构

(function(){

   // 选择器引擎入口,查找与选择器表达式 selector 匹配的元素集合

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

   // 工具方法,排序、去重

   Sizzle.uniqueSort = function( results )  { ... };

   // 便捷方法,使用指定的选择器表达式 expr 对元素集合 set 进行过滤

   Sizzle.matches = function( expr, set )  { ... };

   // 便捷方法,检查某个元素 node 是否匹配选择器表达式 expr

   Sizzle.matchesSelector = function( node, expr )  { ... };

   // 内部方法,对块表达式进行查找

   Sizzle.find = function( expr, context, isXML )  { ... };

   // 内部方法,用块表达式过滤元素集合

   Sizzle.filter = function( expr, set, inplace, not )  { ... };

   // 工具方法,抛出异常

   Sizzle.error = function( msg )  { ... };

   // 工具方法,获取 DOM 元素集合的文本内容

   var getText = Sizzle.getText = function( elem )  { ... };

   // 扩展方法和属性

   var Expr = Sizzle.selectors = {

       // 块表达式查找顺序

       order: [ "ID", "NAME", "TAG" ],

       // 正则表达式集,用于匹配和解析块表达式

       match:  { ID, CLASS, NAME, ATTR, TAG, CHILD, POS, PSEUDO },

       leftMatch:  { ... },

       // 属性名修正函数集

       attrMap: { "class", "for" },

       // 属性值读取函数集

       attrHandle:  { href, type },

       // 块间关系过滤函数集

       relative: { "+", ">", "", "~" },

       // 块表达式查找函数集

       find: { ID, NAME, TAG },

       // 块表达式预过滤函数集

       preFilter: { CLASS, ID, TAG, CHILD, ATTR, PSEUDO, POS },

       // 伪类过滤函数集

       filters: { enabled, disabled, checked, selected, parent, empty, has, header,

       text, radio, checkbox, file, password, submit, image, reset, button, input,

       focus },

       // 位置伪类过滤函数集

       setFilters: { first, last, even, odd, lt, gt, nth, eq },

       // 块表达式过滤函数集

       filter: { PSEUDO, CHILD, ID, TAG, CLASS, ATTR, POS }

   };

 

   // 如果支持方法 querySelectorAll(),则调用该方法查找元素

   if ( document.querySelectorAll ) {

       (function(){

           var oldSizzle = Sizzle;

           Sizzle = function( query, context, extra, seed ) {

               // 尝试调用方法 querySelectorAll() 查找元素

               // 如果上下文是 document,则直接调用 querySelectorAll() 查找元素

               return makeArray( context.querySelectorAll(query), extra );

               // 如果上下文是元素,则为选择器表达式增加上下文,然后调用 querySelectorAll()

               // 查找元素

               return makeArray( context.querySelectorAll( "[id='" + nid + "'] " +

               query ), extra );

               // 如果查找失败,则仍然调用 oldSizzle()

               return oldSizzle(query, context, extra, seed);

           };

       })();

   }

 

   // 如果支持方法 matchesSelector(),则调用该方法检查元素是否匹配选择器表达式

   (function(){

       var matches = html.matchesSelector

                        || html.mozMatchesSelector

                        || html.webkitMatchesSelector

                        || html.msMatchesSelector;

       // 如果支持方法 matchesSelector()

       if ( matches ) {

           Sizzle.matchesSelector = function( node, expr ) {

               // 尝试调用方法 matchesSelector()

               var ret = matches.call( node, expr );

               return ret;

               // 如果查找失败,则仍然调用 Sizzle()

               return Sizzle(expr, null, null, [node]).length > 0;

           };

       }

   })();

 

   // 检测浏览器是否支持 getElementsByClassName()

   (function(){

       Expr.order.splice(1, 0, "CLASS");

       Expr.find.CLASS = function( match, context, isXML )  { ... };

   })();

   // 工具方法,检测元素 a 是否包含元素 b

   Sizzle.contains = function( a, b ) { ... };

})();

代码清单3-1中的变量Expr与Sizzle.selectors指向了同一个对象,这么做是为了减少拼写字符数、缩短作用域链,并且方便压缩。但是为了直观和避免混淆,本章在描述中统一使用Sizzle.selectors。

代码清单3-1中已经介绍了浏览器支持方法querySelectorAll()时的查找过程,本章后面的内容将介绍和分析在不支持的情况下,Sizzle是如何模拟方法querySelectorAll()的行为的。另外,为了简化描述,在后文中把“块表达式查找函数集”“块表达式预过滤函数集”“块表达式过滤函数集”分别简称为“查找函数集”“预过滤函数集”“过滤函数集”。

代码清单3-1中的方法和属性大致可以分为4类:公开方法、内部方法、工具方法、扩展方法及属性。它们之间的调用关系如图3-1所示。

 

图3-1 Sizzle的方法、功能和调用关系

相关文章
|
2月前
|
运维 负载均衡 微服务
|
2月前
|
数据采集 机器学习/深度学习 人工智能
YOLOv11浅浅解析:架构创新
YOLOv11是YOLO系列最新升级版,通过C3k2模块、SPPF优化和解耦检测头等创新,显著提升检测精度与速度,mAP提高2-5%,推理更快,支持多平台部署,适用于工业、安防、自动驾驶等场景。
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
34_GPT系列:从1到5的架构升级_深度解析
大型语言模型(LLM)的发展历程中,OpenAI的GPT系列无疑扮演着至关重要的角色。自2018年GPT-1问世以来,每一代GPT模型都在架构设计、预训练策略和性能表现上实现了质的飞跃。本专题将深入剖析GPT系列从1.17亿参数到能够处理百万级token上下文的技术演进,特别关注2025年8月8日发布的GPT-5如何引领大模型技术迈向通用人工智能(AGI)的重要一步。
|
2月前
|
机器学习/深度学习 人工智能 搜索推荐
从零构建短视频推荐系统:双塔算法架构解析与代码实现
短视频推荐看似“读心”,实则依赖双塔推荐系统:用户塔与物品塔分别将行为与内容编码为向量,通过相似度匹配实现精准推送。本文解析其架构原理、技术实现与工程挑战,揭秘抖音等平台如何用AI抓住你的注意力。
509 7
从零构建短视频推荐系统:双塔算法架构解析与代码实现
|
1月前
|
存储 监控 安全
132_API部署:FastAPI与现代安全架构深度解析与LLM服务化最佳实践
在大语言模型(LLM)部署的最后一公里,API接口的设计与安全性直接决定了模型服务的可用性、稳定性与用户信任度。随着2025年LLM应用的爆炸式增长,如何构建高性能、高安全性的REST API成为开发者面临的核心挑战。FastAPI作为Python生态中最受青睐的Web框架之一,凭借其卓越的性能、强大的类型安全支持和完善的文档生成能力,已成为LLM服务化部署的首选方案。
|
2月前
|
存储 监控 NoSQL
Redis高可用架构全解析:从主从复制到集群方案
Redis高可用确保服务持续稳定,避免单点故障导致数据丢失或业务中断。通过主从复制实现数据冗余,哨兵模式支持自动故障转移,Cluster集群则提供分布式数据分片与水平扩展,三者层层递进,保障读写分离、容灾切换与大规模数据存储,构建高性能、高可靠的Redis架构体系。
|
2月前
|
Java 数据库 数据安全/隐私保护
Spring Boot四层架构深度解析
本文详解Spring Boot四层架构(Controller-Service-DAO-Database)的核心思想与实战应用,涵盖职责划分、代码结构、依赖注入、事务管理及常见问题解决方案,助力构建高内聚、低耦合的企业级应用。
713 1
|
1月前
|
机器学习/深度学习 自然语言处理 监控
23_Transformer架构详解:从原理到PyTorch实现
Transformer架构自2017年Google发表的论文《Attention Is All You Need》中提出以来,彻底改变了深度学习特别是自然语言处理领域的格局。在短短几年内,Transformer已成为几乎所有现代大型语言模型(LLM)的基础架构,包括BERT、GPT系列、T5等革命性模型。与传统的RNN和LSTM相比,Transformer通过自注意力机制实现了并行化训练,极大提高了模型的训练效率和性能。

热门文章

最新文章

推荐镜像

更多
  • DNS