读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 相关文章推荐
用jscript实现新建word文档
Jun 15 Javascript
JavaScript 动态将数字金额转化为中文大写金额
May 14 Javascript
可在线编辑网页文字效果代码(单击)
Mar 02 Javascript
表单类各种类型(文本框)失去焦点效果jquery代码
Apr 26 Javascript
jQuery下拉美化搜索表单效果代码分享
Aug 25 Javascript
js两种拼接字符串的简单方法(必看)
Sep 02 Javascript
javascript 闭包详解及简单实例应用
Dec 31 Javascript
微信小程序实现多个按钮toggle功能的实例
Jun 13 Javascript
vue element-ui 绑定@keyup事件无效的解决方法
Mar 09 Javascript
基于vue循环列表时点击跳转页面的方法
Aug 31 Javascript
详解easyui 切换主题皮肤
Apr 04 Javascript
nuxt+axios实现打包后动态修改请求地址的方法
Apr 22 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
自制汽车收音机天线:收听广播的技巧和方法
2021/03/02 无线电
php学习之function的用法
2012/07/14 PHP
PHP长网址与短网址的实现方法
2017/10/13 PHP
php记录搜索引擎爬行记录的实现代码
2018/03/02 PHP
php+js实现的无刷新下载文件功能示例
2019/08/23 PHP
javascript Prototype 对象扩展
2009/05/15 Javascript
JavaScript中的this实例分析
2011/04/28 Javascript
jQuery中delegate与on的用法与区别示例介绍
2013/12/20 Javascript
Extjs的FileUploadField文件上传出现了两个上传按钮
2014/04/29 Javascript
纯JavaScript实现获取onclick、onchange等事件的值
2014/12/29 Javascript
jQuery中 prop() attr()使用详解
2015/05/19 Javascript
jquery UI Datepicker时间控件的使用及问题解决
2016/04/28 Javascript
jQuery对象与DOM对象转换方法详解
2016/05/10 Javascript
jQuery封装的屏幕居中提示信息代码
2016/06/08 Javascript
JS IOS/iPhone的Safari浏览器不兼容Javascript中的Date()问题如何解决
2016/11/11 Javascript
Node.js调试技术总结分享
2017/03/12 Javascript
深入理解Nodejs Global 模块
2017/06/03 NodeJs
js实现图片懒加载效果
2017/07/17 Javascript
解决layui动态添加的元素click等事件触发不了的问题
2019/09/20 Javascript
vue-drag-chart 拖动/缩放图表组件的实例代码
2020/04/10 Javascript
JS+Canvas实现五子棋游戏
2020/08/26 Javascript
[01:21:07]EG vs Liquid 2018国际邀请赛淘汰赛BO3 第一场 8.25
2018/08/29 DOTA
以windows service方式运行Python程序的方法
2015/06/03 Python
Python下实现的RSA加密/解密及签名/验证功能示例
2017/07/17 Python
使用Python设计一个代码统计工具
2018/04/04 Python
Python中pillow知识点学习
2018/04/30 Python
在python下使用tensorflow判断是否存在文件夹的实例
2019/06/10 Python
Python装饰器使用你可能不知道的几种姿势
2019/10/25 Python
HTML5移动端开发遇见的东西
2019/10/11 HTML / CSS
HTML页面中添加Canvas标签示例
2015/01/01 HTML / CSS
Html5 web本地存储实例详解
2016/07/28 HTML / CSS
Shell编程面试题
2016/05/29 面试题
信息工程学院毕业生推荐信
2013/11/05 职场文书
行政专员岗位职责
2014/01/02 职场文书
开国大典观后感
2015/06/04 职场文书
公文写作指导之倡议书!
2019/07/03 职场文书