`
sealbird
  • 浏览: 584736 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

转 jQuery源码分析-each函数

阅读更多
/*!  
* jQuery源码分析-each函数 
* jQuery版本:1.4.2 

* ---------------------------------------------------------- 
* 函数介绍 

* each函数通过jQuery.extend函数附加到jQuery对象中: 
* jQuery.extend({ 
*     each: function() {} 
* }); 
* 如果对jQuery.extend函数源码还不了解,可以参考《jQuery源码分析-extend函数》一文 

* jQuery.each方法用于遍历一个数组或对象,并对当前遍历的元素进行处理 
* jQuery.each方法可以为处理函数增加附带的参数(带参数与不带参数的回调使用方法不完全一致) 

* ---------------------------------------------------------- 
* 使用说明 
* each函数根据参数的类型实现的效果不完全一致: 
* 1、遍历对象(有附加参数) 
* $.each(Object, function(p1, p2) { 
*     this;      //这里的this指向每次遍历中Object的当前属性值 
*     p1; p2;    //访问附加参数 
* }, ['参数1', '参数2']); 

* 2、遍历数组(有附件参数) 
* $.each(Array, function(p1, p2){ 
*     this;      //这里的this指向每次遍历中Array的当前元素 
*     p1; p2;    //访问附加参数 
* }, ['参数1', '参数2']); 

* 3、遍历对象(没有附加参数) 
* $.each(Object, function(name, value) { 
*     this;     //this指向当前属性的值 
*     name;     //name表示Object当前属性的名称 
*     value;    //value表示Object当前属性的值 
* }); 

* 4、遍历数组(没有附加参数) 
* $.each(Array, function(i, value) { 
*     this;     //this指向当前元素 
*     i;        //i表示Array当前下标 
*     value;    //value表示Array当前元素 
* }); 
* ---------------------------------------------------------- 

*/ 
//jQuery.each(), $.each()  
//@param {Object}|{Array} object 需要遍历处理的对象或数组  
//@param {Function} callback 遍历处理回调函数  
//@param {Array} args callback回调函数的附加参数  
each: function(object, callback, args){   
  
    //当需要遍历的是一个对象时,name变量用于记录对象的属性名   
    var name,       
       
    //当需要遍历的是一个数组时,i变量用于记录循环的数组下标   
    i = 0,       
       
    //遍历数组长度,当需要遍历的对象是一个数组时存储数组长度   
    //如果需要遍历的是一个对象,则length === undefined   
    length = object.length,       
       
    //检查第1个参数object是否是一个对象   
    //根据object.length排除数组类型,根据isFunction排除函数类型(因为函数也是对象)   
    isObj = length === undefined || jQuery.isFunction(object);   
       
    //回调函数具有附加参数时,执行第一个分支   
    //if(!!args) {   
    if (args) {   
           
        //需要遍历的是一个对象   
        if (isObj) {   
               
            //遍历对象属性,name是对象的属性名,再函数顶部已声明   
            //许多人不太习惯for(var name in object)方式,如果不进行声明,则name就会被定义为全局变量   
            for (name in object) {   
               
                //调用callback回调函数,且回调函数的作用域表示为当前属性的值   
                //如:callback() {  this; //函数中的this指向当前属性值   
                //将each的第3个参数args作为回调函数的附加参数   
                if (callback.apply(object[name], args) === false) {   
                   
                    //如果在callback回调函数中使用return false;则不执行下一次循环   
                    break;   
                }   
            }   
        }   
        //需要遍历的是一个数组   
        else {   
           
            //循环长度,循环变量i在函数顶部已定义   
            //循环变量的自增在循环内部执行   
            for (; i < length;) {   
               
                //调用callback函数,与上面注释的callback调用一致   
                //此处callback函数中的this指向当前数组元素   
                if (callback.apply(object[i++], args) === false) {   
                    break;   
                }   
            }   
        }   
           
    }   
    //回调函数没有附加参数时,执行第二个分支   
    else {   
       
        //需要遍历的是一个对象   
        if (isObj) {   
           
            //循环对象的属性名,name在函数顶部已定义   
            for (name in object) {   
               
                //调用callback回调函数   
                //在不带参数的对象遍历中,作用域表示为当前属性的值   
                //且回调函数包含两个参数,第一个数当前属性名,第二个是当前属性值   
                //我觉得这句代码修改一下会更好用:if(callback.call(object, name, object[name]) === false) {   
                if (callback.call(object[name], name, object[name]) === false) {   
                   
                    //如果在callback回调函数中使用return false;则不执行下一次循环   
                    break;   
                }   
            }   
        }   
        //需要遍历的是一个数组   
        else {   
            //这里的for写法有点BT,解释为:   
            //var value = object[0];   
            //for(; i < length;) {   
            //    if(false === callback.call(value, i, value)) {   
            //        break;   
            //    }   
            //    value = object[++i];   
            //}   
            //同样,我觉得这里的代码稍加修改会更好用:   
            //for (; i < length && false !== callback.call(object, i, object[i++]);) {   
            //}   
            for (var value = object[0]; i < length && callback.call(value, i, value) !== false; value = object[++i]) {   
            }   
        }   
    }   
       
    //这里返回遍历的对象或数组,但object没有被更改,因此一般不给$.each()赋值   
    //但是如果按照我在注释中所修改的写法来使用,且在callback回调函数中对this(即对object的引用)进行了修改   
    //则这里返回的object是被修改后的对象或数组   
    return object;   
} 

================================
注意:
$.each()本文与如下模型的区别
$().each(function(){})
================================
本文字例子
例遍数组,同时使用元素索引和内容。

jQuery 代码:

$.each( [0,1,2], function(i, n){
  alert( "Item #" + i + ": " + n );
});

例遍对象,同时使用成员名称和变量内容。

jQuery 代码:

$.each( { name: "John", lang: "JS" }, function(i, n){
  alert( "Name: " + i + ", Value: " + n );
});

$().each(function(){})例子

迭代两个图像,并设置它们的 src 属性。注意:此处 this 指代的是 DOM 对象而非 jQuery 对象。

HTML 代码:

<img/><img/>
jQuery 代码:

$("img").each(function(i){
   this.src = "test" + i + ".jpg";
 }); 

结果:

[ <img src="test0.jpg" />, <img src="test1.jpg" /> ]
--------------------------------------------------------------------------------

如果你想得到 jQuery对象,可以使用 $(this) 函数。

jQuery 代码:
$("img").each(function(){
  $(this).toggleClass("example");
}); 

--------------------------------------------------------------------------------

你可以使用 'return' 来提前跳出 each() 循环。

HTML 代码:

<button>Change colors</button>
<span></span>
<div></div>
<div></div>

<div></div>
<div></div>
<div id="stop">Stop here</div>
<div></div>

<div></div>
<div></div>

jQuery 代码:

$("button").click(function () { 
	$("div").each(function (index, domEle) { 
	  // domEle == this 
	  $(domEle).css("backgroundColor", "yellow");  
	  if ($(this).is("#stop")) { 
		  $("span").text("Stopped at div index #" + index); 
		  return false; 
	  } 
	});
});
分享到:
评论

相关推荐

    139.jQuery源码分析-魔术方法.rar

    《jQuery源码分析——魔术方法》 jQuery,作为一款广泛使用的JavaScript库,以其简洁的API和强大的功能赢得了开发者们的喜爱。在深入理解jQuery的工作原理时,我们常常会遇到一些“魔术方法”,这些方法在特定场景...

    Jquery源码分析 源码

    《jQuery源码分析》 jQuery,作为一款广泛使用的JavaScript库,极大地简化了DOM操作、事件处理、动画制作以及Ajax交互。深入理解其源码对于提升JavaScript编程技能和优化前端性能至关重要。本文将从核心概念、设计...

    jQuery源码分析(1.7)

    ### jQuery源码分析关键知识点详解 #### 一、前言 在深入了解jQuery源码之前,有必要先简要介绍一下jQuery的基本情况及其对JavaScript编程领域的重要意义。jQuery作为一个轻量级、功能丰富的JavaScript库,在Web...

    jQuery each函数源码分析_.docx

    《jQuery each函数源码分析》 jQuery库中的`each`函数是其核心功能之一,它提供了遍历数组和对象的能力,使得开发者能够方便地对集合中的每个元素进行操作。在这个文档中,我们将深入探讨`each`函数的源码,了解其...

    jquery 源码分析

    ### jQuery源码分析 #### 一、概述 jQuery作为一个卓越的JavaScript库,以其简洁高效的特性在前端开发领域占据了一席之地。与Prototype、YUI、Mootools等其他JavaScript库相比,jQuery更加注重实用性,去除了一些...

    jQuery源码详细分析中文注释

    这份中文注释的源码分析旨在帮助开发者逐步揭开jQuery的神秘面纱,提升JavaScript编程技能。 首先,jQuery的核心在于选择器引擎Sizzle。Sizzle是一个高效的选择器解析器,能够处理CSS1至CSS3的选择器,包括ID、类、...

    jQuery-Source-code-analysis-.rar_code

    《jQuery源码分析》 jQuery,作为一款广泛应用于前端开发的JavaScript库,以其简洁的API、高效的DOM操作和丰富的插件系统,极大地提升了开发者的工作效率。深入理解jQuery的源码,不仅能帮助我们更好地运用它,还能...

    Jquery-source-code.zip_code

    《jQuery源码解析:深入理解JavaScript库之精髓》 jQuery,作为一款广泛应用于Web开发的JavaScript库,以其简洁、易用的API深受开发者喜爱。它极大地简化了DOM操作、事件处理、动画效果以及Ajax交互等任务,使得...

    jQuery源码分析系列_1.6

    ### jQuery源码分析系列_1.6 #### 一、前言 在现代Web开发领域,jQuery无疑是一款具有里程碑意义的JavaScript库。它通过简洁、强大的API极大地简化了DOM操作、事件处理、Ajax交互以及动画等功能,使得前端开发变得...

    jQuery each函数源码分析

    在jQuery 1.4.2的源码中,`each`函数接收三个参数:需要遍历的对象或数组(`object`),处理回调函数(`callback`)以及可选的回调函数附加参数(`args`)。`each`函数会根据`object`的类型(数组或对象)来决定如何...

    jQuery 1.9.1源码分析系列(十四)之常用jQuery工具

    在详细分析jQuery 1.9.1源码系列的文章中,我们集中于探讨了jQuery库中常用工具函数的实现原理及其应用。这些工具函数广泛用于动画处理、事件处理、数据操作和性能优化等场景。本篇文章详细解释了多个核心工具函数的...

    jQuery插件-jRating评分插件源码分析及使用方法

    源码分析方面,jRating插件遵循jQuery插件的最佳实践,使用闭包避免 `$` 符号冲突。插件的核心逻辑在`$.fn.jRating`函数内,它接受一个配置对象`op`,然后将配置对象与默认参数`defaults`合并,创建个性化的插件实例...

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

    这两个函数在jQuery源码中有着不同的实现方式,但都提供了中断循环的能力。 首先,我们来看`jQuery.fn.each`,这个函数通常用于遍历jQuery对象中的DOM元素。在提供的示例中,`$('div').each(function(index, elem){...

    jquery源码好不容易找到的与大家分享

    二、jQuery源码结构分析 1. **模块化设计**:jQuery源码采用模块化设计,分为多个部分,如`selector.js`(选择器引擎)、`core.js`(核心功能)、`traversing.js`(遍历DOM)等,这有利于代码的组织和维护。 2. **...

    Jquery1.2.6源码分析

    《jQuery 1.2.6源码分析》 在JavaScript的世界里,jQuery是一个不可或缺的库,它极大地简化了DOM操作、事件处理、动画效果以及Ajax交互。本文将深入剖析jQuery 1.2.6版本的源码,揭示其背后的机制与设计理念,帮助...

    从JQuery源码分析JavaScript函数的apply方法与call方法

    JQuery源码分析与JavaScript中的apply与call方法是JavaScript编程中非常重要的概念,这两者都是函数对象的方法,用于在特定的作用域中执行函数,并可以指定函数体内this的指向。从JQuery源码中分析apply和call方法,...

    jQuery源码

    2. **遍历**:jQuery对象可以进行遍历,例如`$.each()`函数允许我们对每个匹配的元素执行函数,`$("div").each(function() {...})`会针对每个div元素执行内部的回调函数。 3. **DOM操作**:jQuery提供了简便的方法...

    Jquery-1.9.1源码分析系列(十一)之DOM操作

    DOM操作包括append、prepend、before、after、replaceWith、appendTo、prependTo、...jQuery.each({ appendTo: append, prependTo: prepend, insertBefore: before, insertAfter: after, replaceAll: replaceWith

Global site tag (gtag.js) - Google Analytics