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 相关文章推荐
说说JSON和JSONP 也许你会豁然开朗
Sep 02 Javascript
Javascript 命名空间模式
Nov 01 Javascript
利用JS来控制键盘的上下左右键(示例代码)
Dec 14 Javascript
二叉树的非递归后序遍历算法实例详解
Feb 07 Javascript
javascript使用window.open提示“已经计划系统关机”的原因
Aug 15 Javascript
jQuery ui autocomplete选择列表被Bootstrap模态窗遮挡的完美解决方法
Sep 23 Javascript
最细致的vue.js基础语法 值得收藏!
Nov 03 Javascript
用director.js实现前端路由使用实例
Jan 27 Javascript
JS实现简单的天数计算器完整实例
Apr 28 Javascript
Vue2.5学习笔记之如何在项目中使用和配置Vue
Sep 26 Javascript
Vue.js组件使用props传递数据的方法
Oct 19 Javascript
完美解决通过IP地址访问VUE项目的问题
Jul 18 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
239军机修复记
2021/03/02 无线电
解析PHP跨站刷票的实现代码
2013/06/18 PHP
理解PHP中的stdClass类
2014/04/18 PHP
PHP抓取远程图片(含不带后缀的)教程详解
2016/10/21 PHP
php面向对象程序设计中self与static的区别分析
2019/05/21 PHP
jquery 双色表格实现代码
2009/12/08 Javascript
js 父窗口控制子窗口的行为-打开,关闭,重定位,回复
2010/04/20 Javascript
js中arguments的用法(实例讲解)
2013/11/30 Javascript
jquery.post用法关于type设置问题补充
2014/01/03 Javascript
JavaScript操作DOM元素的childNodes和children区别
2015/04/01 Javascript
jQuery1.9.1源码分析系列(十六)ajax之ajax框架
2015/12/04 Javascript
JS控制静态页面之间传递参数获取参数并应用的简单实例
2016/08/10 Javascript
Angularjs手动解析表达式($parse)
2016/10/12 Javascript
JavaScript的变量声明提升问题浅析(Hoisting)
2016/11/30 Javascript
利用Angular+Angular-Ui实现分页(代码加简单)
2017/03/10 Javascript
label+input实现按钮开关切换效果的实例
2017/08/16 Javascript
Vue2.0中三种常用传值方式(父传子、子传父、非父子组件传值)
2018/08/16 Javascript
在Vue组件中获取全局的点击事件方法
2018/09/06 Javascript
jQuery 筛选器简单操作示例
2019/10/02 jQuery
Vue 构造选项 - 进阶使用说明
2020/08/14 Javascript
Anaconda多环境多版本python配置操作方法
2017/09/12 Python
代码实例讲解python3的编码问题
2019/07/08 Python
Python 用matplotlib画以时间日期为x轴的图像
2019/08/06 Python
python selenium 执行完毕关闭chromedriver进程示例
2019/11/15 Python
Python+Selenium+phantomjs实现网页模拟登录和截图功能(windows环境)
2019/12/11 Python
Python3 集合set入门基础
2020/02/10 Python
python设置环境变量的作用整理
2020/02/17 Python
Python列表推导式实现代码实例
2020/09/09 Python
Ubuntu16安装Python3.9的实现步骤
2020/12/15 Python
VisionPros美国站:加拿大在线隐形眼镜和眼镜零售商
2020/02/11 全球购物
C语言中break与continue的区别
2012/07/12 面试题
班主任自我评价范文
2015/03/11 职场文书
如何写一份成功的商业计划书
2019/06/25 职场文书
接触艺术对孩子学习思维有益
2019/08/06 职场文书
python scrapy简单模拟登录的代码分析
2021/07/21 Python
Python爬虫入门案例之爬取二手房源数据
2021/10/16 Python