`
liuwei_blog
  • 浏览: 94351 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

jQuery源码分析 (init)

阅读更多

Jquery 源码分析

                        prk 2008-08-12

1 、概述                      

   jQuery 是一个非常优秀的 Js 库,与 prototype,YUI,Mootools 等众多的 Js 类库相比,它剑走偏锋,从 web 开发最实用的角度出发,抛除了一些中看但不实用的东西,为开发者提供一个短小精悍的类库。由于其个短小精悍,使用简单方便,性能相对高效。众多的开发者都选择 Jquery 来进行辅助的 web 开发。

在使用 jquery 时开发,我们也会时常碰到许多的问题 , 但是 jquery 的代码很晦涩,难起看懂,当开发时出现了问题,看不懂源码,不知道如何去排错。

John Resig Jquery 的开发者,写了两本书, Pro Javascript Techniques 可以看作是对 Jquery 的源码分析。这个对于分析源码,从基本上去比较目前的类库都有很大的帮助。另外一本是 jQuery.in.Action 。这本主要是讲怎么去使用 Jquery 。二本书都深入浅出。还有一个由本手册由 一揪 整理编辑 JqueryAPI 的中文文档。这三个对于精通 Jquery 是有很大帮助的。

 

2 init() 分析

在分析 init() 之前,我们得明白 jQuery 的设计理念。

Jquery 是站在开发者的角度去考虑问题,在使用 Js 的时候,大部分时间都是对 Dom 元素进行操作,比如修改元素的属性,修改内容,修改 CSS 等。但是取 Dom 元素的,如 getElementsByTag ,有可能会取到一些 Dom 元素的集合,而又正好要这个集合的所有的元素都要进行同样的操作。如果只有一个元素,完全可以看作只有一个元素的集合。

这样只要对这个集合进行操作,就会对集合的每个元素都进行操作。 jQuery 就是基于这个集合而提供了众多的实用方法,包含了日常开发所需要的功能。对于这个集合,我们称为 jquery 对象。

我们可以通过 $(params) jquery(params) 来生成 Jquery 对象。在 Jquery 文档中提供了四种方式: jQuery(expression,[context]) jQuery(html) jQuery(elements) jQuery(callback) 四种构寻 jquery 对象的方式。其实 Jquery 的参数可以是任何的元素,如空参数,都能构成 jquery 对象。

那么 jquery 是如何实现的呢?

①②③④⑤⑥⑦⑧⑨⑩

var jQuery = window.jQuery = window.$ = function (selector, context) {

    // The jQuery object is actually just the init constructor 'enhanced'

    return new jQuery.fn.init(selector, context);                        

};

可以看得出其实就是 new init(selector, context):

init : function (selector, context) {

       selector = selector || document; // 确定 selector 存在

       // 第一种情况 Handle $(DOMElement) 单个 Dom 元素,忽略上下文

       if (selector.nodeType) {                                            

           this [0] = selector;

           this .length = 1;

           return this ;

       }     

       if ( typeof selector == "string" ) { //selector string          

           var match = quickExpr.exec(selector);        

           if (match && (match[1] || !context)) {

              if (match[1]) // 第二种情况处理 $(html) -> $(array)        

                  selector = jQuery.clean([match[1]], context);

              else { // 第三种情况: HANDLE: $("#id")// 处理 $("#id")

                  var elem = document.getElementById(match[3]);

                  if (elem) {                    

// IE 会返回 name=id 的元素 ,如果是这样,就 document.find(s)

if (elem.id != match[3])                       

                         return jQuery().find(selector);

                        // 构建一个新的 jQuery(elem)

                     return jQuery(elem);                           

                  }

                  selector = [];

              }

           } else                                                      

           // 第四种情况:处理 $(expr, [context])==$(content).find(expr)

              return jQuery(context).find(selector);              

       } else if (jQuery.isFunction(selector))                          // 第五种情况:处理 $(function) Shortcut for document ready       

return jQuery(document)[jQuery.fn.ready ? "ready" : "load" ](selector);

// 第六种情况:处理 $(elements)

return this .setArray(jQuery.makeArray(selector));                  

    },

 

上面的代码 ①可以看出$(xx)Jquery(xx) 得到不是真正的jQuery 函数生成的对象,而是jQuery.fn.init 函数生成的对象。也是就是jQuery 的对象继承的是jQuery.fn.init 的原型。jQuery.fn = jQuery.prototype={..} 。我们基本上不用new jQuery(xx) ,而是直接jQuery(xx), 就是采用了new jQuery(xx) ,先生成jQuery 函数的对象,把原型中的继承下来,返回的也是jQuery.fn.init 函数生成的对象。而jQuery 函数的对象也抛弃了。可见给jQuery.prototype 上增加方法的意义不大。同时也可以看出采用new jQuery(xx) 的效率更低。jQuery.fn.init 是通过jQuery.fn.init.prototype = jQuery.fn; 来获得的。在扩展jQuery 的时候,只要把相关的函数extendjQuery.fn 就可以了。

jQuery.fn.init 负责对传的参数进行分析然后生成 jQuery 对象。它把第一个参数分成四种情况:

 

 

类型

说明

Dom Element

 

第一个参数为Dom 元素,第二个参数不用。直接把Dom 元素存在新生成的jQuery 对象的集合中。返回这个jQuery 对象。构建jQuery 对象完成。

 

string

 

第一个参数为string 有三种情况:

  1 html 的标签字符串,$(html) -> $(array) ,第二个参数可选。

      执行selector = jQuery.clean([match[1]], context); 。该语句是把hteml 的字符串转换成dom 对象的数组。接着执行Array 类型的返回。

2 、字符串为#id$(id)

   首先通过var elem = document.getElementById(match[3]); 取得elem ,如没有取到selector = []; 转到执行Array 类型的返回空集合jquery 对象。

  如找到elem, 通过return jQuery(elem); 再次生成jquery 对象,这次是

Dom Element 类型的jquery 对象的返回。

3 、兼容css1-3 语法的selector 字符串,第二个参数是可选的。

       执行return jQuery(context).find(selector); 。该语句先执行jQuery(context) 。可以看出context 第二参数可以是任意的值,可以是集合形式。之后就通过find(selector) 找到jQuery(context) 中所有dom 元素都满足selector 表达式的dom 元素的集合,构建新的jquery 对象,并返回。

     #id 其实和这种方式是统一的,单独出来是为了提高性能。

 

 

Fn

 

 

第一参数是函数。第二个参数不用。是 $(document).ready(fn) 的的简写,其 return jQuery(document)[jQuery.fn.ready ? "ready" : "load"](selector) 是其执行的代码。这个语句首先执行jQuery(document) ,它再一次newjQuery.fn.init 函数, 生成jQuery 对象(元素为document )。再调用这个对象的 ready(fn) 方法。 Ready(fn) 返回当前对象。而上面的语句又是返回这个 Ready(fn) 的返回对象。

可见这个 $(fn) 返回是 $(document)

分享到:
评论

相关推荐

    jQuery源码分析之init的详细介绍

    接着,源码分析揭示了 init 函数的实现逻辑。函数首先检查是否有 selector 参数传入,如果没有,那么就返回 this,即一个空的 jQuery 对象。如果 selector 是字符串,则根据字符串的类型和内容,进行不同处理。对于 ...

    jQuery源码分析-03构造jQuery对象

    ### jQuery源码分析—构造jQuery对象 #### 一、源码结构概览 根据所提供的文件内容,本节将深入分析如何构建jQuery对象及其核心构造逻辑。首先,让我们从整体上理解jQuery构造函数的设计思路。 ##### 总体结构 ...

    myjquery:jquery源码分析

    jQuery源码分析 前言 有时候我在想jQuery为什么可以直接$操作,可以拥有比原生js更便利的DOM操作,而且只要你想就可以直接链式操作下去 核心框架 揭开一万多行代码的jQuery核心代码: (function(window, undefined)...

    jQuery源码+中文详细注解

    ### jQuery源码+中文详细注解 #### 一、引言 本文档是对jQuery源码进行中文注解的详细介绍,旨在帮助广大前端开发者更深入地理解jQuery的核心逻辑和技术要点。通过对核心部分的逐行注解,可以更好地掌握jQuery的...

    jQuery源码分析系列_1.6

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

    jquery1.43源码分析(核心部分)[收集].pdf

    《jQuery 1.4.3 源码分析——核心部分》 jQuery 是一个广泛使用的JavaScript库,它极大地简化了JavaScript的DOM操作、事件处理、动画制作和Ajax交互。在jQuery 1.4.3版本中,其核心部分主要包括选择器引擎、DOM操作...

    jquery源码 带格式

    通过以上对jQuery源码的部分分析,我们可以看出jQuery在设计上考虑了兼容性、性能以及安全性,采用了大量的正则表达式进行字符串和DOM元素的处理,并提供了丰富的工具函数和API来简化JavaScript的编程工作。

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

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

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

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

    jquery1.2.6源码分析

    《jQuery 1.2.6 源码分析——揭示JavaScript库的秘密》 jQuery,作为JavaScript最著名的库之一,自2006年发布以来,以其简洁易用的API和强大的功能深受开发者喜爱。本文将深入探讨jQuery 1.2.6版本的源码,帮助我们...

    jquery源码简单分析

    在本文中,我们将通过对jQuery源码的核心部分进行分析,深入理解其工作原理和设计模式。 首先,jQuery 是一个函数,通常用 `$` 符号表示。当你调用这个函数,例如 `$(‘name_input’).val()`,它会执行函数内的逻辑...

    jquery1.43源码分析(核心部分)

    ### jQuery 1.4.3 源码分析(核心部分) #### 一、引言 随着 Web 技术的不断发展,JavaScript 成为了前端开发中不可或缺的一部分。而在众多 JavaScript 库中,jQuery 几乎成为了网页开发的标准工具之一。本文将...

    jQuery 2.0.3 源码分析之core(一)整体架构

    总结来说,jQuery的源码分析给我们提供了深入理解库内部工作原理的机会,并能够借鉴其在设计和实现上的技巧。通过无new构造模式、工厂方法模式、作用域隔离、AMD规范支持等设计思想,jQuery成为了一个强大、灵活且...

    通过jQuery源码学习javascript(二)

    "1.8.3", init: function() { return this; }, test: function() { console.log('test');...同时,这也展示了JavaScript中`this`的灵活用法和原型继承的概念,这些都是深入理解JavaScript和jQuery源码的关键。

    Jquery 源码解读

    ### Jquery 源码解读 #### 一、概述 jQuery 是一款优秀的 JavaScript 库,以其简洁、高效著称,极大地简化了 HTML 文档遍历、事件处理、动画以及 Ajax 交互等操作。本文旨在深入解析 jQuery 的核心部分,帮助读者...

    jQuery源码解析

    总结来说,jQuery源码解析系列将带领我们逐步揭开这个前端库的神秘面纱,从整体结构、接口设计到具体实现,深入理解其设计思想和实现细节。无论是对于提高开发效率,还是对于个人技能提升,都有极大的帮助。通过学习...

    jQuery源码分析-03构造jQuery对象-源码结构和核心函数

    在进行jQuery源码分析的过程中,我们了解到jQuery对象是通过内部函数`jQuery.fn.init`构造的,其方法和属性则通过原型链继承自`jQuery.fn`,这是jQuery能够提供丰富且灵活DOM操作方法的基石。通过这种方式,即使不...

    jQuery 源码分析笔记

    《jQuery 源码分析笔记》 jQuery 是一个广泛使用的JavaScript库,它的最新版本1.6.1在2011年5月12日发布,包含8937行未压缩的代码,体积约为229KB。该库的核心设计理念是“Write Less, Do More”,旨在通过简洁的...

    Jqurey 源码分析

    【jQuery 源码分析】 jQuery 是一个广泛使用的 JavaScript 库,它的源码设计和实现包含了许多巧妙的技巧和最佳实践。源码分析对于理解其内部工作原理和提高JavaScript编程能力至关重要。 首先,jQuery 源码以一个...

Global site tag (gtag.js) - Google Analytics