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中的对象化编程
Jan 16 Javascript
Javascript 作用域使用说明
Aug 13 Javascript
分享27款非常棒的jQuery 表单插件
Mar 28 Javascript
javascript中window.event事件用法详解
Dec 11 Javascript
javascript框架设计读书笔记之模块加载系统
Dec 02 Javascript
JavaScript+CSS实现的可折叠二级菜单实例
Feb 29 Javascript
socket.io与pm2(cluster)集群搭配的解决方案
Jun 02 Javascript
解决Webpack 热部署检测不到文件变化的问题
Feb 22 Javascript
vue实现中部导航栏布局功能
Jul 30 Javascript
JavaScript 截取字符串代码实例
Sep 05 Javascript
JS对日期操作封装代码实例
Nov 08 Javascript
使用Canvas绘制一个游戏人物属性图
Mar 25 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如何实现Unicode和Utf-8编码相互转换
2015/07/29 PHP
php array_walk 对数组中的每个元素应用用户自定义函数详解
2016/11/18 PHP
PHP实现ASCII码与字符串相互转换的方法
2017/04/29 PHP
laravel实现按时间日期进行分组统计方法示例
2019/03/23 PHP
在IE下:float属性会影响offsetTop的取值
2006/12/22 Javascript
xml 封装与解析(javascript和C#中)
2009/07/26 Javascript
jquery获取被勾选的checked(选中)的那一行的3列和4列的值
2013/07/04 Javascript
给事件响应函数传参数的四种方式小结
2013/12/05 Javascript
基于JQuery实现的图片自动进行缩放和裁剪处理
2014/01/31 Javascript
如何获取网站icon有哪些可行的方法
2014/06/05 Javascript
解决jquery版本冲突的有效方法
2014/09/02 Javascript
jQuery选择器用法实例详解
2015/12/17 Javascript
微信小程序 闭包写法详细介绍
2016/12/14 Javascript
ES6中参数的默认值语法介绍
2017/05/03 Javascript
vue axios基于常见业务场景的二次封装的实现
2018/09/21 Javascript
vue实现记事本功能
2019/06/26 Javascript
js实现图片上传到服务器和回显
2020/01/19 Javascript
vuex的使用步骤
2021/01/06 Vue.js
Python中http请求方法库汇总
2016/01/06 Python
Python基础教程之浅拷贝和深拷贝实例详解
2017/07/15 Python
Python实现字典去除重复的方法示例
2017/07/31 Python
Python基于pyCUDA实现GPU加速并行计算功能入门教程
2018/06/19 Python
python 使用 requests 模块发送http请求 的方法
2018/12/09 Python
详解python3 + Scrapy爬虫学习之创建项目
2019/04/12 Python
python右对齐的实例方法
2020/07/05 Python
NBA欧洲商店(英国):NBA Europe Store UK
2018/07/27 全球购物
英文版餐饮业求职信
2013/10/18 职场文书
服装设计专业毕业生求职信
2014/04/09 职场文书
法院先进个人事迹材料
2014/05/04 职场文书
领导干部个人整改措施落实情况汇报
2014/10/29 职场文书
幼儿园辞职信范文
2015/02/27 职场文书
教师节倡议书2015
2015/04/27 职场文书
校车司机安全责任书
2015/05/11 职场文书
2015年公司国庆放假通知
2015/07/30 职场文书
Python中for后接else的语法使用
2021/05/18 Python
浅谈tf.train.Saver()与tf.train.import_meta_graph的要点
2021/05/26 Python