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 相关文章推荐
原生js编写设为首页兼容ie、火狐和谷歌
Jun 05 Javascript
asp.net+js实现金额格式化
Feb 27 Javascript
js给网页加上背景音乐及选择音效的方法
Mar 03 Javascript
基于JavaScript如何实现私有成员的语法特征及私有成员的实现方式
Oct 28 Javascript
jQuery插件实现无缝滚动特效
Nov 24 Javascript
深入浅出讲解ES6的解构
Aug 03 Javascript
ExtJS 4.2 Grid组件单元格合并的方法
Oct 12 Javascript
vuejs手把手教你写一个完整的购物车实例代码
Jul 06 Javascript
angular基于ng-alain定义自己的select组件示例
Feb 23 Javascript
JavaScript 隐性类型转换步骤浅析
Mar 15 Javascript
vue-router 中 meta的用法详解
Nov 01 Javascript
浅谈es6中的元编程
Dec 01 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多用户读写文件冲突的解决办法
2013/11/06 PHP
PHP微信支付实例解析
2016/07/22 PHP
老生常谈PHP中的数据结构:DS扩展
2017/07/17 PHP
PHP微信H5支付开发实例
2018/07/25 PHP
在JavaScript中获取请求的URL参数[正则]
2010/12/25 Javascript
使用js判断TextBox控件值改变然后出发事件
2014/03/07 Javascript
Ajax+FormData+javascript实现无刷新表单信息提交
2016/10/24 Javascript
JS实现简单表格排序操作示例
2017/10/07 Javascript
js 两个日期比较相差多少天的实例
2017/10/19 Javascript
使用express获取微信小程序二维码小记
2019/05/21 Javascript
微信小程序HTTP接口请求封装代码实例
2019/09/05 Javascript
mpvue实现微信小程序快递单号查询代码
2020/04/03 Javascript
[01:00:13]完美世界DOTA2联赛 LBZS vs Forest 第一场 11.07
2020/11/09 DOTA
以视频爬取实例讲解Python爬虫神器Beautiful Soup用法
2016/01/20 Python
Python基于pygame模块播放MP3的方法示例
2017/09/30 Python
Python无损音乐搜索引擎实现代码
2018/02/02 Python
Python实现迭代时使用索引的方法示例
2018/06/05 Python
Python爬虫实战之12306抢票开源
2019/01/24 Python
python opencv 读取本地视频文件 修改ffmpeg的方法
2019/01/26 Python
Python+opencv+pyaudio实现带声音屏幕录制
2019/12/23 Python
解决Tensorflow sess.run导致的内存溢出问题
2020/02/05 Python
Python: tkinter窗口屏幕居中,设置窗口最大,最小尺寸实例
2020/03/04 Python
Django之choices选项和富文本编辑器的使用详解
2020/04/01 Python
零基础小白多久能学会python
2020/06/22 Python
Tensorflow--取tensorf指定列的操作方式
2020/06/30 Python
HTML5之多线程(Web Worker)
2019/01/02 HTML / CSS
英国现代、当代和设计师家具店:Furntastic
2020/07/18 全球购物
护士的自我鉴定
2014/02/07 职场文书
互联网电子商务专业毕业生求职信
2014/03/18 职场文书
会计核算科岗位职责
2014/03/19 职场文书
《放小鸟》教学反思
2014/04/20 职场文书
学校读书活动总结
2014/06/30 职场文书
预备党员群众路线思想汇报2014
2014/10/25 职场文书
教你解决往mysql数据库中存入汉字报错的方法
2021/05/06 MySQL
Python实现简单的猜单词
2021/06/15 Python
MySql数据库触发器使用教程
2022/06/01 MySQL