- 浏览: 516608 次
- 性别:
- 来自: 北京
博客专栏
-
jQuery技术内幕
浏览量:198703
最新评论
-
青春依旧:
学习html5哪里好?当然华清远见是首选!
[原创] jQuery源码分析-01总体架构 -
追梦1819:
[size=x-small][color=red][/colo ...
[原创] jQuery源码分析-04 选择器-Sizzle-设计思路 -
niuqiang2008:
学习学习
[原创] jQuery源码分析-04 选择器-Sizzle-工作原理 -
liuweihug:
jquery 解析正则表达式及常见的Regex规则和表达式 - ...
[原创] jQuery源码分析-02正则表达式-RegExp-常用正则表达式 -
liang8768:
mark!!!
[原创] jQuery源码分析-00前言开光
作者:nuysoft/高云 QQ:47214707 EMail:nuysoft@gmail.com
毕竟是边读边写,不对的地方请告诉我,多多交流共同进步。本章还未写完,完了会提交PDF。
前记:
想系统的好好写写,但是会先从感兴趣的部分开始。
近期有读者把PDF传到了百度文库上,首先感谢转载和传播,但是据为已有并设置了挺高的财富值才能下载就不好了,以后我整理好了会传到文库上。请体谅一下。
3. 构造jQuery对象
3.1 源码结构
先看看总体结构,再做分解:
(function( window, undefined ) {
var jQuery = (function() { // 构建jQuery对象 var jQuery = function( selector, context ) { return new jQuery.fn.init( selector, context, rootjQuery ); }
// jQuery对象原型 jQuery.fn = jQuery.prototype = { constructor: jQuery, init: function( selector, context, rootjQuery ) { // selector有以下7种分支情况: // DOM元素 // body(优化) // 字符串:HTML标签、HTML字符串、#id、选择器表达式 // 函数(作为ready回调函数) // 最后返回伪数组 } };
// Give the init function the jQuery prototype for later instantiation jQuery.fn.init.prototype = jQuery.fn;
// 合并内容到第一个参数中,后续大部分功能都通过该函数扩展 // 通过jQuery.fn.extend扩展的函数,大部分都会调用通过jQuery.extend扩展的同名函数 jQuery.extend = jQuery.fn.extend = function() {};
// 在jQuery上扩展静态方法 jQuery.extend({ // ready bindReady // isPlainObject isEmptyObject // parseJSON parseXML // globalEval // each makeArray inArray merge grep map // proxy // access // uaMatch // sub // browser });
// 到这里,jQuery对象构造完成,后边的代码都是对jQuery或jQuery对象的扩展 return jQuery;
})();
window.jQuery = window.$ = jQuery; })(window); |
l jQuery对象不是通过 new jQuery 创建的,而是通过 new jQuery.fn.init 创建的
var jQuery = function( selector, context ) { return new jQuery.fn.init( selector, context, rootjQuery ); } |
n jQuery对象就是jQuery.fn.init对象
n 如果执行new jQeury(),生成的jQuery对象会被抛弃,最后返回 jQuery.fn.init对象;因此可以直接调用jQuery( selector, context ),没有必要使用new关键字
l 先执行 jQuery.fn = jQuery.prototype,再执行 jQuery.fn.init.prototype = jQuery.fn,合并后的代码如下:
jQuery.fn.init.prototype = jQuery.fn = jQuery.prototype |
所有挂载到jQuery.fn的方法,相当于挂载到了jQuery.prototype,即挂载到了jQuery 函数上(一开始的 jQuery = function( selector, context ) ),但是最后都相当于挂载到了 jQuery.fn.init.prototype,即相当于挂载到了一开始的jQuery 函数返回的对象上,即挂载到了我们最终使用的jQuery对象上。
这个过程非常的绕,金玉其外“败絮”其中啊!
3.2 jQuery.fn.init
jQuery.fn.init的功能是对传进来的selector参数进行分析,进行各种不同的处理,然后生成jQuery对象。
处理方式 |
|
DOM元素 |
包装成jQuery对象,直接返回 |
body(优化) |
从document.body读取 |
单独的HTML标签 |
document.createElement |
HTML字符串 |
document.createDocumentFragment |
#id |
document.getElementById |
选择器表达式 |
$(…).find |
函数 |
注册到dom ready的回调函数 |
3.3 jQuery.extend = jQuery.fn.extend
// 合并两个或更多对象的属性到第一个对象中,jQuery后续的大部分功能都通过该函数扩展 // 通过jQuery.fn.extend扩展的函数,大部分都会调用通过jQuery.extend扩展的同名函数
// 如果传入两个或多个对象,所有对象的属性会被添加到第一个对象target
// 如果只传入一个对象,则将对象的属性添加到jQuery对象中。 // 用这种方式,我们可以为jQuery命名空间增加新的方法。可以用于编写jQuery插件。 // 如果不想改变传入的对象,可以传入一个空对象:$.extend({}, object1, object2); // 默认合并操作是不迭代的,即便target的某个属性是对象或属性,也会被完全覆盖而不是合并 // 第一个参数是true,则会迭代合并 // 从object原型继承的属性会被拷贝 // undefined值不会被拷贝 // 因为性能原因,JavaScript自带类型的属性不会合并
// jQuery.extend( target, [ object1 ], [ objectN ] ) // jQuery.extend( [ deep ], target, object1, [ objectN ] ) jQuery.extend = jQuery.fn.extend = function() { var options, name, src, copy, copyIsArray, clone, target = arguments[0] || {}, i = 1, length = arguments.length, deep = false;
// Handle a deep copy situation // 如果第一个参数是boolean型,可能是深度拷贝 if ( typeof target === "boolean" ) { deep = target; target = arguments[1] || {}; // skip the boolean and the target // 跳过boolean和target,从第3个开始 i = 2; }
// Handle case when target is a string or something (possible in deep copy) // target不是对象也不是函数,则强制设置为空对象 if ( typeof target !== "object" && !jQuery.isFunction(target) ) { target = {}; }
// extend jQuery itself if only one argument is passed // 如果只传入一个参数,则认为是对jQuery扩展 if ( length === i ) { target = this; --i; }
for ( ; i < length; i++ ) { // Only deal with non-null/undefined values // 只处理非空参数 if ( (options = arguments[ i ]) != null ) { // Extend the base object for ( name in options ) { src = target[ name ]; copy = options[ name ];
// Prevent never-ending loop // 避免循环引用 if ( target === copy ) { continue; }
// Recurse if we're merging plain objects or arrays // 深度拷贝且值是纯对象或数组,则递归 if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { // 如果copy是数组 if ( copyIsArray ) { copyIsArray = false; // clone为src的修正值 clone = src && jQuery.isArray(src) ? src : []; // 如果copy的是对象 } else { // clone为src的修正值 clone = src && jQuery.isPlainObject(src) ? src : {}; }
// Never move original objects, clone them // 递归调用jQuery.extend target[ name ] = jQuery.extend( deep, clone, copy );
// Don't bring in undefined values // 不能拷贝空值 } else if ( copy !== undefined ) { target[ name ] = copy; } } } }
// Return the modified object // 返回更改后的对象 return target; }; |
未完待续
评论
jQuery.fn.init.prototype = jQuery.fn = jQuery.prototype
这个并不绕啊,将jQuery.fn.init的prototype属性设置为jQuery.fn,那么使用new jQuery.fn.init()生成的对象的原型对象就是jQuery.fn,
所以挂载到jQuery.fn上面的函数就相当于挂载到jQuery.fn.init()生成的jQuery对象上。
jQuery.fn.init.prototype = jQuery.fn = jQuery.prototype 对于这句话, 前面的jQuery.fn.init.prototype = jQuery.fn这个赋值很好理解,刚开始我没有弄懂为什么jQuery.fn = jQuery.prototype,貌似没什么必要,是,在 var x = jQuery(yyy);这种情况下,确实是没什么必要, 但是如果是这样写 var x = new jQuery();这种写法,就是必须的了
总之: jQuery.fn.init.prototype = jQuery.fn 是应付 var x = jQuery(yyy);这种写法的jQuery.fn = jQuery.prototype 是应付var x = new jQuery(yyy);这种写法的。
你好,请问为什么 jQuery.fn.init.prototype = jQuery.fn 是应付 var x = jQuery(yyy)???
主要是对 对象的维护 因为只要一旦new 就会去查找实例的静态属性方法和对象的prototype属性,将其copy生成一个新的对象,如果中途修改或增加原型对象的属性,那么也会同时更新这个Object对象,原型对象的属性是被其所有的实例所共享的,所以在修改其属性值的同时也需要额外小心,因为一不小心会影响其它的实例对象,所以对象的prototype在这边的重要性不言而喻 jQuery.fn === jQuery.prototype === jQuery.fn.init.prototype ,最后, jQuery返回的对象的成员和 jQuery.fn 的成员匹配。
不清楚为什么要jquery.prototype.
最终生成的jquery对象原型都是init.prototype吧
没那么复杂, 我想原因很简单 jquery.fn比jquery.prototype短,prototype这玩意不能优化, jquery插件都要引用jquery.fn的,我想这是jquery.fn的作用。至于jquery.fn.init.prototype是为了保护jquery, 比如某个笨蛋刚接触jquery直接用jquery.prototype扩展jquery(这是直觉上最容易想到的方法,js嘛),还是这种错误写法jquery.prototype={...} ,如果没有init.prototype, jquery就不能用了。如果这个笨蛋还写了jquery.fn.init.prototype={...},好吧,这个笨蛋很变态,我给他跪了
不清楚为什么要jquery.prototype.
最终生成的jquery对象原型都是init.prototype吧
jQuery.fn.init.prototype = jQuery.fn = jQuery.prototype
这个并不绕啊,将jQuery.fn.init的prototype属性设置为jQuery.fn,那么使用new jQuery.fn.init()生成的对象的原型对象就是jQuery.fn,
所以挂载到jQuery.fn上面的函数就相当于挂载到jQuery.fn.init()生成的jQuery对象上。
jQuery.fn.init.prototype = jQuery.fn = jQuery.prototype 对于这句话, 前面的jQuery.fn.init.prototype = jQuery.fn这个赋值很好理解,刚开始我没有弄懂为什么jQuery.fn = jQuery.prototype,貌似没什么必要,是,在 var x = jQuery(yyy);这种情况下,确实是没什么必要, 但是如果是这样写 var x = new jQuery();这种写法,就是必须的了
总之: jQuery.fn.init.prototype = jQuery.fn 是应付 var x = jQuery(yyy);这种写法的jQuery.fn = jQuery.prototype 是应付var x = new jQuery(yyy);这种写法的。
你好,请问为什么 jQuery.fn.init.prototype = jQuery.fn 是应付 var x = jQuery(yyy)???
主要是对 对象的维护 因为只要一旦new 就会去查找实例的静态属性方法和对象的prototype属性,将其copy生成一个新的对象,如果中途修改或增加原型对象的属性,那么也会同时更新这个Object对象,原型对象的属性是被其所有的实例所共享的,所以在修改其属性值的同时也需要额外小心,因为一不小心会影响其它的实例对象,所以对象的prototype在这边的重要性不言而喻 jQuery.fn === jQuery.prototype === jQuery.fn.init.prototype ,最后, jQuery返回的对象的成员和 jQuery.fn 的成员匹配。
jQuery.fn.init.prototype = jQuery.fn = jQuery.prototype
这个并不绕啊,将jQuery.fn.init的prototype属性设置为jQuery.fn,那么使用new jQuery.fn.init()生成的对象的原型对象就是jQuery.fn,
所以挂载到jQuery.fn上面的函数就相当于挂载到jQuery.fn.init()生成的jQuery对象上。
jQuery.fn.init.prototype = jQuery.fn = jQuery.prototype 对于这句话, 前面的jQuery.fn.init.prototype = jQuery.fn这个赋值很好理解,刚开始我没有弄懂为什么jQuery.fn = jQuery.prototype,貌似没什么必要,是,在 var x = jQuery(yyy);这种情况下,确实是没什么必要, 但是如果是这样写 var x = new jQuery();这种写法,就是必须的了
总之: jQuery.fn.init.prototype = jQuery.fn 是应付 var x = jQuery(yyy);这种写法的jQuery.fn = jQuery.prototype 是应付var x = new jQuery(yyy);这种写法的。
你好,请问为什么 jQuery.fn.init.prototype = jQuery.fn 是应付 var x = jQuery(yyy)???
这句话是不是有问题哈,如果执行new jquery(),返回的还是jquery对象吧,而不是jquery,fn.init对象,平时我们用jquery()或$()返回的是jquery.fn.init对象。
执行new jquery(),js会创建一个jquery类型的对象jqueryTemp,然后调用jquery()方法,把jquery的执行环境设置为先创建的object,类似于调用jquery.call(jqueryTemp),最后返回jqueryTemp。这是通过new jquery()创建对象时,js底层的执行机制吧,其他的通过new创建对象也是一样的。
构造函数如果有返回值,并且返回值是一个对象,则会丢弃运算符 new 创建的临时对象。这个与 jQuery 无关,属于运算符 new 的知识。
同意!
明白了。谢谢!还是对js基础知识掌握的不牢。在学习中!非常感谢!!!
看了lz的回复又重新温故了一下js的基础知识对于以下经典的例子就容易理解了。
例子代码贴出来:
//例子1
var name = "The Window";
var object = {
name : "My Object",
getNameFunc : function(){
return function(){
return this.name;
};
}
};
alert(object.getNameFunc()());
//例子2
var name = "The Window";
var object = {
name : "My Object",
getNameFunc : function(){
var that = this;
return function(){
return that.name;
};
}
};
alert(object.getNameFunc()());
谢谢lz。
明白了。谢谢!还是对js基础知识掌握的不牢。在学习中!非常感谢!!!
jQuery.extend = jQuery.fn.extend = function() {
var options, name, src, copy, copyIsArray, clone,
target = arguments[0] || {},
i = 1,
length = arguments.length,
deep = false;
// Handle a deep copy situation
// 如果第一个参数是boolean型,可能是深度拷贝
if ( typeof target === "boolean" ) {
deep = target;
target = arguments[1] || {};
// skip the boolean and the target
// 跳过boolean和target,从第3个开始
i = 2;
}
// Handle case when target is a string or something (possible in deep copy)
// target不是对象也不是函数,则强制设置为空对象
if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
target = {};
}
// extend jQuery itself if only one argument is passed
// 如果只传入一个参数,则认为是对jQuery扩展
if ( length === i ) {
target = this;
--i;
}
//…………此处省去 大部分代码
本人对上述代码红色字体中 target = this; this具体指代那个对象,此处叫迷惑。希望lz能在百忙之中帮助解答。谢谢
这句话是不是有问题哈,如果执行new jquery(),返回的还是jquery对象吧,而不是jquery,fn.init对象,平时我们用jquery()或$()返回的是jquery.fn.init对象。
执行new jquery(),js会创建一个jquery类型的对象jqueryTemp,然后调用jquery()方法,把jquery的执行环境设置为先创建的object,类似于调用jquery.call(jqueryTemp),最后返回jqueryTemp。这是通过new jquery()创建对象时,js底层的执行机制吧,其他的通过new创建对象也是一样的。
构造函数如果有返回值,并且返回值是一个对象,则会丢弃运算符 new 创建的临时对象。这个与 jQuery 无关,属于运算符 new 的知识。
这句话是不是有问题哈,如果执行new jquery(),返回的还是jquery对象吧,而不是jquery,fn.init对象,平时我们用jquery()或$()返回的是jquery.fn.init对象。
执行new jquery(),js会创建一个jquery类型的对象jqueryTemp,然后调用jquery()方法,把jquery的执行环境设置为先创建的object,类似于调用jquery.call(jqueryTemp),最后返回jqueryTemp。这是通过new jquery()创建对象时,js底层的执行机制吧,其他的通过new创建对象也是一样的。
你看看这句就明白了 jQuery.fn.init.prototype = jQuery.fn = jQuery.prototype
有上面这句 那么 new jQuery.fn.init() === new jQuery()了 只不过
jQuery() 是返回的 new jQuery.fn.init(); 而 var o = new jQuery(); 这2者是相当的了
这句话是不是有问题哈,如果执行new jquery(),返回的还是jquery对象吧,而不是jquery,fn.init对象,平时我们用jquery()或$()返回的是jquery.fn.init对象。
执行new jquery(),js会创建一个jquery类型的对象jqueryTemp,然后调用jquery()方法,把jquery的执行环境设置为先创建的object,类似于调用jquery.call(jqueryTemp),最后返回jqueryTemp。这是通过new jquery()创建对象时,js底层的执行机制吧,其他的通过new创建对象也是一样的。
jQuery.fn.init.prototype = jQuery.fn = jQuery.prototype
这个并不绕啊,将jQuery.fn.init的prototype属性设置为jQuery.fn,那么使用new jQuery.fn.init()生成的对象的原型对象就是jQuery.fn,
所以挂载到jQuery.fn上面的函数就相当于挂载到jQuery.fn.init()生成的jQuery对象上。
jQuery.fn.init.prototype = jQuery.fn = jQuery.prototype 对于这句话, 前面的jQuery.fn.init.prototype = jQuery.fn这个赋值很好理解,刚开始我没有弄懂为什么jQuery.fn = jQuery.prototype,貌似没什么必要,是,在 var x = jQuery(yyy);这种情况下,确实是没什么必要, 但是如果是这样写 var x = new jQuery();这种写法,就是必须的了
总之: jQuery.fn.init.prototype = jQuery.fn 是应付 var x = jQuery(yyy);这种写法的jQuery.fn = jQuery.prototype 是应付var x = new jQuery(yyy);这种写法的。
jQuery.fn.init.prototype = jQuery.fn = jQuery.prototype
这个并不绕啊,将jQuery.fn.init的prototype属性设置为jQuery.fn,那么使用new jQuery.fn.init()生成的对象的原型对象就是jQuery.fn,
所以挂载到jQuery.fn上面的函数就相当于挂载到jQuery.fn.init()生成的jQuery对象上。
再读感觉也不饶,而是惊叹于如此写法的精妙与必要。
jQuery.fn.init.prototype = jQuery.fn = jQuery.prototype
这个并不绕啊,将jQuery.fn.init的prototype属性设置为jQuery.fn,那么使用new jQuery.fn.init()生成的对象的原型对象就是jQuery.fn,
所以挂载到jQuery.fn上面的函数就相当于挂载到jQuery.fn.init()生成的jQuery对象上。
发表评论
-
[原创] jQuery源码分析-04 选择器-Sizzle-设计思路
2011-11-14 20:59 6714作者:nuysoft/高云 QQ:47214707 Em ... -
[原创] jQuery源码分析-04 选择器-Sizzle-工作原理
2011-11-13 23:45 7747作者:nuysoft/高云 QQ:47214707 EM ... -
[原创] jQuery源码分析-02正则表达式-RegExp-常用正则表达式
2011-10-27 01:29 46437作者:nuysoft/JS攻城师/ ... -
[原创] jQuery源码分析-jQuery中的循环技巧
2011-10-27 00:36 14409作者:nuysoft/JS攻城师/高云 QQ:47214707 ... -
[原创] jQuery源码分析-10事件处理-Event-DOM-ready
2011-10-20 01:20 10456作者:nuysoft/JS攻城师/ ... -
[原创] jQuery源码分析-Java工程师应该向jQuery学习的8点建议
2011-10-18 23:56 12107作者:nuysoft/高云 QQ:47214707 EM ... -
[原创] jQuery源码分析-10事件处理-Event-事件绑定与删除-bind/unbind+live/die+delegat/undelegate
2011-10-18 22:31 15472作者:nuysoft/高云 QQ:47214707 EM ... -
[原创] jQuery源码分析-10事件处理-Event-源码结构
2011-10-17 01:01 11993作者:nuysoft/高云 QQ:47214707 EMail ... -
[原创] jQuery源码分析-07数据缓存-Cache
2011-10-13 19:55 11964作者:nuysoft/高云 QQ:47214707 EMail ... -
[原创] jQuery源码分析-06浏览器测试-Support
2011-10-13 19:19 9744作者:nuysoft/高云 QQ:47214707 EMail ... -
[原创] jQuery源码分析系列目录(持续更新)
2011-10-12 12:30 29140作者:nuysoft/高云 QQ:47214707 E ... -
[原创] jQuery源码分析-10事件处理-Event-概述和基础知识
2011-10-12 00:16 11887作者:nuysoft/高云 Q ... -
[原创] jQuery源码分析-08队列 Queue
2011-10-10 23:48 10636作者:nuysoft/高云 Q ... -
[原创] jQuery源码分析-03构造jQuery对象-工具函数
2011-09-29 23:21 29639作者:nuysoft/高云 QQ:47214707 E ... -
[原创] jQuery源码分析-15AJAX-类型转换器
2011-09-29 02:25 7253作者:nuysoft/高云 QQ:47214707 EM ... -
[原创] jQuery源码分析-如何做jQuery源码分析
2011-09-27 00:22 14872近期在ITEYE陆续写了几篇jQuery源码分析,乐在其 ... -
[原创] jQuery源码分析-17尺寸和大小 Dimensions & Offset
2011-09-25 22:05 6914边读边写,不正确的地方,还请各位告诉我,多多交流共同学习, ... -
[原创] jQuery源码分析-15AJAX-前置过滤器和请求分发器
2011-09-23 00:09 13154边读边写,不正确的 ... -
[原创] jQuery源码分析-00前言开光
2011-09-21 23:42 46855jQuery源码分析 - 前言 jQuery凭借简洁的语法和 ... -
[原创] jQuery源码分析-01总体架构
2011-09-21 23:31 748731. 总体架构 1.1 自调用匿名函 ...
相关推荐
jQuery源码分析-03构造jQuery对象-源码结构和核心函数,需要的朋友可以参考下。
jQuery源码分析-03构造jQuery对象-工具函数,需要的朋友可以参考下。
jQuery源码分析 ...03 构造jQuery对象-源码结构和核心函数 03 构造jQuery对象-工具函数 05 异步队列 Deferred 08 队列 Queue 09 属性操作 10 事件处理-Event-概述和基础知识 15 AJAX-前置过滤器和请求分发器
* jQuery源码分析-each函数 * jQuery版本:1.4.2 * * ---------------------------------------------------------- * 函数介绍 * * each函数通过jQuery.extend函数附加到jQuery对象中: * jQuery.extend({ * each: ...
1. 总体架构 1.1 自调用匿名函数 self-invoking anonymous function 打开jQuery源码,首先你会看到这样的代码结构: 代码如下: (function( window, undefined ) { // jquery code })(window); 1. 这是一个自调用匿名...
jQuery each函数源码分析_.docx
jquery源码分析(2.0.3版本) 大概内容大纲 (功能(){ (21,94)定义了一些变量和函数jQuery = function(){} (96,284)给JQ对象添加一些方法和属性 (285,347)扩展名:JQ的继承方法 (349,817)jQuery....
jQuery源代码 本文主要以为学习参考书籍,为保证与书籍内容同步,以jQuery 1.7.2为学习版本进行。... jQuery构造函数的总体结构 构造函数jQuery.fn.init() jQuery.buildFragment()方法 jQuery.c
5. 异步队列 Deferred 5.1 概述 异步队列是一个链式对象,增强对回调函数的管理和调用,用于处理异步任务。 异步队列有三种状态:初始化(unresolved),成功(resolved),失败(rejected)。 执行哪些回调函数依赖...
jQuery本质上就是用javascript代码写成的各种方法的集合。但是javascript本身不是已经提供了各种各样的方法和功能了吗?为什么还要再另外写一个库出来呢?原因其实很好猜,那肯定是我们要写的这个库比javascript提供...
EasyUI每个组件的属性,方法和事件。用户可以很容易地扩展他们。 属性 所有的属性都定义在jQuery.fn.{plugin}.defaults里面。例如,对话框属性定义在jQuery.fn.dialog.defaults里面。 事件 所有的事件(回调函数)...
本书循序渐进地对jQuery的各种函数和方法调用进行了介绍,读者可以系统地掌握jQuery的DOM操作、事件监听和动画、表单操作、AJAX以及插件方面等知识点,并结合每个章节后面的案例演示进行练习,达到掌握核心知识点的...
一、源码思路分析总结 概要: jQuery的核心思想可以简单概括为“查询和操作dom”,今天主要是分析一下jQuery.prototype.init选择器构造函数,处理选择器函数中的参数; 这个函数的参数就是jQuery()===$()执行函数中...
进而通过“构造jquery对象”章节分析了构造函数jquery()的各种用法和内部构造过程;接着详细分析了底层支持模块的源码实现,包括:选择器sizzle、异步队列deferred、数据缓存data、队列queue、浏览器功能测试support...
进而通过“构造 jQuery 对象”章节分析了构造函数 jQuery() 的各种用法和内部构造过程;接着详细分析了底层支持模块的源码实现,包括:选择器 Sizzle、异步队列 Deferred、数据缓存 Data、资源太大,传百度网盘了,...
事件操作源码相对比较复杂,只是粗略的进行了源码的调试和说明,对于Jquery如何监听事件以及取消监听的原理,代码执行顺序和兼容性问题处理有了粗略的理解,随后有空会继续深入分析源码的实现原理。 完整版 1.总体...