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 相关文章推荐
用于自动添加Digg This!按钮的JavaScript
Dec 23 Javascript
javascript针对DOM的应用分析(三)
Apr 15 Javascript
JavaScript:new 一个函数和直接调用函数的区别分析
Jul 10 Javascript
5个可以帮你理解JavaScript核心闭包和作用域的小例子
Oct 08 Javascript
jQuery 实现侧边浮动导航菜单效果
Dec 26 Javascript
教你使用javascript简单写一个页面模板引擎
May 05 Javascript
详细分析jsonp的原理和实现方式
Nov 20 Javascript
JavaScript实现计算圆周率到小数点后100位的方法示例
May 08 Javascript
JS实现的RC4加密算法示例
Aug 16 Javascript
如何从零开始手写Koa2框架
Mar 22 Javascript
setTimeout与setInterval的区别浅析
Mar 23 Javascript
layui数据表格重载实现往后台传参
Nov 15 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
PHP中数据库单例模式的实现代码分享
2014/08/21 PHP
typecho插件编写教程(五):核心代码
2015/05/28 PHP
在修改准备发的批量美化select+可修改select时,在非IE下发现了几个问题
2007/01/09 Javascript
批量实现面向对象的实例代码
2013/07/01 Javascript
jquery中get,post和ajax方法的使用小结
2014/02/04 Javascript
JQuery EasyUI 加载两次url的原因分析及解决方案
2014/08/18 Javascript
javascript实现类似超链接的效果
2014/12/26 Javascript
AngularJS快速入门
2015/04/02 Javascript
AngularJS中监视Scope变量以及外部调用Scope方法
2016/01/23 Javascript
使用jQuery Mobile框架开发移动端Web App的入门教程
2016/05/17 Javascript
JS关闭窗口时产生的事件及用法示例
2016/08/20 Javascript
js调用父框架函数与弹窗调用父页面函数的简单方法
2016/11/01 Javascript
Angular中$broadcast和$emit的使用方法详解
2017/05/22 Javascript
webpack进阶——缓存与独立打包的用法
2017/08/02 Javascript
仿京东快报向上滚动的实例
2017/12/13 Javascript
Fundebug支持监控微信小程序HTTP请求错误的方法
2019/02/21 Javascript
8 个有用的JS技巧(推荐)
2019/07/03 Javascript
JQuery省市联动效果实现过程详解
2020/05/08 jQuery
解决nuxt页面中mounted、created、watch执行两遍的问题
2020/11/05 Javascript
深入Python函数编程的一些特性
2015/04/13 Python
Python 中 Meta Classes详解
2016/02/13 Python
python使用os.listdir和os.walk获得文件的路径的方法
2017/12/16 Python
Django使用HttpResponse返回图片并显示的方法
2018/05/22 Python
浅谈python3中input输入的使用
2019/08/02 Python
PyTorch中topk函数的用法详解
2020/01/02 Python
Python使用type动态创建类操作示例
2020/02/29 Python
Python 定义只读属性的实现方式
2020/03/05 Python
解决windows下python3使用multiprocessing.Pool出现的问题
2020/04/08 Python
详解如何用canvas画一个微笑的表情
2019/03/14 HTML / CSS
html5 video全屏播放/自动播放的实现示例
2020/08/06 HTML / CSS
KEEN美国官网:美国人气户外休闲鞋品牌
2021/03/09 全球购物
神路信息Java面试题目
2013/03/31 面试题
2014年五四青年节演讲比赛方案
2014/04/22 职场文书
售房协议书
2014/08/19 职场文书
个人主要事迹材料
2014/08/26 职场文书
Python爬虫之爬取某文库文档数据
2021/04/21 Python