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 相关文章推荐
js验证表单第二部分
Nov 25 Javascript
我遇到的参数传递中 双引号单引号嵌套问题
Feb 11 Javascript
js Array对象的扩展函数代码
Apr 24 Javascript
js中单引号与双引号冲突问题解决方法
Oct 04 Javascript
简单时间提示DEMO从0开始一直进行计时
Nov 19 Javascript
深入理解javascript中return的作用
Dec 30 Javascript
js+canvas绘制五角星的方法
Jan 28 Javascript
js 轮播效果实例分享
Dec 28 Javascript
canvas实现动态小球重叠效果
Feb 06 Javascript
关于Angularjs中自定义指令一些有价值的细节和技巧小结
Apr 22 Javascript
Vue 路由 过渡动效 数据获取方法
Jul 31 Javascript
JS函数内部属性之arguments和this实例解析
Oct 07 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
使用Limit参数优化MySQL查询的方法
2008/11/12 PHP
php 表单验证实现代码
2009/03/10 PHP
php adodb操作mysql数据库
2009/03/19 PHP
php的一些小问题
2010/07/03 PHP
php限制ip地址范围的方法
2015/03/31 PHP
PHP实现全角字符转为半角方法汇总
2015/07/09 PHP
PHP查询并删除数据库多列重复数据的方法(利用数组函数实现)
2016/02/23 PHP
tp5.1 实现setInc字段自动加1
2019/10/18 PHP
contains和compareDocumentPosition 方法来确定是否HTML节点间的关系
2011/09/13 Javascript
js取两个数组的交集|差集|并集|补集|去重示例代码
2013/08/07 Javascript
Bootstrap学习笔记之js组件(4)
2016/06/12 Javascript
js传值后台中文出现乱码的解决方法
2016/06/30 Javascript
JS控制HTML元素的显示和隐藏的两种方法
2016/09/27 Javascript
详解在Angular项目中添加插件ng-bootstrap
2017/07/04 Javascript
深入解析ES6中的promise
2018/11/08 Javascript
vue项目中使用scss的方法步骤
2019/05/16 Javascript
jQuery实现动态加载瀑布流
2020/09/01 jQuery
python队列通信:rabbitMQ的使用(实例讲解)
2017/12/22 Python
Python实现将照片变成卡通图片的方法【基于opencv】
2018/01/17 Python
pandas.loc 选取指定列进行操作的实例
2018/05/18 Python
python在TXT文件中按照某一字符串取出该字符串所在的行方法
2018/12/10 Python
利用python实现在微信群刷屏的方法
2019/02/21 Python
python ChainMap的使用和说明详解
2019/06/11 Python
解决django无法访问本地static文件(js,css,img)网页里js,cs都加载不了
2020/04/07 Python
基于PyTorch的permute和reshape/view的区别介绍
2020/06/18 Python
Python常用类型转换实现代码实例
2020/07/28 Python
python如何实现word批量转HTML
2020/09/30 Python
澳大利亚冒险体验:Adrenaline(跳伞、V8赛车、热气球等)
2017/09/18 全球购物
体育教育毕业生自荐信
2013/11/21 职场文书
实习生自我鉴定范文
2013/12/05 职场文书
捐助贫困学生倡议书
2014/05/16 职场文书
英文邀请函
2015/02/02 职场文书
周一早安温馨问候祝福语!
2019/07/15 职场文书
Python 循环读取数据内存不足的解决方案
2021/05/25 Python
SQL Server中使用判断语句(IF ELSE/CASE WHEN )案例
2021/07/07 SQL Server
十大必看国产动漫排名,魁拔上线,第二曾在日本播出
2022/03/18 国漫