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 相关文章推荐
Firebug入门指南(Firefox浏览器)
Aug 21 Javascript
背景图跟随鼠标移动的Mootools插件实现代码
Dec 12 Javascript
jquery中append()与appendto()用法分析
Nov 14 Javascript
鼠标事件的screenY,pageY,clientY,layerY,offsetY属性详解
Mar 12 Javascript
JavaScript获取当前日期是星期几的方法
Apr 06 Javascript
Javascript实现鼠标右键特色菜单
Aug 04 Javascript
JS实现仿苹果底部任务栏菜单效果代码
Aug 28 Javascript
JavaScript动态插入CSS的方法
Dec 10 Javascript
JavaScript数据结构之二叉树的查找算法示例
Apr 13 Javascript
AngularJS下$http服务Post方法传递json参数的实例
Mar 29 Javascript
JavaScript深拷贝和浅拷贝概念与用法实例分析
Jun 07 Javascript
layui select 禁止点击的实现方法
Sep 05 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
很实用的一个完整email发送程序
2006/10/09 PHP
用PHP实现将GB编码转换为UTF8
2006/11/25 PHP
无法载入 mcrypt 扩展,请检查 PHP 配置终极解决方案
2011/07/18 PHP
codeigniter显示所有脚本执行时间的方法
2015/03/21 PHP
php微信开发之百度天气预报
2016/11/18 PHP
JavaScript日历实现代码
2010/09/12 Javascript
jQuery 源码分析笔记(2) 变量列表
2011/05/28 Javascript
原生javascript图片自动或手动切换示例附演示源码
2013/09/04 Javascript
用JS实现3D球状标签云示例代码
2013/12/01 Javascript
Seajs的学习笔记
2014/03/04 Javascript
JavaScript 实现简单的倒计时弹窗DEMO附图
2014/03/05 Javascript
IE及IE6浏览器中判断JS文件加载成功失败的方法
2015/02/18 Javascript
Jquery插件实现点击获取验证码后60秒内禁止重新获取
2015/03/13 Javascript
js实现分享到随页面滚动而滑动效果的方法
2015/04/10 Javascript
讲解JavaScript的Backbone.js框架的MVC结构设计理念
2016/02/14 Javascript
JavaScript事件详细讲解
2016/06/27 Javascript
IONIC自定义subheader的最佳解决方案
2016/09/22 Javascript
jquery validation验证表单插件
2017/01/07 Javascript
vue实现登陆登出的实现示例
2017/09/15 Javascript
vue路由组件按需加载的几种方法小结
2018/07/12 Javascript
基于layui内置模块(element常用元素的操作)
2019/09/20 Javascript
JavaScript 浏览器对象模型BOM原理与常见用法实例分析
2019/12/16 Javascript
基于js实现的图片拖拽排序源码实例
2020/11/04 Javascript
Python转码问题的解决方法
2008/10/07 Python
Python将多个excel文件合并为一个文件
2018/01/03 Python
在Pandas中DataFrame数据合并,连接(concat,merge,join)的实例
2019/01/29 Python
python虚拟环境完美部署教程
2019/08/06 Python
Python根据服务获取端口号的方法
2019/09/25 Python
python_mask_array的用法
2020/02/18 Python
6PM官网:折扣鞋、服装及配饰
2018/08/03 全球购物
伦敦一卡通:The London Pass
2018/11/30 全球购物
《蓝色的树叶》教学反思
2014/02/24 职场文书
知名企业招聘广告词大全
2014/03/18 职场文书
学校光盘行动倡议书
2015/04/28 职场文书
高中生军训感言
2015/08/01 职场文书
Python中time与datetime模块使用方法详解
2022/03/31 Python