jQuery源码分析之jQuery.fn.each与jQuery.each用法


Posted in Javascript onJanuary 23, 2015

本文实例讲述了jQuery源码分析之jQuery.fn.each与jQuery.each用法。分享给大家供大家参考。具体分析如下:

先上例子,下面代码的作用是:对每个选中的div元素,都给它们添加一个red类

$('div').each(function(index, elem){

  

    $(this).addClass('red');

}

});

上面用的的.each,即jQuery.fn.each,其内部是通过jQuery.each实现的

jQuery.fn.each

先贴一下类官方API说明,非常简单,只有两点需要注意
上文例子里的$(this).addClass('red'),其中,this指的是当前操作的dom元素
each中传入的方法,可以返回任意值,当返回的值为false时,跳出当前循环操作
/**

  

 * @description 对jQuery对象中,匹配的的每个dom元素执行一个方法

  

 * @param {Number} index 当前处理元素在集合中的位置

  

 * @param {DOMElement} Element 当前处理的dom元素

 

*/

.

.each( function(index, Element) )

下面举两个简单的例子

例子一:

给页面所有的div元素添加red类

$('div').each(function(index, elem){

  

    $(this).addClass('red');

}

});

例子二

给页面前5个div元素添加red类

$('div').each(function(index, elem){

  

    if(index>=5) return false;  // 跳出循环

    $(this).addClass('red');

}

});

如上,用法挺简单,不赘述,详细可查看 http://api.jquery.com/each/

源码内部是通过jQuery.each实现的,下面就讲下jQuery.each的源码,讲完jQuery.each的源码,jQuery.fn.each的源码就很简单了
 
jQuery.each:

同样是先上一个简单的例子

$.each([52, 97], function(index, value) {

  alert(index + ': ' + value + ':' + this);

}

});

输出内容如下:

0: 52-52
1
1: 97-97

类官方API说明

同样是有两个注意点

上面例子中的this,是集合中的元素,即下面的 valueOfElement
在callback中返回false,可以跳出循环

/**

  

 * @description 对集合(数组或对象)中的每个元素,执行某个操作

  

 * @param {Number|String} indexInArray 元素在集合中对应的位置(如集合为数组,则为数字;如集合为对象,则为键值)

  

 * @param {AnyValue} valueOfElement 集合中的元素

 

*/

j

jQuery.each( collection, callback(indexInArray, valueOfElement) )

 
例子一
$.each( ['one,'two','three', 'four'], function(index, value){

  

    if(index >= 2) return false;

  

    alert( "Index:" + index + ", value: " + value );

}

});

例子二

从官网直接copy来的例子,凑合着看

$.each( { name: "John", lang: "JS" }, function(k, v){

  

    alert( "Key: " + k + ", Value: " + v );

}

});

源码:
// args is for internal usage only

e

each: function( obj, callback, args ) {

  

    var value,

  

        i = 0,

  

        length = obj.length,

  

        isArray = isArraylike( obj );   // obj是不是类似数组的对象,比如 {'0':'hello', '1':'world', 'length':2},其实就是为jQuery对象服务啦

 

    if ( args ) {   // args,其实没发现这个参数有什么实际作用~~直接跳过看else里面的内容即可,除了callback传的参数不同外无其他区别

        if ( isArray ) {

            for ( ; i < length; i++ ) {

                value = callback.apply( obj[ i ], args );

                if ( value === false ) {

                    break;

                }

            }

        } else {

            for ( i in obj ) {

                value = callback.apply( obj[ i ], args );

                if ( value === false ) {

                    break;

                }

            }

        }

    // A special, fast, case for the most common use of each

    } else {

        if ( isArray ) {    // 处理数组

            for ( ; i < length; i++ ) {

                value = callback.call( obj[ i ], i, obj[ i ] );

                if ( value === false ) {

                    break;

                }

            }

        } else {    // 处理对象

            for ( i in obj ) {

                value = callback.call( obj[ i ], i, obj[ i ] ); // value 为callback的返回值

                if ( value === false ) {    // 注意这里,当value===false的时候,直接跳出循环了

                    break;

                }

            }

        }

    }

    return obj;

}

},

 
 
迟到的jQuery.fn.each源码:

的确很简单,只要理解了jQuery.each应该就没问题了,没什么好讲的~

each: function( callback, args ) {

  

    return jQuery.each( this, callback, args );

}

},

 
结束语

与jQuery.extend、jQuery.fn.extend一样,虽然 jQuery.each、jQuery.fn.each代码很简单,但也扮演了相当重要的作用,jQuery里大量用到了这两个方法,举例:

jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {

  

    class2type[ "[object " + name + "]" ] = name.toLowerCase();

}

});

所以,好好掌握each!

希望本文所述对大家的jQuery程序设计有所帮助。

Javascript 相关文章推荐
JavaScript中将一个值转换为字符串的方法分析[译]
Sep 21 Javascript
Js参数值中含有单引号或双引号问题的解决方法
Nov 06 Javascript
用html+css+js实现的一个简单的图片切换特效
May 28 Javascript
Javascript无参数和有参数类继承问题解决方法
Mar 02 Javascript
jQuery定义背景动态切换效果的方法
Mar 23 Javascript
js兼容火狐显示上传图片预览效果的方法
May 21 Javascript
JavaScript实现下拉列表框数据增加、删除、上下排序的方法
Aug 11 Javascript
jquery实现最简单的滑动菜单效果代码
Sep 12 Javascript
JavaScript中文件上传API详解
Apr 01 Javascript
五步轻松实现zTree的使用
Nov 01 Javascript
详解vue中多个有顺序要求的异步操作处理
Oct 29 Javascript
Vue项目中数据的深度监听或对象属性的监听实例
Jul 17 Javascript
AngularJS语法详解(续)
Jan 23 #Javascript
Jquery动态替换div内容及动态展示的方法
Jan 23 #Javascript
AngularJS语法详解
Jan 23 #Javascript
JQuery选择器绑定事件及修改内容的方法
Jan 23 #Javascript
angular中使用路由和$location切换视图
Jan 23 #Javascript
JavaScript中的类与实例实现方法
Jan 23 #Javascript
PHP中CURL的几个经典应用实例
Jan 23 #Javascript
You might like
ThinkPHP3.1新特性之命名范围的使用
2014/06/19 PHP
54个提高PHP程序运行效率的方法
2015/07/19 PHP
PHP使用imagick扩展实现合并图像的方法
2017/04/25 PHP
yii2.0整合阿里云oss删除单个文件的方法
2017/09/19 PHP
Docker搭建自己的PHP开发环境
2018/02/24 PHP
js几个验证函数代码
2010/03/25 Javascript
ASP.NET中使用后端代码注册脚本 生成JQUERY-EASYUI的界面错位的解决方法
2010/06/12 Javascript
不使用中间变量,交换int型的 a, b两个变量的值。
2010/10/29 Javascript
Extjs TimeField 显示正常时间格式的代码
2011/06/28 Javascript
JS根据变量保存方法名并执行方法示例
2014/04/04 Javascript
jquery鼠标放上去显示悬浮层即弹出定位的div层
2014/04/25 Javascript
JavaScript类型检测之typeof 和 instanceof 的缺陷与优化
2016/01/13 Javascript
基于jQuery实现带动画效果超炫酷的弹出对话框(附源码下载)
2016/02/22 Javascript
BootStrap中按钮点击后被禁用按钮的最佳实现方法
2016/09/23 Javascript
bootstrapfileinput实现文件自动上传
2016/11/08 Javascript
JS获取多维数组中相同键的值实现方法示例
2017/01/06 Javascript
Angular4.x通过路由守卫进行路由重定向实现根据条件跳转到相应的页面(推荐)
2018/05/10 Javascript
Vue2.0点击切换类名改变样式的方法
2018/08/22 Javascript
详解Vue组件插槽的使用以及调用组件内的方法
2018/11/13 Javascript
使用Vue.observable()进行状态管理的实例代码详解
2019/05/26 Javascript
vue中实现Monaco Editor自定义提示功能
2019/07/05 Javascript
Vue打包后访问静态资源路径问题
2019/11/08 Javascript
网站渗透常用Python小脚本查询同ip网站
2017/05/08 Python
Python进阶学习之特殊方法实例详析
2017/12/01 Python
python实现员工管理系统
2018/01/11 Python
pygame实现简易飞机大战
2018/09/11 Python
结合OpenCV与TensorFlow进行人脸识别的实现
2019/10/10 Python
Python Tkinter实例——模拟掷骰子
2020/10/24 Python
Python wordcloud库安装方法总结
2020/12/31 Python
CSS3实现点击放大的动画实例代码
2017/02/27 HTML / CSS
生产副总岗位职责
2013/11/28 职场文书
研究生求职推荐信范文
2013/11/30 职场文书
电钳工人个人求职信
2014/05/10 职场文书
受伤赔偿协议书
2014/09/24 职场文书
开展党的群众路线教育实践活动工作总结
2014/11/05 职场文书
个人工作年终总结
2015/03/09 职场文书