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 相关文章推荐
javascript 哈希表(hashtable)的简单实现
Jan 20 Javascript
HTML DOM的nodeType值介绍
Mar 31 Javascript
javascript中将Object转换为String函数代码 (json str)
Apr 29 Javascript
js+xml生成级联下拉框代码
Jul 24 Javascript
使用delegate方法为一个tr标签加一个链接
Jun 27 Javascript
node.js中的require使用详解
Dec 15 Javascript
初识Javascript小结
Jul 16 Javascript
JS获取月份最后天数、最大天数与某日周数的方法
Dec 08 Javascript
详解vue slot插槽的使用方法
Jun 13 Javascript
详解react-webpack2-热模块替换[HMR]
Aug 03 Javascript
深入理解Vue router的部分高级用法
Aug 15 Javascript
一文彻底理解js原生语法prototype,__proto__和constructor
Oct 24 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 遍历XP文件夹下所有文件
2008/11/27 PHP
php编程每天必学之验证码
2016/03/03 PHP
PHP编程实现微信企业向用户付款的方法示例
2017/07/26 PHP
PHP的new static和new self的区别与使用
2019/11/27 PHP
thinkphp5.1 框架导入/导出excel文件操作示例
2020/05/25 PHP
JS实现静止元素自动移动示例
2014/04/14 Javascript
JQuery控制Radio选中方法分析
2015/05/29 Javascript
js贪吃蛇网页版游戏特效代码分享(挑战十关)
2015/08/24 Javascript
jquery左右全屏大尺寸多图滑动效果代码分享
2015/08/28 Javascript
jQuery插件echarts去掉垂直网格线用法示例
2017/03/03 Javascript
微信小程序 MD5的方法详解及实例代码
2017/03/10 Javascript
详解webpack打包vue时提取css
2017/05/26 Javascript
JS图片预加载插件详解
2017/06/21 Javascript
vue路由对不同界面进行传参及跳转的总结
2019/04/20 Javascript
vue-router二级导航切换路由及高亮显示的实现方法
2019/07/10 Javascript
JS如何实现网站中PC端和手机端自动识别并跳转对应的代码
2020/01/08 Javascript
JS document内容及样式操作完整示例
2020/01/14 Javascript
python根据京东商品url获取产品价格
2015/08/09 Python
python批量查询、汉字去重处理CSV文件
2018/05/31 Python
python 重命名轴索引的方法
2018/11/10 Python
解决django无法访问本地static文件(js,css,img)网页里js,cs都加载不了
2020/04/07 Python
python报错TypeError: ‘NoneType‘ object is not subscriptable的解决方法
2020/11/05 Python
python 检测nginx服务邮件报警的脚本
2020/12/31 Python
无需JS和jQuery代码实现CSS3鼠标浮动放大图片
2016/11/21 HTML / CSS
Lime Crime官网:美国一家主打梦幻精灵系的彩妆品牌
2019/03/22 全球购物
怎么写好自荐信
2013/10/30 职场文书
十八大感想感言
2014/02/10 职场文书
志愿者宣传口号
2014/06/17 职场文书
教育项目合作协议书格式
2014/10/17 职场文书
2014年助理工程师工作总结
2014/11/14 职场文书
青涩记忆观后感
2015/06/18 职场文书
班级元旦晚会开幕词
2016/03/04 职场文书
抖音短视频(douyin)去水印工具的实现代码
2021/03/30 Javascript
Java中CyclicBarrier和CountDownLatch的用法与区别
2021/08/23 Java/Android
千万级用户系统SQL调优实战分享
2022/03/03 MySQL
Java中生成微信小程序太阳码的实现方案
2022/06/01 Java/Android