jQuery each()方法的使用方法


Posted in Javascript onMarch 18, 2010

jQuery和jQuery对象都实现了该方法,对于jQuery对象,只是把each方法简单的进行了委托:把jQuery对象作为第一个参数传递给jQuery的each方法.换句话说:jQuery提供的each方法是对参数一提供的对象的中所有的子元素逐一进行方法调用。而jQuery对象提供的each方法则是对jQuery内部的子元素进行逐个调用。

jQuery.prototype.each=function( fn, args ) { 
return jQuery.each( this, fn, args ); 
}

让我们看一下jQuery提供的each方法的具体实现,
jQuery.each(obj,fn,arg)
该方法有三个参数:进行操作的对象obj,进行操作的函数fn,函数的参数args。
让我们根据ojb对象进行讨论:

1.obj对象是数组
each方法会对数组中子元素的逐个进行fn函数调用,直至调用某个子元素返回的结果为false为止,也就是说,我们可以在提供的fn函数进行处理,使之满足一定条件后就退出each方法调用。当each方法提供了arg参数时,fn函数调用传入的参数为arg,否则为:子元素索引,子元素本身
2.obj 对象不是数组
该方法同1的最大区别是:fn方法会被逐次不考虑返回值的进行进行。换句话说,obj对象的所有属性都会被fn方法进行调用,即使fn函数返回false。调用传入的参数同1类似。

jQuery.each=function( obj, fn, args ) { 
if ( args ) { 
if ( obj.length == undefined ){ 
for ( var i in obj ) 
fn.apply( obj, args ); 
}else{ 
for ( var i = 0, ol = obj.length; i < ol; i++ ) { 
if ( fn.apply( obj, args ) === false ) 
break; } 
} 
} else { 
if ( obj.length == undefined ) { 
for ( var i in obj ) 
fn.call( obj, i, obj ); 
}else{ 
for ( var i = 0, ol = obj.length, val = obj[0]; i < ol && fn.call(val,i,val) !== false; val = obj[++i] ){} 
} 
} 
return obj; 
}

需要特别注意的是each方法中fn的具体调用方法并不是采用简单的fn(i,val)或fn(args),而是采用了fn.call(val,i,val)或fn.apply(obj.args)的形式,这意味着,在你自己的fn的实现中,可以直接采用this指针引用数组或是对象的子元素。这种方式是绝大多数jQuery所采用的一种实现方式。
在jQuery里有一个each方法,用起来非常的爽,不用再像原来那样写for循环,jQuery源码里自己也有很多用到each方法。
其实jQuery里的each方法是通过js里的call方法来实现的。
下面简单介绍一下call方法。
call这个方法很奇妙,其实官方的说明是:“调用一个对象的一个方法,以另一个对象替换当前对象。”网上更多的解释是变换上下文环境,也有说是改变上下文this指针。
call([thisObj[,arg1[, arg2[, [,.argN]]]]])
参数
thisObj
可选项。将被用作当前对象的对象。
arg1, arg2, , argN
可选项。将被传递方法参数序列。
说明
call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。
引用网上有一个很经典的例子
Js代码
function add(a,b) 
{ 
alert(a+b); 
} 
function sub(a,b) 
{ 
alert(a-b); 
} 
add.call(sub,3,1);

用 add 来替换 sub,add.call(sub,3,1) == add(3,1) ,所以运行结果为:alert(4);
注意:js 中的函数其实是对象,函数名是对 Function 对象的引用。
具体call更深入的就不在这里提了。
下面提一下jQuery的each方法的几种常用的用法
Js代码
var arr = [ "one", "two", "three", "four"]; 
$.each(arr, function(){ 
alert(this); 
}); 
//上面这个each输出的结果分别为:one,two,three,four 
var arr1 = [[1, 4, 3], [4, 6, 6], [7, 20, 9]] 
$.each(arr1, function(i, item){ 
alert(item[0]); 
}); 
//其实arr1为一个二维数组,item相当于取每一个一维数组, 
//item[0]相对于取每一个一维数组里的第一个值 
//所以上面这个each输出分别为:1 4 7 
var obj = { one:1, two:2, three:3, four:4}; 
$.each(obj, function(key, val) { 
alert(obj[key]); 
}); 
//这个each就有更厉害了,能循环每一个属性 
//输出结果为:1 2 3 4
Javascript 相关文章推荐
javascript中的undefined 与 null 的区别  补充篇
Mar 17 Javascript
idTabs基于JQuery的根据URL参数选择Tab插件
Apr 11 Javascript
JS中图片缓冲loading技术的实例代码
Aug 29 Javascript
javascript弹出层输入框(示例代码)
Dec 11 Javascript
JS(JQuery)操作Array的相关方法介绍
Feb 11 Javascript
使用Browserify配合jQuery进行编程的超级指南
Jul 28 Javascript
关于JavaScript限制字数的输入框的那些事
Aug 14 Javascript
Ajax基础知识详解
Feb 17 Javascript
vue使用v-for实现hover点击效果
Sep 29 Javascript
vue-cli 3.0 版本与3.0以下版本在搭建项目时的区别详解
Dec 11 Javascript
node.js实现上传文件功能
Jul 15 Javascript
element-ui tooltip修改背景颜色和箭头颜色的实现
Dec 16 Javascript
jQuery each()小议
Mar 18 #Javascript
jquery ajax执行后台方法
Mar 18 #Javascript
jQuery中与toggleClass等价的程序段 以及未来学习的方向
Mar 18 #Javascript
javascript 验证日期的函数
Mar 18 #Javascript
12个非常有创意的JavaScript小游戏
Mar 18 #Javascript
JQuery 插件模板 制作jquery插件的朋友可以参考下
Mar 17 #Javascript
jquery 简单图片导航插件jquery.imgNav.js
Mar 17 #Javascript
You might like
基于MySQL分区性能的详细介绍
2013/05/02 PHP
解决PHP mysql_query执行超时(Fatal error: Maximum execution time …)
2013/07/03 PHP
分享常见的几种页面静态化的方法
2015/01/08 PHP
php 解决substr()截取中文字符乱码问题
2016/07/18 PHP
详谈symfony window下的安装 安装时候出现的问题以及解决方法
2017/09/28 PHP
Jquery submit()无法提交问题
2013/04/21 Javascript
基于jQuery.Validate验证库知识点的详解
2013/04/26 Javascript
express的中间件basicAuth详解
2014/12/04 Javascript
正则表达式优化JSON字符串的技巧
2015/12/24 Javascript
JavaScript 对象详细整理总结
2016/09/29 Javascript
Angular 4依赖注入学习教程之ValueProvider的使用(七)
2017/06/04 Javascript
jQuery层级选择器_动力节点节点Java学院整理
2017/07/04 jQuery
原生js的ajax和解决跨域的jsonp(实例讲解)
2017/10/16 Javascript
详解javascript常用工具类的封装
2018/01/30 Javascript
JS实现点击生成UUID的方法完整实例【基于jQuery】
2019/06/12 jQuery
Python中使用ConfigParser解析ini配置文件实例
2014/08/30 Python
python之yield表达式学习
2014/09/02 Python
Windows平台Python连接sqlite3数据库的方法分析
2017/07/12 Python
Python cookbook(数据结构与算法)实现优先级队列的方法示例
2018/02/18 Python
如何用Python合并lmdb文件
2018/07/02 Python
windows下python 3.6.4安装配置图文教程
2018/08/21 Python
Python爬虫基础之XPath语法与lxml库的用法详解
2018/09/13 Python
Python 移动光标位置的方法
2019/01/20 Python
使用Pandas对数据进行筛选和排序的实现
2019/07/29 Python
Python zip函数打包元素实例解析
2019/12/11 Python
python小白学习包管理器pip安装
2020/06/09 Python
Django之腾讯云短信的实现
2020/06/12 Python
html5桌面通知(Web Notifications)实例解析
2014/07/07 HTML / CSS
浅析HTML5页面元素及属性
2021/01/20 HTML / CSS
意大利奢华内衣制造商:Cosabella
2017/08/29 全球购物
德国苹果商店:MacTrade
2020/05/18 全球购物
J2EE是技术还是平台还是框架
2016/08/14 面试题
通信工程专业毕业生推荐信
2013/12/25 职场文书
房屋转让协议书
2014/04/11 职场文书
授权委托书范文
2014/07/31 职场文书
2015年导购员工作总结
2015/04/25 职场文书