读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 相关文章推荐
javascript Firefox与IE 替换节点的方法
Feb 24 Javascript
jquery checkbox全选、取消全选实现代码
Mar 05 Javascript
JS的数组迭代方法
Feb 05 Javascript
jQuery on()方法使用技巧详解
Apr 16 Javascript
javascript随机抽取0-100之间不重复的10个数
Feb 25 Javascript
js编写一个简单的产品放大效果代码
Jun 27 Javascript
Node.js学习之地址解析模块URL的使用详解
Sep 28 Javascript
bootstrap paginator分页插件的两种使用方式实例详解
Nov 14 Javascript
JS简单添加元素新节点的方法示例
Feb 10 Javascript
React中嵌套组件与被嵌套组件的通信过程
Jul 11 Javascript
vue实现通讯录功能
Jul 14 Javascript
微信小程序实现订单倒计时
Nov 01 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
通过文字传递创建的图形按钮
2006/10/09 PHP
php 前一天或后一天的日期
2008/06/28 PHP
基于session_unset与session_destroy的区别详解
2013/06/03 PHP
PHP实现一维数组转二维数组的方法
2015/02/25 PHP
WordPress开发中用于获取近期文章的PHP函数使用解析
2016/01/05 PHP
Laravel事件监听器用法实例分析
2019/03/12 PHP
Javascript 面向对象(一)(共有方法,私有方法,特权方法)
2012/05/23 Javascript
JavaScript Promise启示录
2014/08/12 Javascript
Angularjs渲染的 using 指令的星级评分系统示例
2017/11/09 Javascript
解决vue项目报错webpackJsonp is not defined问题
2018/03/14 Javascript
MVVM 双向绑定的实现代码
2018/06/21 Javascript
解决Vue @submit 提交后不刷新页面问题
2020/07/18 Javascript
node.js通过Sequelize 连接MySQL的方法
2020/12/28 Javascript
[06:09]辉夜杯主赛事开幕式
2015/12/25 DOTA
[51:27]LGD vs Liquid 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
[51:15]完美世界DOTA2联赛PWL S2 PXG vs Magma 第一场 11.21
2020/11/24 DOTA
新手如何快速入门Python(菜鸟必看篇)
2017/06/10 Python
Python文件和流(实例讲解)
2017/09/12 Python
对Python闭包与延迟绑定的方法详解
2019/01/07 Python
Python的互斥锁与信号量详解
2019/09/12 Python
python 利用turtle库绘制笑脸和哭脸的例子
2019/11/23 Python
使用Python和百度语音识别生成视频字幕的实现
2020/04/09 Python
Python字符串split及rsplit方法原理详解
2020/06/29 Python
python实现ping命令小程序
2020/12/28 Python
浅析python字符串前加r、f、u、l 的区别
2021/01/24 Python
html5自带表单验证体验优化及提示气泡修改功能
2017/09/12 HTML / CSS
html5生成柱状图(条形图)效果的实例代码
2016/03/25 HTML / CSS
京东国际站:JOYBUY
2017/11/23 全球购物
耐克奥地利官网:Nike奥地利
2019/08/16 全球购物
毕业生求职简历的自我评价
2013/10/23 职场文书
文秘应聘自荐书范文
2014/02/18 职场文书
保密工作实施方案
2014/02/24 职场文书
关爱老人标语
2014/06/21 职场文书
歌颂党的演讲稿
2014/09/10 职场文书
国家税务局领导班子对照检查材料思想汇报
2014/10/04 职场文书
离婚协议书范本(2016最新版)
2016/03/18 职场文书