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 URL参数读取改进版
Jan 16 Javascript
基于jquery的cookie的用法
Jan 10 Javascript
jquery ajax提交整个表单元素的快捷办法
Mar 27 Javascript
JQuery获取样式中的background-color颜色值的问题
Aug 20 Javascript
jquery $.each()使用探讨
Sep 23 Javascript
Javascript中arguments和arguments.callee的区别浅析
Apr 24 Javascript
浅析javascript中的事件代理
Nov 06 Javascript
给angular加上动画效遇到的问题总结
Feb 17 Javascript
微信小程序实战篇之购物车的实现代码示例
Nov 30 Javascript
详解vue-admin和后端(flask)分离结合的例子
Feb 12 Javascript
JS加密插件CryptoJS实现的DES加密示例
Aug 16 Javascript
jQuery实现鼠标滑动切换图片
May 27 jQuery
详解强大的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数组操作汇总 php数组的使用技巧
2011/07/17 PHP
php抓取页面的几种方法详解
2013/06/17 PHP
php函数间的参数传递(值传递/引用传递)
2013/09/23 PHP
迪菲-赫尔曼密钥交换(Diffie?Hellman)算法原理和PHP实现版
2015/05/12 PHP
Yii2实现ActiveForm ajax提交
2017/05/26 PHP
零基础php编程好学吗
2019/10/11 PHP
juqery 学习之三 选择器 可见性 元素属性
2010/11/25 Javascript
js multiple全选与取消全选实现代码
2012/12/04 Javascript
基于jquery的文章中所有图片width大小批量设置方法
2013/08/01 Javascript
js中函数调用的两种常用方法使用介绍
2014/07/17 Javascript
基于nodejs+express(4.x+)实现文件上传功能
2015/11/23 NodeJs
javascript入门之数组[新手必看]
2016/11/21 Javascript
基于Node.js + WebSocket打造即时聊天程序嗨聊
2016/11/29 Javascript
node.js 和HTML5开发本地桌面应用程序
2016/12/13 Javascript
Angular实现较为复杂的表格过滤,删除功能示例
2017/12/23 Javascript
jQuery实现动态加载(按需加载)javascript文件的方法分析
2019/05/31 jQuery
使用vue引入maptalks地图及聚合效果的实现
2020/08/10 Javascript
Python入门篇之编程习惯与特点
2014/10/17 Python
Python IDLE 错误:IDLE''s subprocess didn''t make connection 的解决方案
2017/02/13 Python
django进阶之cookie和session的使用示例
2018/08/17 Python
python利用插值法对折线进行平滑曲线处理
2018/12/25 Python
Django web框架使用url path name详解
2019/04/29 Python
Python+OpenCV实现将图像转换为二进制格式
2020/01/09 Python
解决Python import docx出错DLL load failed的问题
2020/02/13 Python
pyecharts调整图例与各板块的位置间距实例
2020/05/16 Python
CSS3 倾斜的网页图片库实例教程
2009/11/14 HTML / CSS
详解HTML5 Canvas标签及基本使用
2020/01/10 HTML / CSS
Clarks鞋美国官网:全球领军鞋履品牌
2017/05/13 全球购物
Agoda台湾官网:国内外订房2折起
2018/03/20 全球购物
冰淇淋开店创业计划书
2014/02/01 职场文书
责任胜于能力演讲稿
2014/05/20 职场文书
党员公开承诺书内容
2014/05/20 职场文书
统计专业自荐书
2014/07/06 职场文书
企业爱岗敬业演讲稿
2014/09/04 职场文书
班子查摆四风个人对照检查材料思想汇报
2014/10/04 职场文书
Python简易开发之制作计算器
2022/04/28 Python