jQuery中的each()详细介绍(推荐)


Posted in Javascript onMay 25, 2016

each()方法能使DOM循环结构简洁,不容易出错。each()函数封装了十分强大的遍历功能,使用也很方便,它可以遍历一维数组、多维数组、DOM, JSON 等等

在javaScript开发过程中使用$each可以大大的减轻我们的工作量。

下面提一下each的几种常用的用法

each处理一维数组

var arr1 = [ "aaa", "bbb", "ccc" ]; 
$.each(arr1, function(i,val){ 
alert(i); 
alert(val);
});

alert(i)将输出0,1,2

alert(val)将输出aaa,bbb,ccc

each处理二维数组

var arr2 = [['a', 'aa', 'aaa'], ['b', 'bb', 'bbb'], ['c', 'cc', 'ccc']] 

$.each(arr, function(i, item){ 
alert(i); 
alert(item); 

});

arr2为一个二维数组,item相当于取这二维数组中的每一个数组。

item[0]相对于取每一个一维数组里的第一个值

alert(i)将输出为0,1,2,因为这二维数组含有3个数组元素

alert(item)将输出为 ['a', 'aa', 'aaa'],['b', 'bb', 'bbb'],['c', 'cc', 'ccc']

对此二位数组的处理稍作变更之后

var arr = [['a', 'aa', 'aaa'], ['b', 'bb', 'bbb'], ['c', 'cc', 'ccc']] 
$.each(arr, function(i, item){ 

$.each(item,function(j,val){


 alert(j);


alert(val);
 }); 
});

alert(j)将输出为0,1,2,0,1,2,0,1,2

alert(val)将输出为a,aa,aaa,b,bb,bbb,c,cc,ccc

each处理json数据,这个each就有更厉害了,能循环每一个属性

var obj = { one:1, two:2, three:3}; 
each(obj, function(key, val) { 

alert(key); 

alert(val); 

});

这里alert(key)将输出one two three

alert(val)将输出one,1,two,2,three,3

这边为何key不是数字而是属性呢,因为json格式内是一组无序的属性-值,既然无序,又何来数字呢。

而这个val等同于obj[key]

ecah处理dom元素,此处以一个input表单元素作为例子。

如果你dom中有一段这样的代码

<input name="aaa" type="hidden" value="111" />
<input name="bbb" type="hidden" value="222" />
<input name="ccc" type="hidden" value="333" />
<input name="ddd" type="hidden" value="444"/>

然后你使用each如下

$.each($("input:hidden"), function(i,val){ 
alert(val);
alert(i);
alert(val.name);
alert(val.value); 
});

那么,alert(val)将输出[object HTMLInputElement],因为它是一个表单元素。

alert(i)将输出为0,1,2,3

alert(val.name);将输出aaa,bbb,ccc,ddd,如果使用this.name将输出同样的结果

alert(val.value); 将输出111,222,333,444,如果使用this.value将输出同样的结果

如果将以上面一段代码改变成如下的形式

$("input:hidden").each(function(i,val){
alert(i);
alert(val.name);
alert(val.value); 
});

可以看到,输出的结果是一样的,至于两种写法究竟区别在哪,我也还不知。此改变运用到上面几段数组的操作也会输出同样的结果。

这样,几个例子的实际结果已经得到答案。接着再继续往下研究,总不能知其然不知其所以然。

从以上的例子中可知jQuery和jQuery对象都实现了该方法,对于jQuery对象,只是把each方法简单的进行了委托:把jQuery对象作为第一个参数传递给jQuery的each方法。

看下jQuery中的each实现(网络摘抄)

function (object, callback, args) {
//该方法有三个参数:进行操作的对象obj,进行操作的函数fn,函数的参数args
var name, i = 0,length = object.length;
if (args) {
if (length == undefined) {
for (name in object) {
if (callback.apply(object[name], args) === false) {
break;
}
}
} else {
for (; i < length;) {
if (callback.apply(object[i++], args) === false) {
break;
}
}
}
} else {
if (length == undefined) {
for (name in object) {
if (callback.call(object[name], name, object[name]) === false) {
break;
}
}
} else {
for (var value = object[0]; i < length && callback.call(value, i, value) !== false; value = object[++i]) {}
/*object[0]取得jQuery对象中的第一个DOM元素,通过for循环,
得到遍历整个jQuery对象中对应的每个DOM元素,通过 callback.call( value,i,value);
将callback的this对象指向value对象,并且传递两个参数,i表示索引值,value表示DOM元素;
其中callback是类似于 function(index, elem) { ... } 的方法。
所以就得到 $("...").each(function(index, elem){ ... });
*/
}
}
return object;
}

jquery会自动根据传入的元素进行判断,然后在根据判断结果采取apply还是call方法的处理。在fn的实现中,可以直接采用this指针引用数组或是对象的子元素。

1.obj对象是数组

each方法会对数组中子元素的逐个进行fn函数调用,直至调用某个子元素返回的结果为false为止,也就是说,我们可以在提供的fn函数进行处理,使之满足一定条件后就退出each方法调用。当each方法提供了arg参数时,fn函数调用传入的参数为arg,否则为:子元素索引,子元素本身

2.obj 对象不是数组

该方法同1的最大区别是:fn方法会被逐次不考虑返回值的进行进行。换句话说,obj对象的所有属性都会被fn方法进行调用,即使fn函数返回false。调用传入的参数同1类似。

Javascript 相关文章推荐
js修改input的type属性及浏览器兼容问题探讨与解决
Jan 23 Javascript
IE下window.onresize 多次调用与死循环bug处理方法介绍
Nov 12 Javascript
浅析JavaScript中的常用算法与函数
Nov 21 Javascript
JavaScript判断一个字符串是否包含指定子字符串的方法
Mar 18 Javascript
location.hash保存页面状态的技巧
Apr 28 Javascript
js改变style样式和css样式的简单实例
Jun 28 Javascript
chrome下判断点击input上标签还是其余标签的实现方法
Sep 18 Javascript
js编写简单的计时器功能
Jul 15 Javascript
BootStrap Table实现server分页序号连续显示功能(当前页从上一页的结束序号开始)
Sep 12 Javascript
Vue2.0实现组件之间数据交互和通信操作示例
May 16 Javascript
layui实现tab的添加拒绝重复的方法
Sep 04 Javascript
JavaScript获取URL参数的方法分享
Apr 07 Javascript
jQuery中each()、find()和filter()等节点操作方法详解(推荐)
May 25 #Javascript
jquery easyui datagrid实现增加,修改,删除方法总结
May 25 #Javascript
15个值得开发人员关注的jQuery开发技巧和心得总结【经典收藏】
May 25 #Javascript
HTML5+jQuery插件Quicksand实现超酷的星际争霸2兵种分类展示效果(附demo源码下载)
May 25 #Javascript
js的form表单提交url传参数(包含+等特殊字符)的两种解决方法
May 25 #Javascript
jQuery获取复选框被选中数量及判断选择值的方法详解
May 25 #Javascript
js提交form表单,并传递参数的实现方法
May 25 #Javascript
You might like
用PHP实现小型站点广告管理
2006/10/09 PHP
PHP 上传文件的方法(类)
2009/07/30 PHP
PHP 登录记住密码实现思路
2013/05/07 PHP
两种php实现图片上传的方法
2016/01/22 PHP
Smarty实现页面静态化(生成HTML)的方法
2016/05/23 PHP
Laravel 微信小程序后端实现用户登录的示例代码
2019/11/26 PHP
用window.location.href实现刷新另个框架页面
2007/03/07 Javascript
Gird事件机制初级读本
2007/03/10 Javascript
JavaScript中一个奇葩的IE浏览器判断方法
2014/04/16 Javascript
js如何判断访问是来自搜索引擎(蜘蛛人)还是直接访问
2015/09/14 Javascript
knockoutjs动态加载外部的file作为component中的template数据源的实现方法
2016/09/01 Javascript
Angular2使用jQuery的方法教程
2017/05/28 jQuery
JavaScript解析任意形式的json树型结构展示
2017/07/23 Javascript
微信小程序canvas实现刮刮乐效果
2018/07/09 Javascript
javascript实现考勤日历功能
2018/11/29 Javascript
在JavaScript中实现链式调用的实现
2019/12/24 Javascript
ng-alain的sf如何自定义部件的流程
2020/06/12 Javascript
vue 公共列表选择组件,引用Vant-UI的样式方式
2020/11/02 Javascript
Python SqlAlchemy动态添加数据表字段实例解析
2018/02/07 Python
Python中 map()函数的用法详解
2018/07/10 Python
在Pycharm中修改文件默认打开方式的方法
2019/01/17 Python
详解Python函数式编程—高阶函数
2019/03/29 Python
pytorch索引查找 index_select的例子
2019/08/18 Python
tensorflow之并行读入数据详解
2020/02/05 Python
Python多个装饰器的调用顺序实例解析
2020/05/22 Python
在tensorflow以及keras安装目录查询操作(windows下)
2020/06/19 Python
PyTorch安装与基本使用详解
2020/08/31 Python
Python基于template实现字符串替换
2020/11/27 Python
python的dict判断key是否存在的方法
2020/12/09 Python
linux面试相关问题
2013/04/28 面试题
给老婆的婚前保证书
2014/02/01 职场文书
中学生期末评语
2014/02/03 职场文书
年终奖发放方案
2014/06/02 职场文书
学校副校长四风对照检查材料整改措施
2014/09/25 职场文书
幼儿园中班教师个人工作总结
2015/02/06 职场文书
Redis官方可视化工具RedisInsight安装使用教程
2022/04/19 Redis