读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之Read an Excel Spreadsheet
Jun 13 Javascript
使用jQuery和Bootstrap实现多层、自适应模态窗口
Dec 22 Javascript
Javascript动态创建表格及删除行列的方法
May 15 Javascript
jQuery下拉友情链接美化效果代码分享
Aug 26 Javascript
jQuery实现带玻璃流光质感的手风琴特效
Nov 20 Javascript
node.js require() 源码解读
Dec 13 Javascript
jQuery的Read()方法代替原生JS详解
Nov 08 Javascript
原生JS轮播图插件
Feb 09 Javascript
JS实现留言板功能
Jun 17 Javascript
浅谈node中的exports与module.exports的关系
Aug 01 Javascript
React和Vue中监听变量变化的方法
Nov 14 Javascript
vue实现动态按钮功能
May 13 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实现根据url自动生成缩略图的方法
2014/09/23 PHP
PHP面向对象之事务脚本模式(详解)
2017/06/07 PHP
php实现mysql连接池效果实现代码
2018/01/25 PHP
JQuery 自定义CircleAnimation,Animate方法学习笔记
2011/07/10 Javascript
JavaScript中的原型和继承详解(图文)
2014/07/18 Javascript
node.js中的events.emitter.removeAllListeners方法使用说明
2014/12/10 Javascript
js实现兼容IE、Firefox的图片缩放代码
2015/12/08 Javascript
轻量级jQuery插件slideBox实现带底栏轮播(焦点图)代码
2016/03/28 Javascript
在javascript中使用com组件的简单实现方法
2016/08/17 Javascript
微信小程序 tabs选项卡效果的实现
2017/01/05 Javascript
js获取一组日期中最近连续的天数
2017/05/25 Javascript
React-Native之定时器Timer的实现代码
2017/10/04 Javascript
微信小程序实现YDUI的ScrollTab组件
2018/02/02 Javascript
jQuery实现使用sort方法对json数据排序的方法
2018/04/17 jQuery
Angular6 正则表达式允许输入部分中文字符
2018/09/10 Javascript
为什么说JavaScript预解释是一种毫无节操的机制详析
2018/11/18 Javascript
jQuery简单实现根据日期计算星期几的方法
2019/01/09 jQuery
LayUi使用switch开关,动态的去控制它是否被启用的方法
2019/09/21 Javascript
JS字符串和数组如何实现相互转化
2020/07/02 Javascript
Element Backtop回到顶部的具体使用
2020/07/27 Javascript
ajax jquery实现页面某一个div的刷新效果
2021/03/04 jQuery
解读Django框架中的低层次缓存API
2015/07/24 Python
python将数组n等分的实例
2019/12/02 Python
Python3 使用selenium插件爬取苏宁商家联系电话
2019/12/23 Python
python同义词替换的实现(jieba分词)
2020/01/21 Python
三星美国官网:Samsung美国
2017/02/06 全球购物
Nordgreen英国官网:斯堪的纳维亚设计师手表
2018/10/24 全球购物
女士鞋子、包包和服装在线,第一款10美元:ShoeDazzle
2019/07/26 全球购物
通往英国高街的商店橱窗:Down Your High Street
2020/07/19 全球购物
100%羊绒:NakedCashmere
2020/08/26 全球购物
关于孝道的演讲稿
2014/05/21 职场文书
教师节学生演讲稿
2014/09/03 职场文书
汽车销售员工作总结
2015/08/12 职场文书
团干部培训班心得体会
2016/01/06 职场文书
2016廉政教育学习心得体会
2016/01/25 职场文书
python自然语言处理之字典树知识总结
2021/04/25 Python