`
adamed
  • 浏览: 183822 次
社区版块
存档分类
最新评论

jQuery源码历代记5

 
阅读更多

 

之前文章传送门:http://adamed.iteye.com/category/207898

 

下面要介绍的jQuery构造器中的方法是入栈、出栈方法:

 他们分别是pushStack和end。

先看下putStack的API描述

.pushStack( elements )

elements  An array of elements to push onto the stack and make into a new jQuery object. 

 

 

Description: Add a collection of DOM elements onto the jQuery stack.
 

 

之前我们一直说jQuery集合是一个类似于数组的数据结构,那么它是如何构成的呢?我们看下pushStack的源码:

 

 

pushStack : function( a , args ) {
    var fn = args && args[args.length - 1];
    if ( !fn || fn.constructor != Function ) {
        if ( !this.stack ) this.stack = [];
        this.stack.push( this.get() );
        this.get( a );
    } else {
        var old = this.get();
        this.get( a );
        if ( fn.constructor == Function ) return this.each( fn );
        this.get( old );
    }
    return this;
}
 

 

 

这里有一个小问题点在于逻辑与运算符的返回值。

由于&&既不改变运算元的数据类型,也不强制运算结果的数据类型。所以我们测试:

var a = "abc"&&"bcd";

alert(a);

我们看到弹出框返回的值为"bcd",当然如果将表达式前面的"abc"换成null则最后也会返回值null。

综上args && args[args.length - 1];返回值为:若args为null则返回null否则返回args的最后一个元素,并将结果付给变量fn。

下面的代码判断若fn不存在或者fn不为function则执行以下逻辑(修改jQuery这个数组对象内容):

1、判断当前jQuery对象中是否包含变量stack若不包含则新建一个数组给它。

2、将当前对象放置如数组中。

3、将a放入数组中。

这里出现第2个小问题: this.stack.push( this.get() );      this.get( a ); 这2句是做什么的?

第1句是执行this.get()并将结果放入stack数组中,而第2句this.get(a)只是执行,并没有对返回结果做任何操作。有什么作用呢?

请大家注意.pushStack( elements ) 中elements 的定义是  An array of elements

所以this.get(a)将执行的代码是:

 

 

 

get : function( num ) {
    if ( num && num.constructor == Array ) {
        this.length = 0;
        [ ].push.apply( this , num );
        return this;
    }
}
 

 

 

 

其结果是将当前jQuery结果集清空并将a放入其中。

所以this.stack.push( this.get() );      this.get( a );这2句的意思就是将原来的结果集保存进this.stack将新结果集放入this。

那么下面那个else中的4句话:

var old = this.get();

this.get( a );

if ( fn.constructor == Function ) return this.each( fn );

this.get( old );

的意思就是说:

1、将老结果集保存进变量old。

2、将this指定为新结果集。

3、对新结果集每个元素上执行fn。

4、回复this为老结果集。

 

//**********************这是分隔符********************************上面只是从源码的角度逐句阐述了每条语句的意思,但是会有些知其然不知其所以然的感觉。

后面会在讲解用到pushStack方法的find方法时回头重新梳理一下执行过程帮助理解为什么要这样写。

 

//**********************这是分隔符********************************

下面介绍的是出栈方法end:

 

 

end : function() {
    return this.get( this.stack.pop() );
}
 

 


end方法可以很好说明pushStack方法中this.stack的作用:

.end()

 

 

 Description: End the most recent filtering operation in the current chain and return the set of matched elements to its previous state. 

 

举例说明一下:

HTML代码:

 

 

 

<p>text</p>
<p class="middle">Middle</p>
<p>text</p>
 

 

 

JS代码:

 

alert($('p').filter('middle').length);//alerts 1
alert($('p').filter('middle').end().length);//alerts 3
 

 

 很明显的证明end就是恢复由于过滤类方法(add、filter等)对结果集造成的影响。

//**********************这是分隔符********************************

下面就介绍会影响结果集的几个方法:find、clone、filter、not、add

 第一个介绍的是find,作用是查找结果集中各元素的子元素。

.find( selector )

selector A string containing a selector expression to match elements against.

 

 

 

Description: Get the descendants of each element in the current set of matched elements, filtered by a selector, jQuery object, or element.
 

距离说明:

HTML代码

 

<p>aaa<em>aaa</em></p>
<p>aaa<em>aaa</em></p>
<p>aaaaaa</p>
 

 

JS代码

 

 alert($("p").find('em').length);//alerts 2
 

 

 

 

 //**********************这是分隔符********************************

 

 

find : function( t ) {
    return this.pushStack( jQuery.map( this , function( a ) { return jQuery.find( t , a ); } ) , arguments);
}
 

 

我们结合上面的例子讲解代码:

其中使用了jQuery的map方法,该方法在jQuery源码历代记1中已经剖析过了,这里只是重复一下map的作用:

根据jQuery.map() 的API的描述,该方法的作用是:

Description: Translate all items in an array or object to new array of items.
 

 

jQuery.map( array, callback(elementOfArray, indexInArray) )

 

array  The Array to translate.

callback(elementOfArray, indexInArray)   The function to process each item against. The first argument to the function is the array item, the second argument is the index in array The function can return any value. Within the function, this refers to the global (window) object.

//**********************这是分隔符********************************

jQuery.map( this , function( a ) { return jQuery.find( t , a ); }的含义是对于this中的每一个元素执行jQuery.find方法并将结果以数组形式返回。jQuery.find顾名思义就是在上下文a中查找t。(jQuery.find方法的源码非常的长,稍后专门剖析)所以这1句的含义就是遍历集合的每一个元素,将元素中匹配t的元素找出来整合成一个新的数组(下面用子结果集数组来表示这个结果数组)。

我们回顾上面的例子: alert($("p").find('em').length);//alerts 2

$("p")的结果包含3个p元素,执行find('em')后:jQuery.map( this , function( a ) { return jQuery.find( t , a ); }

导致结果为:['<em>aaa</em>','<em>aaa</em>'](注意这里数组的内容不应该是字符串,此处写成字符串主要是帮助理解)

this.pushStack(['<em>aaa</em>','<em>aaa</em>'], arguments);的执行过程为:

 

pushStack : function( a , args ) {
    //这里a为数组:['<em>aaa</em>','<em>aaa</em>']
    //这里的args为:'em'
    var fn = args && args[args.length - 1];
    //这里的fn为'em'
    if ( !fn || fn.constructor != Function ) {
    //fn符合此判断
        if ( !this.stack ) this.stack = [ ];
        //将原结果集3个p元素存放至this.stack
        this.stack.push( this.get() );
        //将结果集更新为2个新em元素的内容
        this.get( a );
    }
}
 

//**********************这是分隔符********************************

我们下面用大量的篇幅阐述一下jQuery.find的源码~~ 

 

未完待续~~~

 

分享到:
评论
2 楼 adamed 2012-04-05  
zhangwenzhuo 写道
为什么this.get()会返回本身的呢?


源码历代记1里最后说了
1 楼 zhangwenzhuo 2012-04-02  
为什么this.get()会返回本身的呢?

相关推荐

    jQuery源码 jQuery源码 jQuery源码

    jQuery源码jQuery源码jQuery源码jQuery源码jQuery源码jQuery源码jQuery源码jQuery源码jQuery源码jQuery源码jQuery源码jQuery源码jQuery源码jQuery源码jQuery源码jQuery源码jQuery源码jQuery源码jQuery源码jQuery源码...

    JQuery源码详细中文注释_Jquery源码分析_

    《jQuery源码深度解析》 jQuery,作为一款广泛使用的JavaScript库,因其简洁的API和强大的功能,深受开发者喜爱。本文将深入探讨jQuery 1.2.6版本的源码,结合其中的中文注释,帮助读者理解其内部机制,提升...

    Jquery源码分析 源码

    5. **源码解析** - **Sizzle选择器**:解析CSS选择器,使用栈和队列数据结构实现高效的匹配算法。 - **DOM遍历与操作**:通过数组操作实现对DOM集合的操作,如.each()遍历,.slice()切片,.splice()修改。 - **...

    jQuery源码分析系列.pdf

    ### jQuery源码分析系列知识点概览 #### 一、总体架构与核心概念 - **前言开光**:介绍分析jQuery源码的目的和价值,强调通过深入研究源码,可以学习到先进的设计理念和实践技巧。 - **总体架构**:解析jQuery的...

    基于jQuery的HTML5移动端音乐播放器源码.zip

    基于jQuery的HTML5移动端音乐播放器源码 基于jQuery的HTML5移动端音乐播放器源码 基于jQuery的HTML5移动端音乐播放器源码 基于jQuery的HTML5移动端音乐播放器源码 基于jQuery的HTML5移动端音乐播放器...

    jquery源码,3.7.0版本

    jquery源码,3.7.0版本

    jquery源码分析

    jquery源码分析,包括入口技术,选择器入口,以及在选择器使用的时候需要注意的优化思路

    Head First jquery源码

    《Head First jQuery源码》是一本深入解析jQuery库的书籍,其内容主要涵盖了jQuery的核心功能、设计理念以及实现机制。jQuery是JavaScript的一个库,它极大地简化了网页中的DOM操作、事件处理、动画效果以及Ajax交互...

    jquery源码框架解读

    5. **插件机制**:jQuery的插件机制是其强大之处,开发者可以利用$.fn.extend方法扩展jQuery对象,创建自定义功能。许多优秀的开源插件,如jQuery UI、jQuery Validation,都是基于这一机制。 6. **性能优化**:...

    Head First jQuery源码

    5. **动画效果**:jQuery的`animate()`函数可以创建自定义动画,而`fadeIn()`, `fadeOut()`, `slideToggle()`等预定义动画则提供了一键式的便利。查看源码能帮助我们理解动画实现的细节。 6. **Ajax交互**:jQuery...

    jQuery源码+中文详细注解

    ### jQuery源码+中文详细注解 #### 一、引言 本文档是对jQuery源码进行中文注解的详细介绍,旨在帮助广大前端开发者更深入地理解jQuery的核心逻辑和技术要点。通过对核心部分的逐行注解,可以更好地掌握jQuery的...

    jquery源码(1.4)

    jquery最新源码jquery最新源码jquery最新源码

    jQuery源码分析-插件

    jQuery源码分析-插件

    jQuery源码分析视频教程

    jQuery源码分析视频教程总计116课,按照jquery每个区段实现的内容,精确地讲解源码中是怎么实现我们开发中用到的jquery得方法的

    jQuery源码分析系列中文PDF版

    资源名称:jQuery源码分析系列 中文PDF版内容简介:jQuery凭借简洁的语法和跨平台的兼容性,极大地简化了Javascript开发开发人员遍历HTML文档、操作DOM、处理事件、执行动画和开发Ajax的操作。其独特而又优雅...

    jquery api, jquery ui api, jquery源码分析

    **jQuery API** jQuery 是一款广泛使用的 JavaScript 库,它的出现极大地简化了网页的 ...通过学习jQuery API、jQuery UI API以及源码分析,开发者不仅可以提升开发效率,还能编写出更高效、更优雅的JavaScript代码。

    jQuery源码解读

    在源码解读中,我们可以看到jQuery的设计思路和实现机制。 首先,jQuery的核心设计是基于JavaScript的闭包特性,以避免命名冲突。整个jQuery库被包裹在一个立即执行的匿名函数中,这样可以确保其中定义的所有函数和...

    jquery 源码分析

    《jQuery源码分析详解》 jQuery,作为一款广泛使用的JavaScript库,极大地简化了网页的DOM操作、事件处理、动画制作以及Ajax交互。深入理解jQuery的源码,不仅可以提升我们的编程技巧,更能帮助我们优化代码,提高...

Global site tag (gtag.js) - Google Analytics