- 浏览: 94351 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
assasszt:
写的很透彻,厉害!能不能问个 问题:cookie 应该是浏览器 ...
Tomcat之Session和Cookie大揭密 -
赵武艺:
有时间把全部代码贴出来看看,只看这个看不懂?
Ajax请求,利用JFreeChart,页面无刷新画带“map”的图 -
e_soft:
解决办法:
拔了网线就好了,具体什么原因正在查找.
我也在 ...
MyEclipse开发JSP页面假死问题解决办法
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 的时候,只要把相关的函数extend 到jQuery.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) |
发表评论
-
javascript 做的俄罗斯方块
2008-12-24 04:51 787在win2003 IE6 和 火狐下无法运行 < ... -
javascript 里Array的一些方法
2008-08-06 11:25 7201. join()方法:join()方法的用途是连接字符串值, ... -
全面理解javascript的caller,callee,call,apply概念
2008-08-22 01:38 686在提到上述的概念之前,首先想说说javascript中函 ... -
遍历某个页面的Dom对象
2008-08-24 18:19 986遍历某个页面的Dom对象。例如想知道某个DOM对象是否在获得焦 ... -
javascript 中 outerHTML 、innerHTML、innerTEXT 三者的区别
2008-09-06 21:25 786在 DHTML中我们经常会用的的innerHTML、 ... -
IE,火狐 兼容的写法
2008-09-07 01:09 913测试浏览器版本:IE7 , FF3 以下方法IE ... -
获得keyCode 兼容IE, FF
2008-09-20 18:50 1220使用了Prototype.js, $('confirm ... -
JavaScript中Array(数组)的属性和方法
2008-09-26 16:06 788数组有四种定义的方式 使用构造函数: var a = ... -
复选框全部选中(取消选中)
2008-10-22 13:33 2009<!DOCTYPE HTML PUBLIC " ... -
关于使用runtimeStyle属性问题讨论文章
2008-10-26 00:54 722IE有 style、runtimeStyle和cu ... -
JavaScript 设置页面元素的 CSS
2008-10-26 01:08 755测试浏览器:IE7,FF3.0.1 objec ... -
方便的post提交
2008-11-01 16:56 723页面里有多行记录,每行记录后面对应着编辑操作,点击操作链接或按 ... -
添加onload事件
2008-11-05 02:11 852一、如下,执行顺序 IE -- > ff,f (倒序) ... -
联动的日期下拉列表,兼容IE,FF
2008-11-05 03:05 876测试浏览器:IE7,FF3 JS ... -
Ajax in Action (Ajax实战)
2008-11-05 14:44 903Ajax in Action (Ajax实战) ... -
html静态传参
2008-11-05 15:51 937方法一: <script type="tex ... -
深入浅出URL编码
2008-11-06 18:58 731版权声明:如有转载请求,请注明出处: http://blog ... -
element-api-ext
2008-11-22 01:04 1061Properties Methods ... -
ajax-api-ext
2008-11-22 01:32 1091Properties Methods ... -
escape,encodeURI,encodeURIComponent函数比较
2008-11-23 17:48 774js对文字进行编码涉及3个函数:escape,encod ...
相关推荐
接着,源码分析揭示了 init 函数的实现逻辑。函数首先检查是否有 selector 参数传入,如果没有,那么就返回 this,即一个空的 jQuery 对象。如果 selector 是字符串,则根据字符串的类型和内容,进行不同处理。对于 ...
### jQuery源码分析—构造jQuery对象 #### 一、源码结构概览 根据所提供的文件内容,本节将深入分析如何构建jQuery对象及其核心构造逻辑。首先,让我们从整体上理解jQuery构造函数的设计思路。 ##### 总体结构 ...
jQuery源码分析 前言 有时候我在想jQuery为什么可以直接$操作,可以拥有比原生js更便利的DOM操作,而且只要你想就可以直接链式操作下去 核心框架 揭开一万多行代码的jQuery核心代码: (function(window, undefined)...
### jQuery源码+中文详细注解 #### 一、引言 本文档是对jQuery源码进行中文注解的详细介绍,旨在帮助广大前端开发者更深入地理解jQuery的核心逻辑和技术要点。通过对核心部分的逐行注解,可以更好地掌握jQuery的...
### jQuery源码分析系列_1.6 #### 一、前言 在现代Web开发领域,jQuery无疑是一款具有里程碑意义的JavaScript库。它通过简洁、强大的API极大地简化了DOM操作、事件处理、Ajax交互以及动画等功能,使得前端开发变得...
《jQuery 1.4.3 源码分析——核心部分》 jQuery 是一个广泛使用的JavaScript库,它极大地简化了JavaScript的DOM操作、事件处理、动画制作和Ajax交互。在jQuery 1.4.3版本中,其核心部分主要包括选择器引擎、DOM操作...
通过以上对jQuery源码的部分分析,我们可以看出jQuery在设计上考虑了兼容性、性能以及安全性,采用了大量的正则表达式进行字符串和DOM元素的处理,并提供了丰富的工具函数和API来简化JavaScript的编程工作。
《jQuery源码分析——魔术方法》 jQuery,作为一款广泛使用的JavaScript库,以其简洁的API和强大的功能赢得了开发者们的喜爱。在深入理解jQuery的工作原理时,我们常常会遇到一些“魔术方法”,这些方法在特定场景...
二、jQuery源码结构分析 1. **模块化设计**:jQuery源码采用模块化设计,分为多个部分,如`selector.js`(选择器引擎)、`core.js`(核心功能)、`traversing.js`(遍历DOM)等,这有利于代码的组织和维护。 2. **...
《jQuery 1.2.6 源码分析——揭示JavaScript库的秘密》 jQuery,作为JavaScript最著名的库之一,自2006年发布以来,以其简洁易用的API和强大的功能深受开发者喜爱。本文将深入探讨jQuery 1.2.6版本的源码,帮助我们...
在本文中,我们将通过对jQuery源码的核心部分进行分析,深入理解其工作原理和设计模式。 首先,jQuery 是一个函数,通常用 `$` 符号表示。当你调用这个函数,例如 `$(‘name_input’).val()`,它会执行函数内的逻辑...
### jQuery 1.4.3 源码分析(核心部分) #### 一、引言 随着 Web 技术的不断发展,JavaScript 成为了前端开发中不可或缺的一部分。而在众多 JavaScript 库中,jQuery 几乎成为了网页开发的标准工具之一。本文将...
总结来说,jQuery的源码分析给我们提供了深入理解库内部工作原理的机会,并能够借鉴其在设计和实现上的技巧。通过无new构造模式、工厂方法模式、作用域隔离、AMD规范支持等设计思想,jQuery成为了一个强大、灵活且...
"1.8.3", init: function() { return this; }, test: function() { console.log('test');...同时,这也展示了JavaScript中`this`的灵活用法和原型继承的概念,这些都是深入理解JavaScript和jQuery源码的关键。
### Jquery 源码解读 #### 一、概述 jQuery 是一款优秀的 JavaScript 库,以其简洁、高效著称,极大地简化了 HTML 文档遍历、事件处理、动画以及 Ajax 交互等操作。本文旨在深入解析 jQuery 的核心部分,帮助读者...
总结来说,jQuery源码解析系列将带领我们逐步揭开这个前端库的神秘面纱,从整体结构、接口设计到具体实现,深入理解其设计思想和实现细节。无论是对于提高开发效率,还是对于个人技能提升,都有极大的帮助。通过学习...
在进行jQuery源码分析的过程中,我们了解到jQuery对象是通过内部函数`jQuery.fn.init`构造的,其方法和属性则通过原型链继承自`jQuery.fn`,这是jQuery能够提供丰富且灵活DOM操作方法的基石。通过这种方式,即使不...
《jQuery 源码分析笔记》 jQuery 是一个广泛使用的JavaScript库,它的最新版本1.6.1在2011年5月12日发布,包含8937行未压缩的代码,体积约为229KB。该库的核心设计理念是“Write Less, Do More”,旨在通过简洁的...
【jQuery 源码分析】 jQuery 是一个广泛使用的 JavaScript 库,它的源码设计和实现包含了许多巧妙的技巧和最佳实践。源码分析对于理解其内部工作原理和提高JavaScript编程能力至关重要。 首先,jQuery 源码以一个...