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 相关文章推荐
window.open的页面如何刷新(父页面)上层页面
Dec 28 Javascript
nodeType属性返回被选节点的节点类型介绍
Nov 22 Javascript
JavaScript弹出新窗口后向父窗口输出内容的方法
Apr 06 Javascript
使用Node.js实现HTTP 206内容分片的教程
Jun 23 Javascript
深入理解React高阶组件
Sep 28 Javascript
Vue组件通信之Bus的具体使用
Dec 28 Javascript
vue.js使用代理和使用Nginx来解决跨域的问题
Feb 03 Javascript
Vuejs 2.0 子组件访问/调用父组件的方法(示例代码)
Feb 08 Javascript
vue中tab选项卡的实现思路
Nov 25 Javascript
基于 vue-skeleton-webpack-plugin 的骨架屏实战
Aug 05 Javascript
小程序实现左滑删除的效果的实例代码
Oct 19 Javascript
JavaScript canvas实现流星特效
May 20 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通过curl获取接口URL的数据方法
2018/05/31 PHP
PHP微信H5支付开发实例
2018/07/25 PHP
Laravel 实现Controller向blade前台模板赋值的四种方式小结
2019/10/22 PHP
lib.utf.js
2007/08/21 Javascript
javascript下操作css的float属性的特殊写法
2007/08/22 Javascript
js下用层来实现select的title提示属性
2010/02/23 Javascript
JavaScript 滚轮事件使用说明
2010/03/07 Javascript
基于JQuery的浮动DIV显示提示信息并自动隐藏
2011/02/11 Javascript
JavaScript高级程序设计 阅读笔记(七) ECMAScript中的语句
2012/02/27 Javascript
Javascript中 关于prototype属性实现继承的原理图
2013/04/16 Javascript
js获取dom的高度和宽度(可见区域及部分等等)
2013/06/13 Javascript
js实现简单的省市县三级联动效果实例
2016/02/18 Javascript
使用JS在浏览器中判断当前网络连接状态的几种方法
2017/05/05 Javascript
微信小程序实现action-sheet弹出底部菜单功能【附源码下载】
2017/12/09 Javascript
微信小程序图片轮播组件gallery slider使用方法详解
2018/01/31 Javascript
ExtJs整合Echarts的示例代码
2018/02/27 Javascript
JavaScript如何对图片进行黑白化
2018/04/10 Javascript
详解Vue调用手机相机和相册以及上传
2019/05/05 Javascript
js简单遍历获取对象中的属性值的方法示例
2019/06/19 Javascript
Element Collapse 折叠面板的使用方法
2020/07/26 Javascript
从源码解析Python的Flask框架中request对象的用法
2016/06/02 Python
利用scrapy将爬到的数据保存到mysql(防止重复)
2018/03/31 Python
用Python写脚本,实现完全备份和增量备份的示例
2018/04/29 Python
pandas 数据实现行间计算的方法
2018/06/08 Python
Python中实例化class的执行顺序示例详解
2018/10/14 Python
Pandas-Cookbook 时间戳处理方式
2019/12/07 Python
Python操作MongoDb数据库流程详解
2020/03/05 Python
美国珠宝网上商店:Jeulia
2016/09/01 全球购物
Skyscanner阿联酋:全球领先的旅游搜索平台
2017/11/25 全球购物
TripAdvisor斯洛伐克:阅读评论、比较价格和酒店预订
2018/04/25 全球购物
德国最大的服装、鞋子和配件在线商店之一:Outfits24
2019/07/23 全球购物
联想阿根廷官方网站:Lenovo Argentina
2019/10/14 全球购物
公务员职务工作的自我评价
2013/11/01 职场文书
工作年限证明模板
2015/06/15 职场文书
Python Pandas pandas.read_sql函数实例用法
2021/06/21 Python
Python利用capstone实现反汇编
2022/04/06 Python