读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 动态添加事件代码
Nov 30 Javascript
js中小数转换整数的方法
Jan 26 Javascript
基于jQuery实现表单提交验证
Nov 24 Javascript
jQuery表单事件实例代码分享
Aug 18 Javascript
ASP.NET jquery ajax传递参数的实例
Nov 02 Javascript
js原生之焦点图转换加定时器实例
Dec 12 Javascript
浅谈JS 数字和字符串之间相互转化的纠纷
Oct 20 Javascript
微信小程序promsie.all和promise顺序执行
Oct 27 Javascript
AngularJS基于http请求实现下载php生成的excel文件功能示例
Jan 23 Javascript
使用vue如何构建一个自动建站项目
Feb 05 Javascript
JavaScript类的继承方法小结【组合继承分析】
Jul 11 Javascript
35个最好用的Vue开源库(史上最全)
Jan 03 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 获取时间今天明天昨天时间戳的详解
2013/06/20 PHP
基于PHP实现简单的随机抽奖小程序
2016/01/05 PHP
PHP微信开发之根据用户回复关键词\位置返回附近信息
2016/06/24 PHP
EXTJS内使用ACTIVEX控件引起崩溃问题的解决方法
2010/03/31 Javascript
纯JavaScript实现的完美渐变弹出层效果代码
2010/04/02 Javascript
一个简单的jQuery插件制作 学习过程及实例
2010/04/25 Javascript
js实时监听文本框状态的方法
2011/04/26 Javascript
jquery中获取元素的几种方式小结
2011/07/05 Javascript
jQuery对象数据缓存Cache原理及jQuery.data方法区别介绍
2013/04/07 Javascript
JS.GetAllChild(element,deep,condition)使用介绍
2013/09/21 Javascript
javascipt匹配单行和多行注释的正则表达式
2013/11/20 Javascript
js右下角弹出提示框示例代码
2016/01/12 Javascript
jQuery中的通配符选择器使用总结
2016/05/30 Javascript
jQuery和hwSlider实现内容响应式可触控滑动切换效果附源码下载(二)
2016/06/22 Javascript
jQuery插件HighCharts绘制的2D堆柱状图效果示例【附demo源码下载】
2017/03/14 Javascript
angularJS实现动态添加,删除div方法
2018/02/27 Javascript
vue单页应用在页面刷新时保留状态数据的方法
2018/09/21 Javascript
element 中 el-menu 组件的无限极循环思路代码详解
2020/04/26 Javascript
ng-alain的sf如何自定义部件的流程
2020/06/12 Javascript
Vue实现简单的留言板
2020/10/23 Javascript
vue使用transition组件动画效果的实例代码
2021/01/28 Vue.js
[01:20]辉夜杯背景故事宣传片《辉夜传说》
2015/12/25 DOTA
Python中使用gzip模块压缩文件的简单教程
2015/04/08 Python
分享一下Python 开发者节省时间的10个方法
2015/10/02 Python
Python运算符重载详解及实例代码
2017/03/07 Python
Python 中urls.py:URL dispatcher(路由配置文件)详解
2017/03/24 Python
Python编程给numpy矩阵添加一列方法示例
2017/12/04 Python
Pycharm 使用 Pipenv 新建的虚拟环境(图文详解)
2020/04/16 Python
python实现批量命名照片
2020/06/18 Python
美国派对用品及装饰品网上商店:Shindigz
2016/07/30 全球购物
远程Wi-Fi宠物监控相机:Petcube
2017/04/26 全球购物
民主生活会对照检查材料思想汇报
2014/09/27 职场文书
2015年党员个人剖析材料
2014/12/18 职场文书
Python激活Anaconda环境变量的详细步骤
2021/06/08 Python
Node.js实现断点续传
2021/06/23 Javascript
Win11远程连接不上怎么办?Win11远程桌面用不了的解决方法
2022/08/05 数码科技