jquery中$each()方法的使用指南


Posted in Javascript onApril 30, 2015

$.each()与$(selector).each()不同, 后者专用于jquery对象的遍历, 前者可用于遍历任何的集合(无论是数组或对象),如果是数组,回调函数每次传入数组的索引和对应的值(值亦可以通过this 关键字获取,但javascript总会包装this 值作为一个对象—尽管是一个字符串或是一个数字),方法会返回被遍历对象的第一参数.

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 相关文章推荐
用javascript实现的支持lrc歌词的播放器
May 17 Javascript
利用404错误页面实现UrlRewrite的实现代码
Aug 20 Javascript
从URL中提取参数与将对象转换为URL查询参数的实现代码
Jan 12 Javascript
jquery实现图片翻页效果
Dec 23 Javascript
javascript结合canvas实现图片旋转效果
May 03 Javascript
jQuery实现单击弹出Div层窗口效果(可关闭可拖动)
Sep 19 Javascript
JS创建事件的三种方法(实例代码)
May 12 Javascript
js数组实现权重概率分配
Sep 12 Javascript
jQuery使用bind函数实现绑定多个事件的方法
Oct 11 jQuery
Vue监听事件实现计数点击依次增加的方法
Sep 26 Javascript
小程序实现简单语音聊天的示例代码
Jul 24 Javascript
js屏蔽F12审查元素,禁止修改页面代码等实现代码
Oct 02 Javascript
jQuery实现手机号码输入提示功能实例
Apr 30 #Javascript
javascript实现checkbox全选的代码
Apr 30 #Javascript
javascript实现的固定位置悬浮窗口实例
Apr 30 #Javascript
Js与Jq 获取页面元素值的方法和差异对比
Apr 30 #Javascript
js兼容pc端浏览器并有多种弹出小提示的手机端浮层控件实例
Apr 29 #Javascript
js实现支持手机滑动切换的轮播图片效果实例
Apr 29 #Javascript
jQuery实现冻结表格行和列
Apr 29 #Javascript
You might like
用PHP查询搜索引擎排名位置的代码
2010/01/05 PHP
ThinkPHP行为扩展Behavior应用实例详解
2014/07/22 PHP
从零开始学YII2框架(四)扩展插件yii2-kartikgii
2014/08/20 PHP
curl和libcurl的区别简介
2015/07/01 PHP
php 运算符与表达式详细介绍
2016/11/30 PHP
如何打开php的gd2库
2017/02/09 PHP
php日志函数error_log用法实例分析
2019/09/23 PHP
JavaScript面向对象之体会[总结]
2008/11/13 Javascript
使用jQuery快速解决input中placeholder值在ie中无法支持的问题
2014/01/02 Javascript
JS打开新窗口防止被浏览器阻止的方法
2015/01/03 Javascript
javascript实现的简单的表单验证
2015/07/10 Javascript
jQuery实现列表内容的动态载入特效
2015/08/08 Javascript
实用又漂亮的BootstrapValidator表单验证插件
2016/05/30 Javascript
React实践之Tree组件的使用方法
2017/09/30 Javascript
Vue.js中的computed工作原理
2018/03/22 Javascript
看看“疫苗查询”小程序有温度的代码
2018/07/31 Javascript
vue项目上传Github预览的实现示例
2018/11/06 Javascript
vue的keep-alive中使用EventBus的方法
2019/04/23 Javascript
详解vue中使用transition和animation的实例代码
2020/12/12 Vue.js
python学习数据结构实例代码
2015/05/11 Python
python 数据清洗之数据合并、转换、过滤、排序
2017/02/12 Python
解决Ubuntu pip 安装 mysql-python包出错的问题
2018/06/11 Python
完美解决在oj中Python的循环输入问题
2018/06/25 Python
Python实现PyPDF2处理PDF文件的方法示例
2019/09/25 Python
简单了解python元组tuple相关原理
2019/12/02 Python
python实现视频读取和转化图片
2019/12/10 Python
tensorflow实现二维平面模拟三维数据教程
2020/02/11 Python
django跳转页面传参的实现
2020/09/17 Python
css3遮罩层镂空效果的多种实现方法
2020/05/11 HTML / CSS
检测浏览器对HTML5和CSS3支持度的方法
2015/06/25 HTML / CSS
ECHT官方网站:男女健身服
2020/02/14 全球购物
阿迪达斯中国官网:Adidas中国
2020/12/14 全球购物
施工资料员岗位职责
2014/01/06 职场文书
惹女朋友生气检讨书
2015/05/06 职场文书
创业计划书之校园跑腿公司
2019/09/24 职场文书
Python Pandas读取Excel日期数据的异常处理方法
2022/02/28 Python