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 相关文章推荐
Jquery 表单取值赋值的一些基本操作
Oct 11 Javascript
php显示当前文件所在的文件以及文件夹所有文件以树形展开
Dec 13 Javascript
jQuery中siblings()方法用法实例
Jan 08 Javascript
js实现可得到不同颜色值的颜色选择器实例
Feb 28 Javascript
学习JavaScript设计模式之策略模式
Jan 12 Javascript
基于javascript简单实现对身份证校验
Jan 25 Javascript
javascript拖拽效果延伸学习
Apr 04 Javascript
jQuery UI插件实现百度提词器效果
Nov 21 Javascript
Bootstrap基本插件学习笔记之Alert警告框(20)
Dec 08 Javascript
Javascript中引用类型传递的知识点小结
Mar 06 Javascript
微信小程序收藏功能的实现代码
Jun 19 Javascript
H5 js点击按钮复制文本到粘贴板
Nov 19 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 编写的日历
2006/10/09 PHP
destoon实现不同会员组公司名称显示不同的颜色的方法
2014/08/22 PHP
PHP开发框架laravel安装与配置教程
2015/03/13 PHP
php给一组指定关键词添加span标签的方法
2015/03/31 PHP
php编写简单的文章发布程序
2015/06/18 PHP
Thinkphp微信公众号支付接口
2016/08/04 PHP
PHP实现二叉树深度优先遍历(前序、中序、后序)和广度优先遍历(层次)实例详解
2018/04/20 PHP
JavaScript的面向对象(一)
2006/11/09 Javascript
jquery焦点图片切换(数字标注/手动/自动播放/横向滚动)
2013/01/24 Javascript
js document.write()使用介绍
2014/02/21 Javascript
js获取元素外链样式的方法
2015/01/27 Javascript
详解JavaScript逻辑And运算符
2015/12/04 Javascript
Node.JS 循环递归复制文件夹目录及其子文件夹下的所有文件
2017/09/18 Javascript
JavaScript实现音乐自动切换和轮播
2017/11/05 Javascript
node.js环境搭建图文详解
2018/09/19 Javascript
angularjs手动识别字符串中的换行符方法
2018/10/02 Javascript
nest.js 使用express需要提供多个静态目录的操作方法
2019/10/24 Javascript
vue router 传参获取不到的解决方式
2019/11/13 Javascript
Python程序设计入门(3)数组的使用
2014/06/16 Python
解析Python中while true的使用
2015/10/13 Python
Python读写Json涉及到中文的处理方法
2016/09/12 Python
python打包生成的exe文件运行时提示缺少模块的解决方法
2018/10/31 Python
Python实现的对一个数进行因式分解操作示例
2019/06/27 Python
Python3.x+pyqtgraph实现数据可视化教程
2020/03/14 Python
使用Django清空数据库并重新生成
2020/04/03 Python
推荐值得学习的12款python-web开发框架
2020/08/10 Python
AE美国鹰日本官方网站: American Eagle Outfitters
2016/12/10 全球购物
英国香水店:The Perfume Shop
2017/03/27 全球购物
屈臣氏马来西亚官网:Watsons马来西亚
2019/06/15 全球购物
一年级数学教学反思
2014/02/01 职场文书
创建学习型党组织实施方案
2014/03/29 职场文书
倡导文明标语
2014/06/16 职场文书
公司周年庆典标语
2014/10/07 职场文书
中学生旷课检讨书500字
2014/10/29 职场文书
新党员入党决心书
2015/09/22 职场文书
简单聊一聊SQL注入及防止SQL注入
2022/03/23 MySQL