jQuery.each使用详解


Posted in Javascript onJuly 07, 2015

jQuery.each方法是jQuery的核心工具方法之一,通用例遍方法,可用于例遍对象和数组。不同于例遍 jQuery 对象的 $().each() 方法,此方法可用于例遍任何对象。通常需要两个参数

object:需要例遍的对象或数组。

callback:每个成员/元素执行的回调函数。

回调函数拥有两个参数:第一个为对象的成员或数组的索引,第二个为对应变量或内容。如果需要退出 each 循环可使回调函数返回 false,其它返回值将被忽略。

例遍数组,同时使用元素索引和内容。举例如下:

//例遍对象,同时使用成员名称和变量内容。

$.each( [0,1,2], function(i, n){
 alert( "Item #" + i + ": " + n );
});
//例遍对象,同时使用成员名称和变量内容。

$.each( { name: "John", lang: "JS" }, function(i, n){
 alert( "Name: " + i + ", Value: " + n );
});

当然也可以直接使用实例调用

$( 'div' ).each( function(i,n){
    return i+n.text;
  } )

其实在源码中实例(原型)方法也是调用的静态方法,所以分析each方法只需要分析其静态方法即可,实例调用只不过是静态方法使用中的一个特例罢了。

// Execute a callback for every element in the matched set.
  // (You can seed the arguments with an array of args, but this is
  // only used internally.)
  each: function( callback, args ) {
    return jQuery.each( this, callback, args );
  },

在原型方法中直接把this对象当作待遍历的对象传入,下面是静态方法的源码

// args is for internal usage only
  each: function( object, callback, args ) {
    var name, i = 0,
      length = object.length,
      isObj = length === undefined || jQuery.isFunction( object );
    if ( args ) {
      if ( isObj ) {
        for ( name in object ) {
          if ( callback.apply( object[ name ], args ) === false ) {
            break;
          }
        }
      } else {
        for ( ; i < length; ) {
          if ( callback.apply( object[ i++ ], args ) === false ) {
            break;
          }
        }
      }

    // A special, fast, case for the most common use of each
    } else {
      if ( isObj ) {
        for ( name in object ) {
          if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
            break;
          }
        }
      } else {
        for ( ; i < length; ) {
          if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) {
            break;
          }
        }
      }
    }

    return object;
  },

东西也不是很多,首先接受3个参数,这个时候就要注意了在我们经常使用的手册中一般是写的两个参数的我们一般使用也是使用两个参数,但是其实在源码中是有3个参数可以接受的,其中第三个参数是一个数组,会作为回调函数的参数传入。

首先声明几个变量,i、name和length是为循环做准备的,isObj是为了区分待便利的参数是数组还是对象,通过判断该参数如果是函数或者length属性不存在来判断是对象,其他的就按数组或者类数组来处理。

isObj = length === undefined || jQuery.isFunction( object );
这一句写的很精简利用运算符的优先顺序先执行===

其实这样的判断并不是很精准只是一个大致的区分,比如:

var obj={length:'a'};
 var isObj= obj.length=== undefined || jQuery.isFunction( obj );
 alert(isObj); //false

然后就是根据是否添加第三个参数进行区分,先看下没有添加的情况也就是

} else {
      if ( isObj ) {
        for ( name in object ) {
          if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
            break;
          }
        }
      } else {
        for ( ; i < length; ) {
          if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) {
            break;
          }
        }
      }
    }

根据isObj变量“区分”数组和对象,对于数组使用for循环,对于对象采用for...in循环,每循环一此就会执行一次回调函数并把当前循环的数组或者对象键和值传进去,这里使用的call方法,第一个参数是函数的“this”也就是把当前循环的值作为this后面两个是键和值或者是指针和值,所以我们使用循环中使用回调函数的第二个参数跟使用this是一样的。比如:

//刚才的例子
 $( 'div' ).each( function(i,n){
    return i+n.text;
  } )
//等价于
 $( 'div' ).each( function(i,n){
    return i+this.text;
  } )

  对于添加了第三个参数的情况而言就是改变了回调函数的传值方式,使用的是apply方法来传递参数,this指向的依然是当前值只不过把args也就是第三个参数数组传递进去,这个数组有多少参数那么回调函数就有多少参数可以用,这里需要注意的是第三个一定是js原声数组形式不能是类数组或者jQuery对象否则会报错因为apply方法不支持。如果回调函数返回false那么将跳过循环比如我们可以只处理奇数下标数组是可以判断是偶数项时在回调函数中执行return false即可

return object;

最后返回原对象或者数组等

以上所述就是本文的全部内容了,希望大家能够喜欢。

Javascript 相关文章推荐
基于jquery实现的移入页面上空文本框时,让它变为焦点,移出清除焦点
Jul 26 Javascript
文本域中换行符的替换示例
Mar 04 Javascript
jQuery html()方法使用不了无法显示内容的问题
Aug 06 Javascript
浅谈jQuery异步对象(XMLHttpRequest)
Nov 17 Javascript
jquery Easyui快速开发总结
Aug 20 Javascript
JS实现状态栏跑马灯文字效果代码
Oct 24 Javascript
基于AngularJS+HTML+Groovy实现登录功能
Feb 17 Javascript
Fullpage.js固定导航栏-实现定位导航栏
Mar 17 Javascript
vue 请求后台数据的实例代码
Jun 22 Javascript
ECMAscript 变量作用域总结概括
Aug 18 Javascript
vue组件间的参数传递实例详解
Apr 26 Javascript
Element Breadcrumb 面包屑的使用方法
Jul 26 Javascript
JavaScript中字符串拼接的基本方法
Jul 07 #Javascript
简单介绍JavaScript中字符串创建的基本方法
Jul 07 #Javascript
浅谈JavaScript中运算符的优先级
Jul 07 #Javascript
浏览器中url存储的JavaScript实现
Jul 07 #Javascript
浅谈JavaScript中的作用域和闭包问题
Jul 07 #Javascript
深入分析下javascript中的[]()+!
Jul 07 #Javascript
javascript实现的多个层切换效果通用函数实例
Jul 06 #Javascript
You might like
真正面向对象编程:PHP5.01发布
2006/10/09 PHP
关于访问控制的一首PHP面试题(对属性或方法的访问控制)
2012/09/13 PHP
php使用递归函数实现数字累加的方法
2015/03/16 PHP
javascript中的有名函数和无名函数
2007/10/17 Javascript
解决jquery异步按一定的时间间隔刷新问题
2012/12/10 Javascript
深入理解JavaScript系列(46):代码复用模式(推荐篇)详解
2015/03/04 Javascript
关于JS 预解释的相关理解
2016/06/28 Javascript
jquery+ajax+text文本框实现智能提示完整实例
2016/07/09 Javascript
jQuery web 组件 后台日历价格、库存设置的代码
2016/10/14 Javascript
js实现消息滚动效果
2017/01/18 Javascript
浅谈angular2的http请求返回结果的subcribe注意事项
2017/03/01 Javascript
Node.Js中实现端口重用原理详解
2018/05/03 Javascript
在Mac下彻底卸载node和npm的方法
2018/05/16 Javascript
vue-router的HTML5 History 模式设置
2018/09/08 Javascript
详解JS浏览器事件循环机制
2019/03/27 Javascript
Python微信企业号开发之回调模式接收微信端客户端发送消息及被动返回消息示例
2017/08/21 Python
python+selenium实现登录账户后自动点击的示例
2017/12/22 Python
使用numba对Python运算加速的方法
2018/10/15 Python
python3利用ctypes传入一个字符串类型的列表方法
2019/02/12 Python
python使用mitmproxy抓取浏览器请求的方法
2019/07/02 Python
SteelSeries赛睿官网:游戏外设和配件的领先制造商(耳机、键盘、鼠标和鼠标垫)
2018/06/17 全球购物
奥地利时尚、美容、玩具和家居之家:Kastner & Öhler
2020/04/26 全球购物
C# Debug和Testing相关面试题
2015/10/25 面试题
汽车维修专业毕业生的求职信分享
2013/12/04 职场文书
生日宴会答谢词
2014/01/09 职场文书
食品安全检查制度
2014/02/03 职场文书
马云北大演讲完整版:真心话,什么才是阿里的核心竞争力?
2014/04/04 职场文书
球队口号
2014/06/18 职场文书
作风转变心得体会
2014/09/02 职场文书
广告设计专业毕业生自我鉴定
2014/09/27 职场文书
村主任个人对照检查材料
2014/10/01 职场文书
2014年全国法制宣传日宣传活动方案
2014/11/02 职场文书
班干部竞选演讲稿(精选5篇)
2019/09/24 职场文书
vue引入Excel表格插件的方法
2021/04/28 Vue.js
mysql联合索引的使用规则
2021/06/23 MySQL
《极主夫道》真人电影正式预告 定档6月3日上映
2022/04/05 日漫