jQuery之end()和pushStack()使用介绍


Posted in Javascript onFebruary 07, 2012

但在我们自己写jQuery代码的时候,却很少关注或使用过pushStack(). 如果我们需要写个涉及DOM遍历的插件,它就会显得尤其有用.

在jQuery内部,pushStack()方法通过改变一个jQuery对象的prevObject属性来"跟踪"链式调用中前一个方法返回的DOM结果集(被jQuery封装过,也是个jQuery对象,说是"跟踪",是因为实际存储的是个引用). 当我们再链式调用end()方法后, 内部就返回当前jQuery对象的prevObject. 具体更多细节, 直接看源码即可. 这里只做个简单的分析, 直接来个例子:

html:

<div id="grandparent"> 
I am grandparent. 
<div id="parent"> 
I am parent. 
<div id="child"> 
I am child. 
</div> 
</div> 
</div>

javascript:
var els = $('#child').parent().parent(); 
console.dir(els);

图解:

jQuery之end()和pushStack()使用介绍

了解这个之后, 我们来做一个grandparent插件,用来替代.parent().parent()这样连续2次的调用,直接用.grandparent().如果"一不小心"没考虑end()的话,代码很可能就是这个样子的:
$.fn.grandparent = function() { 
return this.parent().parent(); 
};

依旧用上面那个例子:
$('#child').grandparent().end(); //jQuery-[div#parent]

很显然, 大多数情况下这不是我们想要的, 事实上我们想通过链式调用end()直接返回到jquery[div#child]. 现在该是pushStack出马的时候了,我们只要加上一行即可:

$.fn.grandparent = function() { 
var els = this.parent().parent(); 
return this.pushStack(els.get()); 
};

在pushStack内部, 把els.get()返回的DOM数组封装成一个新的jQuery对象, 而this(jQuery[div#child])会赋值给之前新构建jQuery的prevObject, 最后返回新生的那个jQuery对象.

所以这次, 当我们再用end()就对了:

var grandparent = $('#child').grandparent()./* jquery-[div#grandparent]*/.end() /*jquery-[div#child]*/

此博文内容的主体思想来自Learning JQuery中的一篇博客, 感谢该作者的分享. 感兴趣的话, 点击jQuery pushStack.

Javascript 相关文章推荐
基于jquery的一个图片hover的插件
Apr 24 Javascript
jQuery中将函数赋值给变量的调用方法
Mar 23 Javascript
原生js操作checkbox用document.getElementById实现
Oct 12 Javascript
javascript实现图片上传前台页面
Aug 18 Javascript
简单谈谈Javascript中类型的判断
Oct 19 Javascript
BootStrap实现邮件列表的分页和模态框添加邮件的功能
Oct 13 Javascript
Bootstrap进度条与AJAX后端数据传递结合使用实例详解
Apr 23 Javascript
jQuery实现的手动拖动控制进度条效果示例【测试可用】
Apr 18 jQuery
深入理解移动前端开发之viewport
Oct 19 Javascript
Vue中computed、methods与watch的区别总结
Apr 10 Javascript
高性能js数组去重(12种方法,史上最全)
Dec 21 Javascript
JS实现手写 forEach算法示例
Apr 29 Javascript
详解强大的jQuery选择器之基本选择器、层次选择器
Feb 07 #Javascript
JavaScript 5 新增 Array 方法实现介绍
Feb 06 #Javascript
ASP.NET jQuery 实例18 通过使用jQuery validation插件校验DropDownList
Feb 03 #Javascript
ASP.NET jQuery 实例17 通过使用jQuery validation插件校验ListBox
Feb 03 #Javascript
ASP.NET jQuery 实例16 通过控件CustomValidator验证RadioButtonList
Feb 03 #Javascript
ASP.NET jQuery 实例15 通过控件CustomValidator验证CheckBoxList
Feb 03 #Javascript
ASP.NET jQuery 实例14 在ASP.NET form中校验时间范围
Feb 03 #Javascript
You might like
php URL编码解码函数代码
2009/03/10 PHP
php 服务器调试 Zend Debugger 的安装教程
2009/09/25 PHP
PHP之生成GIF动画的实现方法
2013/06/07 PHP
PHP获取POST数据的几种方法汇总
2015/03/03 PHP
php实现统计网站在线人数的方法
2015/05/12 PHP
php实现批量删除挂马文件及批量替换页面内容完整实例
2016/07/08 PHP
php实现等比例不失真缩放上传图片的方法
2016/11/14 PHP
php使用pecl方式安装扩展操作示例
2019/08/12 PHP
ThinkPHP 5.x远程命令执行漏洞复现
2019/09/23 PHP
JS字符串处理实例代码
2013/08/05 Javascript
JavaScript使用push方法添加一个元素到数组末尾用法实例
2015/04/06 Javascript
JQuery中DOM加载与事件执行实例分析
2015/06/13 Javascript
jQuery实现的手机发送验证码倒计时效果代码分享
2015/08/24 Javascript
jQuery中的each()详细介绍(推荐)
2016/05/25 Javascript
跨域请求的完美解决方法(JSONP, CORS)
2016/06/12 Javascript
详解js中的apply与call的用法
2016/07/30 Javascript
jquery移除了live()、die(),新版事件绑定on()、off()的方法
2016/10/26 Javascript
常用原生js自定义函数总结
2016/11/20 Javascript
原生js实现无限循环轮播图效果
2017/01/20 Javascript
解决select2在bootstrap modal中不能正常使用的问题
2018/08/09 Javascript
使用vue实现多规格选择实例(SKU)
2019/08/23 Javascript
[02:13] 完美世界DOTA2联赛PWL DAY5集锦
2020/11/03 DOTA
Python、PyCharm安装及使用方法(Mac版)详解
2017/04/28 Python
pandas去重复行并分类汇总的实现方法
2019/01/29 Python
Python连接Impala实现步骤解析
2020/08/04 Python
Python如何把字典写入到CSV文件的方法示例
2020/08/23 Python
ET Mall东森购物网:东森严选
2017/03/06 全球购物
办公室副主任岗位职责
2013/11/25 职场文书
便利店的创业计划书
2014/01/15 职场文书
金融事务专业求职信
2014/04/25 职场文书
习总书记三严三实学习心得体会
2014/10/13 职场文书
有限责任公司股东合作协议书范本
2014/10/30 职场文书
2015年汽车销售工作总结
2015/04/07 职场文书
2016天猫双十一广告语
2016/01/28 职场文书
经典哲理警句:志不真则心不热,心不热则功不贤
2019/11/14 职场文书
Python机器学习应用之工业蒸汽数据分析篇详解
2022/01/18 Python