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 相关文章推荐
ExtJs 3.1 XmlTreeLoader Example Error
Feb 09 Javascript
文字溢出实现溢出的部分再放入一个新生成的div中具体代码
May 17 Javascript
JavaScript 操作table,可以新增行和列并且隔一行换背景色代码分享
Jul 05 Javascript
js处理json以及字符串的比较等常用操作
Sep 08 Javascript
jquery ztree实现下拉树形框使用到了json数据
May 14 Javascript
JavaScript控制两个列表框listbox左右交换数据的方法
Mar 18 Javascript
jquery正则表达式验证(手机号、身份证号、中文名称)
Dec 31 Javascript
原生JavaScript实现AJAX、JSONP
Feb 07 Javascript
详解vue的diff算法原理
May 20 Javascript
vue 中的keep-alive实例代码
Jul 20 Javascript
node使用mysql获取数据库数据中文乱码问题的解决
Dec 02 Javascript
vue+vant实现购物车全选和反选功能
Nov 17 Vue.js
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
NOT NULL 和NULL
2007/01/15 PHP
一步一步学习PHP(6) 面向对象
2010/02/16 PHP
在PHP中PDO解决中文乱码问题的一些补充
2010/09/06 PHP
深入PHP变量存储的详解
2013/06/13 PHP
PHP框架laravel的.env文件配置教程
2017/06/07 PHP
php 使用mpdf实现指定字段配置字体样式的方法
2019/07/29 PHP
PHP利用DWZ.CN服务生成短网址
2019/08/11 PHP
jquery 关键字“拖曳搜索”之“拖曳”以及 图片“提示自适应放大”效果 的实现
2010/04/18 Javascript
基于jQuery的烟花效果(运动相关)点击屏幕出烟花
2012/06/14 Javascript
jQuery拖拽 &amp; 弹出层 介绍与示例
2013/12/27 Javascript
jQuery基于图层模仿五星星评价功能的方法
2015/05/07 Javascript
thinkphp实现无限分类(使用递归)
2015/12/19 Javascript
利用jsonp跨域调用百度js实现搜索框智能提示
2016/08/24 Javascript
浅谈JS中String()与 .toString()的区别
2016/10/20 Javascript
微信小程序通过api接口将json数据展现到小程序示例
2017/01/20 Javascript
大白话讲解JavaScript的Promise
2017/04/06 Javascript
vue+ElementUI实现订单页动态添加产品数据效果实例代码
2017/07/13 Javascript
Vue 动态设置路由参数的案例分析
2018/04/24 Javascript
vue.js使用watch监听路由变化的方法
2018/07/08 Javascript
微信小程序地图导航功能实现完整源代码附效果图(推荐)
2019/04/28 Javascript
Node.JS枚举统计当前文件夹和子目录下所有代码文件行数
2019/08/23 Javascript
vue弹出框组件封装实例代码
2019/10/31 Javascript
浅谈TypeScript的类型保护机制
2020/02/23 Javascript
[02:37]2018DOTA2亚洲邀请赛赛前采访 VP.no[o]ne心中最强SOLO是谁
2018/04/04 DOTA
介绍Python的Django框架中的静态资源管理器django-pipeline
2015/04/25 Python
Python爬取国外天气预报网站的方法
2015/07/10 Python
详解Python迭代和迭代器
2016/03/28 Python
python 同时运行多个程序的实例
2019/01/07 Python
Python魔法方法 容器部方法详解
2020/01/02 Python
浅谈Python中range与Numpy中arange的比较
2020/03/11 Python
Canvas 像素处理之改变透明度的实现代码
2019/01/08 HTML / CSS
lululemon美国官网:瑜伽服+跑步装备
2018/11/16 全球购物
Haggar官网:美国男装品牌
2020/02/16 全球购物
中间件分为哪几类
2016/09/18 面试题
优秀的导游求职信范文
2014/04/06 职场文书
缓存替换策略及应用(以Redis、InnoDB为例)
2021/07/25 Redis