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

JQuery源代码阅读(一):构造jQuery对象

阅读更多

JQuery是当前最流行的JavaScript库,出于好奇,我研究了jQuery的源代码,我使用的版本是1.3.2。在接下来的几篇文章里,我将对jQuery实现作详尽的详解。

 

使用jQuery的第一步就是构建jQuery对象,所以让我们先来看jQuery对象的构造函数。

 

 

 

构造函数在第24行, 它被同时赋给window.jQuery和window.$,因此jQuery和$两者等价,构造函数直接调用jQuery.fn.init方法。 init方法根据参数类型接受几种不同形式的方法调用,在第41行根据selector是否有nodeType属性来判断selector是否是 DOMElement,如果是则将该JQuery对象设置为只包含一个元素,也就是selector,另外将上下文对象(context)也设置为 selector。 在该对象48行,如果selector是一个字符串,则会根据selector是HTML字符串(如"<p>some content</p>")还是CSS选择器(如"div#myClass")来执行不同的逻辑,这在后面会详述。在82行,如果 selector是一个函数,调用jQuery(document).ready(selector),表示在document的DOM树加载完成之后执 行该函数。在86到88行作用是当selector也是一个JQuery对象时,将该JQuery对象的selector和context属性也复制过 来。在91行处,selector一般是一个包含多个DOMElement的数组,如果不是则构造一个大小为1的数组,其唯一元素为该 selector(makeArray实现),然后将selector数组的内容复制到jQuery对象中,这样jQuery表现得像数组,它有 length属性,可以通过[0]...[length-1]来访问各个元素的内容,这个功能由setArray完成。setArray的实现很巧妙,它 调用Array.prototype.push方法:


 


jQuery对象并不复杂,它包含三个属性:包含的DomElement数组,selector属性和context属性。将DomElement数组称 为一个属性并不恰当,因为jQuery对象实际上包含length属性,以及名称0, 1, ..., length-1的属性。selector属性是一个CSS选择器,它是一个字符串,只有当调用jQuery构造函数时,selector参数为一个 CSS选择器时,它的值才会被设置,否则就是空字符串("")。context属性则为jQuery对象的上下文对象,我的理解也可以称做“根对象”,当 jQuery根据CSS选择器来选择匹配DOMElement时,只会搜索以context元素为根的DOM树。当构造HTML字符串构造jQuery对 象时没有context忏悔。复杂的地方不在jQuery对象本身,而在于selector为字符串是它的构造过程,尤其是当selector为CSS选 择器的时候。现在来看看上面被折叠的代码(48行到82行之间的代码):

 

 

在53行if判断:selector是HTML字符串(match[1]不为空)或者ID(match[3]不为空)时,或者没有指定 context对象。接下来在56行,如果selector是HTML字符串,则调用clean方法将HTML字符串转化成DOMElement。 clean方法实现比较复杂(这里就不列出源代码了),主要是因为要处理各种浏览器的兼容问题,但总体步骤也简单。首先它判断HTML是否为简单的单个元 素(如<p>, <div/>等,有没有/并不重要),则直接调用document.createElement来创建该元素。否则,则调用 document.createElement("DIV")来创建一个div元素,然后设置它的innerHTML为该HTML字符串,最后调用div 元素的childNodes来得到DomElement数组。第60行处理selector为ID选择器的情形(#someID),主要是为了优化,因为这种情形出现得最多,61行到66的复杂之处是要处理IE的兼容问题,69到72行创建jQuery对象,并设置context,seletor属性。第 77行处理selector为CSS选择器的情形,调用jQuery的find的方法,这是jQuery最复杂的部分,留到下次再说。

分享到:
评论

相关推荐

    jQuery源代码

    《jQuery源代码解析》 jQuery,作为一款广泛应用于前端开发的JavaScript库,以其简洁的API、强大的功能和良好的浏览器兼容性赢得了开发者们的喜爱。本文将深入探讨jQuery的源代码,帮助我们理解其内部机制,提升...

    Jquery 源代码分析

    1. **$()构造函数**:这是jQuery最常使用的函数,它接受CSS选择器作为参数,返回一个包含匹配元素的jQuery对象。源代码中,$()内部调用了_silent()和init()方法,进行元素的选择和初始化工作。 2. **$.fn.extend()...

    锋利的jQuery源代码

    《锋利的jQuery源代码》是一个完整的项目,旨在帮助学习者深入理解并掌握jQuery的核心原理与实际应用。jQuery是一款广泛使用的JavaScript库,它简化了HTML文档遍历、事件处理、动画制作以及Ajax交互等任务,极大地...

    jquery源代码

    《jQuery源代码详解》 jQuery,作为一款广泛应用于Web开发的JavaScript库,以其简洁的API、强大的功能和良好...通过阅读和分析“锋利的jQuery源代码”,我们可以深入了解JavaScript库的设计理念,提升自己的编程能力。

    《精通Javascript+jquery》(源代码)

    通过阅读《精通JavaScript+jQuery》这本书并实践书中的源代码,开发者可以深入理解这两种技术,并在实际项目中有效地运用它们,提高网页交互性和用户体验。同时,对这些知识点的熟练掌握也是成为一名优秀前端工程师...

    jQuery-source-code:jQuery源码学习

    jQuery源代码 本文主要以为学习参考书籍,为保证与书籍内容同步,以jQuery 1.7.2为学习版本进行。 本次学习主要使用“笨鸟多飞”的方式对相关例程代码进行逐行注释理解。 补充说明 多数情况下,内容不参考ES6新特性...

    jquery开发入门整理(所需要了解的)

    jQuery框架的核心是`$`符号,这是一个全局函数,用于构造jQuery对象。jQuery对象实质上是对原生DOM对象的一种封装,它提供了一套统一的接口来操作DOM元素,使得跨浏览器编程变得更加简单。 #### 构造对象 - 通过...

    JQuerySourceCode:jQuery源代码-jquery source code

    **jQuery源代码详解** jQuery,一个轻量级、高性能的JavaScript库,自2006年发布以来,因其简洁易用的API而深受开发者喜爱,成为Web开发中的必备工具之一。它极大地简化了HTML文档遍历、事件处理、动画以及Ajax交互...

    jQuery技术内幕 深入解析jQuery架构设计与实现原理

    进而通过“构造jquery对象”章节分析了构造函数jquery()的各种用法和内部构造过程;接着详细分析了底层支持模块的源码实现,包括:选择器sizzle、异步队列deferred、数据缓存data、队列queue、浏览器功能测试support...

    jQuery.js执行过程分析

    这使得开发人员可以在不修改源代码的情况下,为jQuery添加自定义功能或覆盖现有功能。 #### 三、关键组件解析 1. **`jQuery.extend`详解**: - **功能介绍**:`jQuery.extend`允许开发人员向jQuery对象或其原型...

    jQuery-Source-Code-Read:阅读jQuery源代码-jquery source code

    总之,jQuery源代码是JavaScript开发者宝贵的参考资料,它展示了如何优雅地处理DOM、事件、动画和Ajax。通过深入学习,我们不仅可以提升编程技巧,还能借鉴其设计理念,为自己的项目带来更高的质量和效率。

    jquery--:jquery源代码

    jQuery的入口函数`$`实际上是一个构造函数,用于创建jQuery对象。当你传入一个CSS选择器字符串,如`$('div')`,jQuery会利用`document.querySelectorAll`或`document.getElementById`等方法找到匹配的元素,并返回一...

    JavaScript和jQuery实战手册源码--the missing manual

    7. **面向对象编程**:介绍如何用jQuery实现面向对象的设计模式,如构造函数和原型链。 8. **错误处理和调试**:通过`.error()`, `console.log()`等来处理错误和调试代码。 9. **性能优化**:示例可能包括如何减少...

    52680JavaScript+jQuery交互式Web前端开发-源代码

    《52680JavaScript+jQuery交互式Web前端开发》是一个深入探讨JavaScript和jQuery在创建动态、交互式网页方面的教程。这个课程旨在帮助开发者掌握这两种技术的核心概念,并将其应用于实际项目中,提升Web前端的用户...

    精通JAVAScript+jQuery书中实例

    在这些"书中实例"中,读者可以找到每个章节对应的源代码、素材和完成后的成果,这为学习和理解提供了直观的参考。以下是一些关键的知识点: 1. **JavaScript基础**:包括变量声明、数据类型(如字符串、数字、布尔...

    jQuery_的原型关系图

    在jQuery中,核心的`$`函数实际上是一个构造函数,用于创建jQuery对象。`jQuery`是`$`的别名,它们的原型(`$.prototype`或`jQuery.prototype`)定义了一系列的方法,如`click()`, `append()`, `fadeIn()`等,这些都...

    JavaScript源代码集

    2. **jQuery库**:一种流行的JavaScript库,简化DOM操作、事件处理和动画效果。 3. **DOM操作**:如何动态创建、修改和删除HTML元素,实现页面动态效果。 4. **前端框架应用**:如React、Vue或Angular的代码示例,...

    jquery 基础教程 pdf

    - **模块化**: 脚本与HTML源代码分离,方便维护。 - **丰富的插件**: 提供多种插件,如表单验证、Tab导航、拖放效果等。 **1.3 使用场景** - **适用人群**: 设计师、开发者、Web编程爱好者。 - **适用领域**: ...

    javascript源代码大全

    JavaScript,一种广泛应用于Web开发的脚本语言,是前端开发的核心技术之...通过阅读和研究"javascript源代码大全",开发者不仅可以深入理解JavaScript的基本原理,还能掌握实际开发中的最佳实践,提升自己的编程技能。

    jQuery源码+中文详细注解

    文档中的第71行至73行提到,在当前作用域内(即这个自运行的匿名函数所形成的闭包内)、全局作用域内的`jQuery`和`$`都是指向下面这个函数的引用,而这个函数实际上调用了`jQuery.fn.init`来构造一个jQuery对象。...

Global site tag (gtag.js) - Google Analytics