jQuery源码解读二
2016-06-04 12:48
483 查看
例:
$(document).ready(function () {
$("p").click(function () {
$(this).hide();
});
});
在开始进入程序之前,先要说明一点,jQuery代码庞大又绕,虽然语法上能看得懂,算法上也没问题,但是即使这样,如果凭自己一步步去计算这个流程,然后得到它的意图,会很费时间,有时候,很多时候,完全可以借用浏览器的调试工具去得到某些变量的值,这样一下子就能看清jQuery到底要干什么,事半功倍,对于研究看庞大的源码的人来说,不管什么源码,调试工具是一个很有用的工具,这点很重要。至于有哪些调试工具,很简单,浏览器都有,我用过chrome的、IE的,至于怎么用也很简单,如果这个不会,还是赶紧立刻马上去用几下,再不行就去百度
============================== $(document) ============================
$(document) = jQuery(document) = new jQuery.fn.init(document)
如上所示 最终返回的是这个jQuery.fn.init的匿名对象
看这个 init = jQuery.fn.init = function 方法详细代码我就不贴了
里面有两个属性
this.context = this[ 0 ] = selector;
//selector 就是参数document this.length = 1;
你可以直接 alert 或者 console.log 输出这个值,我用的是 console.log
console.log($(document).context); //document对象
console.log($(document).length); // 1
然后下面有这么一行
init.prototype = jQuery.fn;
而 jQuery.fn = jQuery.prototype 又 init = jQuery.fn.init
所以 这jQuery.fn.init 的对象 又包含了 jQuery对象的属性
比如可以 console.log($(document).jquery);//可以看到jQuery版本号
至此 $(document)解读完毕,返回的是 jQuery.fn.init 匿名对象,有它自己的属性和方法
============================== $(document) ============================
=================================== ready ==============================
在3000多行的位置有这么一个方法 jQuery.fn.ready = function( fn )...
这个 ready 是 jQuery.fn 的属性 结合上面 init.prototype = jQuery.fn;
所以 ready 也是 init 的属性 又 init = jQuery.fn.init 所以 ready 也就是匿名对象
jQuery.fn.init 的属性 , 因此 $(document)可以调用这个ready,写得有点绕,jQuery这个思想
就像六合彩一样,让我猜不透。
然后传入这个ready的参数是这个方法
function () {
$("p").click(function () {
$(this).hide();
});
}
下面看这个ready方法
jQuery.fn.ready = function( fn ) {
jQuery.ready.promise().done( fn );
return this;
};
然后
jQuery.ready.promise = function( obj )...
重要的是下面这句
jQuery.ready.promise();
也就是说,jQuery文件加载的时候,这个方法已经调用了一遍,那么看看它第一次调用干了些啥.
这个方法,如果一句句去看,一个个子方法去绕,不一会我就有一种感觉,心中十万匹草泥马山崩地裂,呼啸奔腾,于是机智的我果断用了 调试工具,然后我只需要按几下键盘就知道它葫芦里到底卖的什么药。
直接看这个jQuery.ready.promise = function( obj )方法里面的内容,很容易知道,第一次调用,初始化了一个readyList,并且加了事件监听
document.addEventListener( "DOMContentLoaded", completed ); 事件监听容易理解,dom树加载完成(不会等资源也加载完)就会执行这个
completed 方法。下面重点看看这个 readyList 是啥,还有定义它有什么意图
readyList = jQuery.Deferred(); 这个jQuery.Deferred方法返回一个deferred对象,先看看这个deffered对象有些啥,这个容易,调试工具显示它包含了很多个方法:always、done、fail、notify、notifyWith、pipe、progress、promise、reject、rejectWith、resolve、resolveWith、state、then 。 对它更详细解释这里先推荐几篇不错的文章:
1、http://www.jb51.net/article/28054.htm
2、http://www.cnblogs.com/snandy/archive/2012/12/19/2812935.html
3、http://www.cnblogs.com/littledu/articles/2813051.html
当用到这个对象的方法时,再深入到它的源码,现在只看这个ready,到此为止这个第一次执行的jQuery.ready.promise()结束
然后继续这个ready方法,jQuery.ready.promise().done( fn );
可以看到 又执行了一次jQuery.ready.promise(),这时直接返回了promise对象,deferred对象的由来跟这个promise有很大关系,细看源码这两句:jQuery.each( tuples, function( i, tuple ) {省略};promise.promise( deferred );可以知道,jQuery.ready.promise()第一次执行时,先扩充了promise对象,然后根据这个promise对象 扩充了deferred对象,所以deferred对象如上的一些方法也是promise对象的方法,比如这个done方法,jQuery.ready.promise().done(
fn );
done就是 jQuery.Callbacks 中的add方法
=================================== ready ==============================
$(document).ready(function () {
$("p").click(function () {
$(this).hide();
});
});
在开始进入程序之前,先要说明一点,jQuery代码庞大又绕,虽然语法上能看得懂,算法上也没问题,但是即使这样,如果凭自己一步步去计算这个流程,然后得到它的意图,会很费时间,有时候,很多时候,完全可以借用浏览器的调试工具去得到某些变量的值,这样一下子就能看清jQuery到底要干什么,事半功倍,对于研究看庞大的源码的人来说,不管什么源码,调试工具是一个很有用的工具,这点很重要。至于有哪些调试工具,很简单,浏览器都有,我用过chrome的、IE的,至于怎么用也很简单,如果这个不会,还是赶紧立刻马上去用几下,再不行就去百度
============================== $(document) ============================
$(document) = jQuery(document) = new jQuery.fn.init(document)
如上所示 最终返回的是这个jQuery.fn.init的匿名对象
看这个 init = jQuery.fn.init = function 方法详细代码我就不贴了
里面有两个属性
this.context = this[ 0 ] = selector;
//selector 就是参数document this.length = 1;
你可以直接 alert 或者 console.log 输出这个值,我用的是 console.log
console.log($(document).context); //document对象
console.log($(document).length); // 1
然后下面有这么一行
init.prototype = jQuery.fn;
而 jQuery.fn = jQuery.prototype 又 init = jQuery.fn.init
所以 这jQuery.fn.init 的对象 又包含了 jQuery对象的属性
比如可以 console.log($(document).jquery);//可以看到jQuery版本号
至此 $(document)解读完毕,返回的是 jQuery.fn.init 匿名对象,有它自己的属性和方法
============================== $(document) ============================
=================================== ready ==============================
在3000多行的位置有这么一个方法 jQuery.fn.ready = function( fn )...
这个 ready 是 jQuery.fn 的属性 结合上面 init.prototype = jQuery.fn;
所以 ready 也是 init 的属性 又 init = jQuery.fn.init 所以 ready 也就是匿名对象
jQuery.fn.init 的属性 , 因此 $(document)可以调用这个ready,写得有点绕,jQuery这个思想
就像六合彩一样,让我猜不透。
然后传入这个ready的参数是这个方法
function () {
$("p").click(function () {
$(this).hide();
});
}
下面看这个ready方法
jQuery.fn.ready = function( fn ) {
jQuery.ready.promise().done( fn );
return this;
};
然后
jQuery.ready.promise = function( obj )...
重要的是下面这句
jQuery.ready.promise();
也就是说,jQuery文件加载的时候,这个方法已经调用了一遍,那么看看它第一次调用干了些啥.
这个方法,如果一句句去看,一个个子方法去绕,不一会我就有一种感觉,心中十万匹草泥马山崩地裂,呼啸奔腾,于是机智的我果断用了 调试工具,然后我只需要按几下键盘就知道它葫芦里到底卖的什么药。
直接看这个jQuery.ready.promise = function( obj )方法里面的内容,很容易知道,第一次调用,初始化了一个readyList,并且加了事件监听
document.addEventListener( "DOMContentLoaded", completed ); 事件监听容易理解,dom树加载完成(不会等资源也加载完)就会执行这个
completed 方法。下面重点看看这个 readyList 是啥,还有定义它有什么意图
readyList = jQuery.Deferred(); 这个jQuery.Deferred方法返回一个deferred对象,先看看这个deffered对象有些啥,这个容易,调试工具显示它包含了很多个方法:always、done、fail、notify、notifyWith、pipe、progress、promise、reject、rejectWith、resolve、resolveWith、state、then 。 对它更详细解释这里先推荐几篇不错的文章:
1、http://www.jb51.net/article/28054.htm
2、http://www.cnblogs.com/snandy/archive/2012/12/19/2812935.html
3、http://www.cnblogs.com/littledu/articles/2813051.html
当用到这个对象的方法时,再深入到它的源码,现在只看这个ready,到此为止这个第一次执行的jQuery.ready.promise()结束
然后继续这个ready方法,jQuery.ready.promise().done( fn );
可以看到 又执行了一次jQuery.ready.promise(),这时直接返回了promise对象,deferred对象的由来跟这个promise有很大关系,细看源码这两句:jQuery.each( tuples, function( i, tuple ) {省略};promise.promise( deferred );可以知道,jQuery.ready.promise()第一次执行时,先扩充了promise对象,然后根据这个promise对象 扩充了deferred对象,所以deferred对象如上的一些方法也是promise对象的方法,比如这个done方法,jQuery.ready.promise().done(
fn );
done就是 jQuery.Callbacks 中的add方法
=================================== ready ==============================
相关文章推荐
- JQuery1——基础($对象,选择器,对象转换)
- JavaScript演示排序算法
- 2015-2016网页设计趋势分析 Web Design of Trends
- jQuery Ajax 跨域调用
- 移动端的长按事件
- jquery教程靠边站,一分钱不花让你免费学会jquery
- JQuery+Strusts1.x无刷新登录
- $.ajax()方法详解
- jQuery ajax - ajax() 方法
- JavaScript 各种遍历方式详解
- 数组方法汇总
- jQuery Html控件基本操作(日常收集整理)
- jQuery插件实现文字无缝向上滚动效果代码
- jQuery菜单插件用法实例
- JQuery 初体验(建议学习jquery)
- 基于Jquery和CSS3制作数字时钟附源码下载(CSS3篇)
- Jquery实现的table最后一行添加样式的代码
- jQuery实现向下滑出的平滑下拉菜单效果
- jQuery 练习[一] 学习jquery的准备工作
- jquery获得页面元素的坐标值实现思路及代码