读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 相关文章推荐
6个DIV 135或246间隔一秒轮番显示效果
Jul 24 Javascript
js调用webservice中的方法实现思路及代码
Feb 25 Javascript
Js与下拉列表处理问题解决
Feb 13 Javascript
IE8中使用javascript动态加载CSS的解决方法
Jun 17 Javascript
jQuery实现点击该行即可删除HTML表格行
Oct 17 Javascript
js实现点击向下展开的下拉菜单效果代码
Sep 01 Javascript
举例讲解JavaScript中将数组元素转换为字符串的方法
Oct 25 Javascript
学习JavaScript设计模式之状态模式
Jan 08 Javascript
vue实现消息的无缝滚动效果的示例代码
Dec 05 Javascript
利用vue组件自定义v-model实现一个Tab组件方法示例
Dec 06 Javascript
深入理解与使用keep-alive(配合router-view缓存整个路由页面)
Sep 25 Javascript
jQuery each和js forEach用法比较
Feb 27 jQuery
读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面向对象全攻略 (十七) 自动加载类
2009/09/30 PHP
php验证session无效的解决方法
2014/11/04 PHP
百度工程师讲PHP函数的实现原理及性能分析(三)
2015/05/13 PHP
php中实现字符串翻转的方法
2017/02/22 PHP
Linux服务器下PHPMailer发送邮件失败的问题解决
2017/03/04 PHP
PHP+MYSQL实现读写分离简单实战
2017/03/13 PHP
JS 参数传递的实际应用代码分析
2009/09/13 Javascript
javascript 禁用IE工具栏,导航栏等等实现代码
2013/04/01 Javascript
jquery实现图片渐变切换兼容ie6/Chrome/Firefox
2013/08/02 Javascript
JAVASCRIPT函数作用域和提前声明 分享
2013/08/22 Javascript
js日期相关函数总结分享
2013/10/15 Javascript
jQuery操作元素css样式的三种方法
2014/06/04 Javascript
angular.foreach 循环方法使用指南
2015/01/06 Javascript
js获取当前日期前七天的方法
2015/02/28 Javascript
EasyUI学习之DataGird分页显示数据
2016/12/29 Javascript
详解如何在React组件“外”使用父组件的Props
2018/01/12 Javascript
angular json对象push到数组中的方法
2018/02/27 Javascript
理顺8个版本vue的区别(小结)
2018/09/17 Javascript
Python contextlib模块使用示例
2015/02/18 Python
Python随机生成一个6位的验证码代码分享
2015/03/24 Python
Python中pip更新和三方插件安装说明
2018/07/08 Python
python绘制多个曲线的折线图
2020/03/23 Python
Python如何合并多个字典或映射
2020/07/24 Python
CSS3制作苹果风格键盘特效
2015/02/26 HTML / CSS
Canvas 文字碰撞检测并抽稀的方法
2019/05/27 HTML / CSS
localStorage、sessionStorage使用总结
2017/11/17 HTML / CSS
全球度假村:Club Med
2017/11/27 全球购物
中软国际Java程序员机试题
2012/08/19 面试题
优良学风班申请材料
2014/02/13 职场文书
小学生寒假家长评语
2014/04/16 职场文书
2014年安全生产大检查方案
2014/05/13 职场文书
庐山导游词
2015/02/03 职场文书
企业工会工作总结2015
2015/05/13 职场文书
Oracle查看表空间使用率以及爆满解决方案详解
2022/07/23 Oracle
python绘制云雨图raincloud plot
2022/08/05 Python
CentOS7设置ssh服务以及端口修改方式
2022/12/24 Servers