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 相关文章推荐
动态改变textbox的宽高的js
Oct 26 Javascript
javascript-简单的日历实现及Date对象语法介绍(附图)
May 30 Javascript
js获取系统的根路径实现介绍
Sep 08 Javascript
创建、调用JavaScript对象的方法集锦
Dec 24 Javascript
Javascript实现获取及设置光标位置的方法
Jul 21 Javascript
jQuery ui实现动感的圆角渐变网站导航菜单效果代码
Aug 26 Javascript
Angular.js自动化测试之protractor详解
Jul 07 Javascript
ECMAscript 变量作用域总结概括
Aug 18 Javascript
bootstrap switch开关组件使用方法详解
Aug 22 Javascript
vue的常用组件操作方法应用分析
Apr 13 Javascript
浅谈Vue.js组件(二)
Apr 09 Javascript
layui字体图标 loading图标静止不旋转的解决方法
Sep 23 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数组
2006/10/09 PHP
php扩展ZF――Validate扩展
2008/01/10 PHP
PHP 采集心得技巧
2009/05/15 PHP
php中的比较运算符详解
2013/10/28 PHP
PHP页面中文乱码分析
2013/10/29 PHP
PHP扩展模块Pecl、Pear以及Perl的区别
2014/04/09 PHP
PHP代码维护,重构变困难的4种原因分析
2016/01/25 PHP
PHP模板引擎Smarty内置变量调解器用法详解
2016/04/11 PHP
ModelDialog JavaScript模态对话框类代码
2011/04/17 Javascript
使用UglifyJS合并/压缩JavaScript的方法
2012/03/07 Javascript
javascript实现TreeView 无刷新展开的实例代码
2013/07/13 Javascript
jQuery拖动div、移动div、弹出层实现原理及示例
2014/04/08 Javascript
js prototype和__proto__的关系是什么
2019/08/23 Javascript
Vue 实现显示/隐藏层的思路(加全局点击事件)
2019/12/31 Javascript
详解vue-flickity的fullScreen功能实现
2020/04/07 Javascript
OpenLayers3实现测量功能
2020/09/25 Javascript
在HTML中使用JavaScript的两种方法
2020/12/24 Javascript
[03:11]TI9战队档案 - Alliance
2019/08/20 DOTA
python笔记(1) 关于我们应不应该继续学习python
2012/10/24 Python
Python数据库的连接实现方法与注意事项
2016/02/27 Python
Python实现读取json文件到excel表
2017/11/18 Python
Python爬虫实现爬取京东手机页面的图片(实例代码)
2017/11/30 Python
基于Django的ModelForm组件(详解)
2017/12/07 Python
Python实现的朴素贝叶斯算法经典示例【测试可用】
2018/06/13 Python
Python 生成 -1~1 之间的随机数矩阵方法
2018/08/04 Python
Python面向对象之继承和组合用法实例分析
2018/08/27 Python
Python3爬虫学习之将爬取的信息保存到本地的方法详解
2018/12/12 Python
python 实现dict转json并保存文件
2019/12/05 Python
Python调用.NET库的方法步骤
2019/12/27 Python
python os模块在系统管理中的应用
2020/06/22 Python
CSS3+JavaScript实现炫酷呼吸效果的示例代码
2020/06/15 HTML / CSS
文明班级申报材料
2014/12/24 职场文书
安全员岗位职责
2015/02/10 职场文书
给下属加薪申请报告
2015/05/15 职场文书
党性教育心得体会(共6篇)
2016/01/21 职场文书
MySQL 原理与优化之原数据锁的应用
2022/08/14 MySQL