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显示随机图像或引用
Apr 21 Javascript
分享27个jQuery 表单插件集合推荐
Apr 25 Javascript
div浮层,滚动条移动,位置保持不变的4种方法汇总
Dec 11 Javascript
js数组操作常用方法
May 08 Javascript
详解angularjs的数组传参方式的简单实现
Jul 28 Javascript
zTree树形菜单交互选项卡效果的实现方法
Dec 25 Javascript
vue实现提示保存后退出的方法
Mar 15 Javascript
element-ui 上传图片后清空图片显示的实例
Sep 04 Javascript
vue实现全匹配搜索列表内容
Sep 26 Javascript
Angular8 简单表单验证的实现示例
Jun 03 Javascript
vue+elementui通用弹窗的实现(新增+编辑)
Jan 07 Vue.js
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中的正规表达式(一)
2006/10/09 PHP
PHP快速导出百万级数据到CSV或者EXCEL文件
2020/11/27 PHP
基于JQuery的Pager分页器实现代码
2010/07/17 Javascript
在Windows上安装Node.js模块的方法
2011/09/25 Javascript
用js通过url传参把数据从一个页面传到另一个页面
2014/09/01 Javascript
IE浏览器下PNG相关功能
2015/07/05 Javascript
纯javascript实现图片延时加载方法
2015/08/21 Javascript
jquery获取url参数及url加参数的方法
2015/10/26 Javascript
基于jQuery实现简单的折叠菜单效果
2015/11/23 Javascript
理解JavaScript表单的基础知识
2016/01/25 Javascript
基于javascript的Form表单验证
2016/12/29 Javascript
jQuery源码分析之sizzle选择器详解
2017/02/13 Javascript
使用 NodeJS+Express 开发服务端的简单介绍
2017/04/07 NodeJs
Angularjs上传图片实例详解
2017/08/06 Javascript
详解webpack3如何正确引用并使用jQuery库
2017/08/26 jQuery
vue页面离开后执行函数的实例
2018/03/13 Javascript
通过jquery获取上传文件名称、类型和大小的实现代码
2018/04/19 jQuery
Vue创建头部组件示例代码详解
2018/10/23 Javascript
理解Proxy及使用Proxy实现vue数据双向绑定操作
2020/07/18 Javascript
Python日期操作学习笔记
2008/10/07 Python
在Python中处理XML的教程
2015/04/29 Python
Python实现MySQL操作的方法小结【安装,连接,增删改查等】
2017/07/12 Python
Python学习笔记之自定义函数用法详解
2019/06/08 Python
详解python编译器和解释器的区别
2019/06/24 Python
浅谈django channels 路由误导
2020/05/28 Python
纽约JewelryAffairs珠宝店:精细金银时尚首饰
2017/02/05 全球购物
波兰品牌鞋履在线商店:Eastend.pl
2020/01/11 全球购物
Hotels.com韩国:海外国内旅行所需的酒店和住宿预订网站
2020/05/08 全球购物
linux面试题参考答案(5)
2014/09/01 面试题
高中毕业生登记表自我鉴定范文
2014/03/18 职场文书
股权转让协议书范本
2014/04/12 职场文书
企业形象策划方案
2014/05/29 职场文书
中考标语大全
2014/06/05 职场文书
博士生专家推荐信
2015/03/25 职场文书
pycharm 如何查看某一函数源码的快捷键
2021/05/12 Python
安装pytorch时报sslerror错误的解决方案
2021/05/17 Python