jQuery中的pushStack实现原理和应用实例


Posted in Javascript onFebruary 03, 2015

pushStack是jQuery内核中一个非常重要的函数,它是如此重要,以至于许多jQuery内部函数中都频繁用到它。平常情况下,虽然很少用到它, 但是掌握这个函数,不仅有利于理解jQuery的运行原理,还方便我们做更加高级的jQuery操作。

顾名思义,pushStack是入栈, 栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。数据入栈时,类似与我们进电梯,后进而先出, 如下图:

jQuery中的pushStack实现原理和应用实例

jQuery中的栈其实并不是真正的栈,而是给jQuery对象附加一个属性,指向当前对象的上一个对象, 通过end方法就能返回上一个元素。如下:

<span>1</span>
<span>2</span>
<span>3</span>
<script>
$('span').eq(0).css('fontSize','20px').end().fadeOut(2000);
</script>

上面的代码会使第一个span的字体大小为20px,并让所有span在2秒钟之内fadaout。

pushStack属于jQuery的实例方法,通过jQuery对象调用,如通过$().pushStack(document.getElementsByTagName(‘div')).css(‘background','blue')把所有div的背景都设置为蓝色。那么pushStack的原理是什么,为什么传入的DOM对象可以用css方法操作呢?先来看一下jQuery中pushStack的源码:

pushStack: function( elems ) {
 // Build a new jQuery matched element set
 var ret = jQuery.merge( this.constructor(), elems );
 // Add the old object onto the stack (as a reference)
 ret.prevObject = this;
 ret.context = this.context;
 // Return the newly-formed element set
 return ret;
}
//jQuery.merge
merge: function( first, second ) {
 var l = second.length,
 i = first.length,
 j = 0;
 if ( typeof l === "number" ) {
 for ( ; j < l; j++ ) {
  first[ i++ ] = second[ j ];
 }
 } else {
 while ( second[j] !== undefined ) {
  first[ i++ ] = second[ j++ ];
 }
 }
 first.length = i;
 return first;
}

pushStack的实现比较简单,主要涉及到jQuery的静态方法merge, 这个方法用来合并对象, 设计思路是在第一个对象的基础上,把第二个对象的属性(0至n)附加上去, 理解这一点很重要。再回到pushStack这个函数,首先定义一个局部变量ret存储合并对象,然后给这个对象存储prevObject和context属性,最后返回合并之后的ret对象。这里有几点需要注意:
1, this.constructor 就是jQuery的构造函数init,所以this.constructor()返回一个jQuery对象.
2, 由于jQuery merge函数返回的对象是第二个函数附加到第一个上面,所以ret也是一个jQuery对象,这里可以解释为什么pushStack出入的DOM对象也可以用CSS方法进行操作。
3, 返回的对象的prevObject属性指向上一个对象,所以可以通过这个属性找到栈的上一个对象.

Javascript 相关文章推荐
alert中断settimeout计时功能
Jul 26 Javascript
jQuery多项选项卡的实现思路附样式及代码
Jun 03 Javascript
angularjs中的e2e测试实例
Dec 06 Javascript
iframe里使用JavaScript控制主页转向的方法
Apr 03 Javascript
JavaScript中length属性的使用方法
Jun 05 Javascript
js编写贪吃蛇的小游戏
Aug 24 Javascript
动态创建按钮的JavaScript代码
Jan 29 Javascript
将List对象列表转换成JSON格式的类实现方法
Jul 04 Javascript
javaScript生成支持中文带logo的二维码(jquery.qrcode.js)
Jan 03 Javascript
Node.js与Sails redis组件的使用教程
Feb 14 Javascript
uni app仿微信顶部导航条功能
Sep 17 Javascript
javascript中Set、Map、WeakSet、WeakMap区别
Dec 24 Javascript
JavaScript闭包详解
Feb 02 #Javascript
js实现浏览器窗口大小被改变时触发事件的方法
Feb 02 #Javascript
javascript的switch用法注意事项分析
Feb 02 #Javascript
jQuery实现长按按钮触发事件的方法
Feb 02 #Javascript
jQuery实现跟随鼠标运动图层效果的方法
Feb 02 #Javascript
JavaScript针对网页节点的增删改查用法实例
Feb 02 #Javascript
jQuery通过控制节点实现仅在前台通过get方法完成参数传递
Feb 02 #Javascript
You might like
Sony CFR 320 修复改造
2020/03/14 无线电
虹吸式咖啡探讨–研磨
2021/03/03 冲泡冲煮
使用php+Ajax实现唯一校验实现代码[简单应用]
2011/11/29 PHP
PHP根据IP地址获取所在城市具体实现
2013/11/27 PHP
php将url地址转化为完整的a标签链接代码(php为url地址添加a标签)
2014/01/17 PHP
php读取富文本的时p标签会出现红线是怎么回事
2014/05/13 PHP
ThinkPHP的URL重写问题
2014/06/22 PHP
PHP判断是手机端还是PC端 PHP判断是否是微信浏览器
2017/03/15 PHP
事件模型在各浏览器中存在差异
2010/10/20 Javascript
javascript将数组插入到另一个数组中的代码
2013/01/10 Javascript
用jQuery与JSONP轻松解决跨域访问的问题
2014/02/04 Javascript
浅谈javascript的分号的使用
2015/05/12 Javascript
第七篇Bootstrap表单布局实例代码详解(三种表单布局)
2016/06/21 Javascript
结合代码图文讲解JavaScript中的作用域与作用域链
2016/07/05 Javascript
利用Plupload.js解决大文件上传问题, 带进度条和背景遮罩层
2017/03/15 Javascript
Chart.js 轻量级HTML5图表绘制工具库(知识整理)
2018/05/22 Javascript
JS实现倒序输出的几种常用方法示例
2019/04/13 Javascript
JS实现动态添加外部js、css到head标签的方法
2019/06/05 Javascript
layui 图片上传+表单提交+ Spring MVC的实例
2019/09/21 Javascript
vue-router 中 meta的用法详解
2019/11/01 Javascript
vue页面加载时的进度条功能(实例代码)
2020/01/13 Javascript
Vue element-ui父组件控制子组件的表单校验操作
2020/07/17 Javascript
[01:28:44]DOTA2-DPC中国联赛定级赛 RNG vs iG BO3第一场 1月10日
2021/03/11 DOTA
Python序列操作之进阶篇
2016/12/08 Python
python 第三方库的安装及pip的使用详解
2017/05/11 Python
Python OpenCV对本地视频文件进行分帧保存的实例
2019/01/08 Python
python基于FTP实现文件传输相关功能代码实例
2019/09/28 Python
Python datetime 格式化 明天,昨天实例
2020/03/02 Python
Java如何基于wsimport调用wcf接口
2020/06/17 Python
全网最全python库selenium自动化使用详细教程
2021/01/12 Python
纯css3实现的鼠标悬停动画按钮
2014/12/23 HTML / CSS
GUESS德国官网:美国牛仔服装品牌
2017/02/14 全球购物
美国专业汽车音响和移动电子产品零售商:Car Toys
2019/05/13 全球购物
中文系师范生自荐信
2013/10/01 职场文书
小学美术教学反思
2016/02/17 职场文书
疑《守望先锋2》A测截图泄露 或将推出新模式、新界面
2022/04/03 其他游戏