读jQuery之五(取DOM元素)


Posted in Javascript onJune 20, 2011

jQuery的$调用后想要获取DOM元素可以使用get方法,如下

// 方式1 
$('div').get(1); // 获取页面中第二个div

当然,也可以使用数组索引方式获取
// 方式2 
$('div')[1]; // 获取页面中第二个div

上面两种方式都可以获取某一个特定的DOM元素,而获取DOM元素集合却要使用toArray方法
$('div').toArray(); // 返回页面中所有的div,依次放入数组中

看看get方法的源码
get: function( num ) { 
return num == null ? 
// Return a 'clean' array 
this.toArray() : 
// Return just the object 
( num < 0 ? this[ this.length + num ] : this[ num ] ); 
},

get内就一个三元运算符,即两个分支。
分支1,当不传参数时将获取所有DOM元素(调用toArray)
分支2,当num为数字(索引)时返回指定的某一个DOM元素(数字为负数时为逆向获取)

分支1实际是将jQuery对象(伪数组)转成真正的数组,分支2实际是(用中括号[])取“伪数组”元素。下面以$('div')来描述整个调用过程
1,获取页面div元素(document.getElementsByTagName('div'))
2,将集合HTMLCollection/NodeList转成真正的数组
3,将数组转成伪数组/ArrayLike(jQuery对象)
如图

读jQuery之五(取DOM元素)


第一步是选择器做的事;
第二步将HTMLCollection/NodeList转成数组以前讨论过;
第三步又将数组转成伪数组/ArrayLike(jQuery对象),只需调用下数组的push即可。
也许下面的例子容易理解

var jqObj = {0:'one',1:'two',2:'three',length:3}, // 伪数组(ArrayLike) 
ary = ['one','two','three']; //数组 
// 将伪数组(ArrayLike)转成数组 
function jqObjToArray(json){ 
var slice = Array.prototype.slice; 
return slice.call(json,0); 
} 
// 将数组转成伪数组(ArrayLike) 
function ArrayToJqObj(ary){ 
var obj = {}, push = Array.prototype.push; 
push.apply(obj,ary); 
return obj; 
} 
console.log(jqObjToArray(jqObj)); 
console.log(ArrayToJqObj(ary));

jQuery还提供了first/last/eq/slice方法,它们与上面提到的get/toArray不同。它们返回的是jQuery对象而非返回HTMLElement。如下html片段
<div id="a">A</div> 
<div id="b">B</div> 
<div id="c">C</div> 
<div id="d">D</div>

$('div').first() 返回jq对象集合的第一个元素, 即Div[id=a],结构:{0:div,length:1,...};//...表示省略了其它属性
$('div').last() 返回jq对象集合的最后的元素, 即Div[id=d],结构:{0:div,length:1,...};
$('div').eq(2) 返回jq对象匹配的第三个元素, 即Div[id=c],结构:{0:div,length:1,...};

查看源码得知:
1,first,last方法中直接调用了eq方法。
2,eq方法中调用了slice方法。

因此slice方法才是根本。该方法让我们自然想到数组的slice方法,实际上jQuery正是利用Array的push和slice方法。
1,利用Array.prototype.slice方法将 伪数组 转成 数组
2,利用Array.prototype.push方法将 数组 转成 伪数组
当然jQuery中的slice方法调用了pushStack。我这里简写了slice,如下

slice : function(){ 
var ret = $();//关键的一句,构造一个新的jq对象, 
var ary = slice.apply(this,arguments);//这里的this是jq对象,根据参数转成数组子集 
push.apply(ret,ary);//转成jq对象,即伪数组形式 
return ret; 
},

相关:

将HTMLCollection/NodeList/伪数组转换成数组
zChain-05.rar

Javascript 相关文章推荐
做好七件事帮你提升jQuery的性能
Feb 06 Javascript
js动态删除div元素基本思路及实现代码
May 08 Javascript
控制文字内容的显示与隐藏示例
Jun 11 Javascript
javascript限制用户只能输汉字中文的方法
Nov 20 Javascript
JavaScript实现数组随机排序的方法
Jun 26 Javascript
JS实现部分HTML固定页面顶部随屏滚动效果
Dec 24 Javascript
关于Bootstrap弹出框无法调用问题的解决办法
Mar 10 Javascript
使用BootStrap实现用户登录界面UI
Aug 10 Javascript
详解从买域名到使用pm2部署node.js项目全过程
Mar 07 Javascript
浅谈angularJS2中的界面跳转方法
Aug 31 Javascript
详解Axios统一错误处理与后置
Sep 26 Javascript
JavaScript实现简单贪吃蛇效果
Mar 09 Javascript
读jQuery之四(优雅的迭代)
Jun 20 #Javascript
火狐4、谷歌12不支持Jquery Validator的解决方法分享
Jun 20 #Javascript
合并table相同单元格的jquery插件分享(很精简)
Jun 20 #Javascript
functional继承模式 摘自javascript:the good parts
Jun 20 #Javascript
jQuery数组处理方法汇总
Jun 20 #Javascript
jQuery UI AutoComplete 使用说明
Jun 20 #Javascript
jQuery 源码分析笔记(3) Deferred机制
Jun 19 #Javascript
You might like
php实现微信公众号无限群发
2015/10/11 PHP
javascript new fun的执行过程
2010/08/05 Javascript
Javascript this 关键字 详解
2014/10/22 Javascript
javascript学习笔记之函数定义
2015/06/25 Javascript
学习JavaScript设计模式之模板方法模式
2016/01/20 Javascript
Bootstrap框架的学习教程详解(二)
2016/10/18 Javascript
基于jQuery实现咖啡订单管理简单应用
2017/02/10 Javascript
jquery仿苹果的时间/日期选择效果
2017/03/08 Javascript
nodejs构建本地web测试服务器 如何解决访问静态资源问题
2017/07/14 NodeJs
Express的HTTP重定向到HTTPS的方法
2018/06/06 Javascript
nodejs同步调用获取mysql数据时遇到的大坑
2019/03/02 NodeJs
详解vue-cli@2.x项目迁移日志
2019/06/06 Javascript
jQuery实现王者荣耀手风琴效果
2020/01/17 jQuery
vue 使用 canvas 实现手写电子签名
2020/03/06 Javascript
原生JS实现pc端轮播图效果
2020/12/21 Javascript
在Python中使用NLTK库实现对词干的提取的教程
2015/04/08 Python
Python EOL while scanning string literal问题解决方法
2020/09/18 Python
在CentOS上配置Nginx+Gunicorn+Python+Flask环境的教程
2016/06/07 Python
Python实现在tkinter中使用matplotlib绘制图形的方法示例
2018/01/18 Python
Python进阶之递归函数的用法及其示例
2018/01/31 Python
使用pandas对矢量化数据进行替换处理的方法
2018/04/11 Python
python搭建服务器实现两个Android客户端间收发消息
2018/04/12 Python
python 实现查找文件并输出满足某一条件的数据项方法
2019/06/12 Python
pytorch中如何使用DataLoader对数据集进行批处理的方法
2019/08/06 Python
Python之Numpy的超实用基础详细教程
2019/10/23 Python
Pycharm2020.1安装无法启动问题即设置中文插件的方法
2020/08/07 Python
Richards网上商店:当代时尚,遍布巴西
2019/11/03 全球购物
人力资源部培训专员岗位职责
2014/01/02 职场文书
推广普通话演讲稿
2014/05/23 职场文书
高速铁道技术专业求职信
2014/08/09 职场文书
音乐教育专业自荐信
2014/09/18 职场文书
2014年纪委工作总结
2014/12/05 职场文书
客服专员岗位职责
2015/02/10 职场文书
Go语言设计模式之结构型模式
2021/06/22 Golang
win11无法登录onedrive错误代码0x8004def7怎么办 ?
2022/04/05 数码科技
python实现手机推送 代码也就10行左右
2022/04/12 Python