在jQuery构造器一节中,我们介绍了init()构造函数处理选择器字符串的第四种情况,截取代码如下所示。
广州网站建设,网站建设,广州网页设计,广州网站设计
- } else
- //第四种情况,处理jQuery(expression, [context]),
- //例如,$("div .red")的表达式字符串
- return jQuery( context ).find( selector );
在这里,jQuery调用了jQuery对象的find()方法来处理选择器字符串。find()方法的代码如下所示。
- find: function( selector ) {
- //当表达式不包含","符号时
- if ( this.length === 1 ) {
- var ret = this.pushStack( [], "find", selector );
- ret.length = 0;
- jQuery.find( selector, this[0], ret );
- return ret;
- //当表达式包含","符号时
- } else {
- return this.pushStack( jQuery.unique(jQuery.map(this, function(elem){
- return jQuery.find( selector, elem );
- })), "find", selector );
- }
- }
- }
首先,我们来分析一下pushStack()方法。
广州网站建设,网站建设,广州网页设计,广州网站设计
- jQueryjQuery.fn = jQuery.prototype = {
- // 获取多个元素的数组,并把它推入到堆栈中
- // 返回新的匹配元素的数据集合
- pushStack: function( elems, name, selector ) {
- //新建一个jQuery对象结构的匹配元素数据集合
- var ret = jQuery( elems );
- //将上个对象的引用推入栈中
- ret.prevObject = this;
- ret.context = this.context;
- //当关键字为find时,在原有selector的基础上,继续增加selector
- //例如,$("div").find("p") 意思就是 $("div p")
- if ( name === "find" )
- ret.selector = this.selector + (this.selector ? " " : "") + selector;
- else if ( name )
- ret.selector = this.selector + "." + name + "(" + selector + ")";
- // 返回最新的jQuery对象
- return ret;
- }
- }
注意:ret.prevObject = this;这个方法在$().andSelf()和$().end()中调用,对于筛选或查找后的元素,返回前一次元素状态是非常有用的。
接着,就调用 jQuery.find( selector, this[0], ret );。而jQuery.find()函数是引用Sizzle对象的,首先看下面这几行代码。
- jQuery.find = Sizzle;
- jQuery.filter = Sizzle.filter;
- jQuery.expr = Sizzle.selectors;
- jQuery.expr[":"] = jQuery.expr.filters;
- //……
- return;
- window.Sizzle = Sizzle;
在这里应用了JavaScript设计模式中的适配器模式,jQuery.find调用的是Sizzle对象。Sizzle对象的代码可以参阅上一节说明,其中有如下一段,它调用了Sizzle.find()函数。
广州网站建设,网站建设,广州网页设计,广州网站设计
- var ret = seed ?
- { expr: parts.pop(), set: makeArray(seed) } :
- Sizzle.find( parts.pop(), parts.length === 1 && context.parentNode ? context.parentNode : context, isXML(context) );



