jQuery的CSS选择器引擎Sizzle共有1000多行代码,占据了jQuery框架四分之一的份额。这些代码被直接调用的匿名函数封装在一个独立的空间中,外界是无法访问的。通过下面代码可以把引擎接口传递给jQuery空间下的四个公共函数。
广州网站建设,网站建设,广州网页设计,广州网站设计
- jQuery.find = Sizzle;
- jQuery.filter = Sizzle.filter;
- jQuery.expr = Sizzle.selectors;
- jQuery.expr[":"] = jQuery.expr.filters;
Sizzle引擎在jQuery框架中的位置犹如咽喉,起到了核心作用,如图2.4所示。在下面的jQuery选择器逻辑流程图中,首先,对传入的选择符参数进行过滤,只有是表达式字符串时,才会进入jQuery.fn.find()入口,然后进入Sizzle接口(jQuery.find()),在Sizzle构造器中分别调用Sizzle.find()和Sizzle.filter()函数完成选择和过滤操作。
![]() |
| 图2.4 Sizzle引擎在jQuery框架中的工作流程图 |
在选择(Sizzle.find())和过滤(Sizzle.filter())操作过程中,都会经过这样的处理流程:匹配简单的选择器类型(To match singleselector type)。
- ID选择器
- Name
- Class选择器
- 类型选择器
- ……
对于选择器(Sizzle.find())来说,它会调用Expr.find[ type ],而对于过滤器(Sizzle.filter())来说,它会调用Expr.filter[ type ],最后分别返回Sizzle.find()和Sizzle.filter()。
在 Sizzle.filter()过程中,它还需要检测关系选择符是否存在(To check any relative exists?)。如果存在,则调用Expr. relative[],最后返回结果集。
下面对Sizzle引擎的主体结构进行简单的分析。
广州网站建设,网站建设,广州网页设计,广州网站设计
- /*!
- * Sizzle CSS Selector Engine - v0.9.3
- * Copyright 2009, The Dojo Foundation
- * Released under the MIT, BSD, and GPL Licenses.
- * More information: http://sizzlejs.com/
- */
- //把Sizzle引擎封装在一个独立的空间中
- (function(){
- //定义用于块识别器的正则表达式
- var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]| ['"][^'"]*['"]|[^[\]'"] +)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,
- done = 0,
- toString = Object.prototype.toString;
- // Sizzle选择器引擎构造器函数
- //参数说明:
- // selector:选择器字符串
- // context:上下文
- // results:结果集
- // seed:种子
- var Sizzle = function(selector, context, results, seed) {
- //省略的函数体
- };
- // Sizzle匹配函数
- //参数说明:
- // expr:匹配表达式
- // set:条件设置选项
- Sizzle.matches = function(expr, set){
- return Sizzle(expr, null, null, set);
- };
- // Sizzle查询函数
- //参数说明:
- // expr:查询表达式
- // context:上下文
- // isXML:检测函数
- Sizzle.find = function(expr, context, isXML){
- //省略的函数体
- };
- // Sizzle过滤函数
- //参数说明:
- // expr:过滤表达式
- // set:条件设置选项
- // inplace:包含项
- // not:排除项
- Sizzle.filter = function(expr, set, inplace, not){
- //省略的函数体
- };
- // Sizzle表达式对象
- //列举所用的各种匹配表达式
- var Expr = Sizzle.selectors = {
- //省略成员属性
- };
- //省略其他辅助性工具函数和逻辑代码暴露的接口
- jQuery.find = Sizzle;
- jQuery.filter = Sizzle.filter;
- jQuery.expr = Sizzle.selectors;
- jQuery.expr[":"] = jQuery.expr.filters;
- //定义的公共函数
- Sizzle.selectors.filters.hidden = function(elem){};
- Sizzle.selectors.filters.visible = function(elem){};
- Sizzle.selectors.filters.animated = function(elem){};
- jQuery.multiFilter = function( expr, elems, not ) {};
- jQuery.dir = function( elem, dir ){};
- jQuery.nth = function(cur, result, dir, elem){};
- jQuery.sibling = function(n, elem){};
- return;
- window.Sizzle = Sizzle;
- })();
通过上面的结构分析,可以看到Sizzle引擎主要包含一个构造器Sizzle(),三个核心功能函数matches()、find()和filter(),以及一个表达式对象selectors。下面分别对它们进行讲解。




