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

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 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的方法、功能和调用关系

相关文章
|
1月前
|
Kubernetes Cloud Native 微服务
探索云原生技术:容器化与微服务架构的融合之旅
本文将带领读者深入了解云原生技术的核心概念,特别是容器化和微服务架构如何相辅相成,共同构建现代软件系统。我们将通过实际代码示例,探讨如何在云平台上部署和管理微服务,以及如何使用容器编排工具来自动化这一过程。文章旨在为开发者和技术决策者提供实用的指导,帮助他们在云原生时代中更好地设计、部署和维护应用。
|
2月前
|
设计模式 Java API
微服务架构演变与架构设计深度解析
【11月更文挑战第14天】在当今的IT行业中,微服务架构已经成为构建大型、复杂系统的重要范式。本文将从微服务架构的背景、业务场景、功能点、底层原理、实战、设计模式等多个方面进行深度解析,并结合京东电商的案例,探讨微服务架构在实际应用中的实施与效果。
149 6
|
2月前
|
运维 Kubernetes Cloud Native
云原生技术:容器化与微服务架构的完美结合
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术以其灵活性和高效性成为企业的新宠。本文将深入探讨云原生的核心概念,包括容器化技术和微服务架构,以及它们如何共同推动现代应用的发展。我们将通过实际代码示例,展示如何在Kubernetes集群上部署一个简单的微服务,揭示云原生技术的强大能力和未来潜力。
|
2月前
|
设计模式 Java API
微服务架构演变与架构设计深度解析
【11月更文挑战第14天】在当今的IT行业中,微服务架构已经成为构建大型、复杂系统的重要范式。本文将从微服务架构的背景、业务场景、功能点、底层原理、实战、设计模式等多个方面进行深度解析,并结合京东电商的案例,探讨微服务架构在实际应用中的实施与效果。
56 1
|
25天前
|
监控 安全 API
使用PaliGemma2构建多模态目标检测系统:从架构设计到性能优化的技术实践指南
本文详细介绍了PaliGemma2模型的微调流程及其在目标检测任务中的应用。PaliGemma2通过整合SigLIP-So400m视觉编码器与Gemma 2系列语言模型,实现了多模态数据的高效处理。文章涵盖了开发环境构建、数据集预处理、模型初始化与配置、数据加载系统实现、模型微调、推理与评估系统以及性能分析与优化策略等内容。特别强调了计算资源优化、训练过程监控和自动化优化流程的重要性,为机器学习工程师和研究人员提供了系统化的技术方案。
146 77
使用PaliGemma2构建多模态目标检测系统:从架构设计到性能优化的技术实践指南
|
2月前
|
存储 分布式计算 关系型数据库
架构/技术框架调研
本文介绍了微服务间事务处理、调用、大数据处理、分库分表、大文本存储及数据缓存的最优解决方案。重点讨论了Seata、Dubbo、Hadoop生态系统、MyCat、ShardingSphere、对象存储服务和Redis等技术,提供了详细的原理、应用场景和优缺点分析。
|
1月前
|
运维 Cloud Native 持续交付
云原生技术深度探索:重塑现代IT架构的无形之力####
本文深入剖析了云原生技术的核心概念、关键技术组件及其对现代IT架构变革的深远影响。通过实例解析,揭示云原生如何促进企业实现敏捷开发、弹性伸缩与成本优化,为数字化转型提供强有力的技术支撑。不同于传统综述,本摘要直接聚焦于云原生技术的价值本质,旨在为读者构建一个宏观且具体的技术蓝图。 ####
|
2月前
|
Cloud Native 持续交付 云计算
云原生技术在现代IT架构中的转型力量####
本文深入剖析了云原生技术的精髓,探讨其在现代IT架构转型中的关键作用与实践路径。通过具体案例分析,展示了云原生如何赋能企业实现更高效的资源利用、更快的迭代速度以及更强的系统稳定性,为读者提供了一套可借鉴的实施框架与策略。 ####
28 0
|
2月前
|
运维 Kubernetes Docker
深入理解容器化技术及其在微服务架构中的应用
深入理解容器化技术及其在微服务架构中的应用
68 1
|
2月前
|
监控 Java 微服务
从零构建微服务架构:一次深度技术探索之旅####
本文作为一篇深度技术分享,引领读者踏上自底向上搭建微服务架构的征途,旨在通过实战经验剖析,揭示微服务转型背后的技术挑战与解决方案。不同于常规摘要仅概述内容,本文摘要将直接以故事化手法,简述作者从单体应用困境出发,逐步迈向微服务化的心路历程,涵盖关键决策点、技术选型考量及实践收获,激发读者对微服务架构设计与实现的浓厚兴趣。 ####