SlideShare une entreprise Scribd logo
1  sur  37
jQuery源码学习 qijun.weiqj
大纲 jQuery无架构* 常用的静态方法 解密万能构造器* 理解jQuery对象* 深入事件处理*
jQuery无架构 源码之前,了无秘密
varjQuery = function(selector,  context)  { }; jQuery.extend = function(target, source) { 	// 回忆FD.common.apply }; 于是我们有了静态方法 $.extend(…  因为函数也是对象
接着我们就可以扩展静态方法: $.extendIf = function(target, src) { } // 注:丹侠在fdev4中提供了此方法,以此眷顾我们的fdev3 当然也可以这样 $.extend($, { extendIf: function() { 		… 	} 	add: function() { 		… 	} })
可以更专业: $.extend({ extendIf: function()… 	add: function()… }) 因为可以省略第一个参数, 此时target就是this, 即jQuery 在这里我们初步感觉到jQueryAPI的特点: 精简、灵活、还很智能, jQuery的流行最大的原因就在于此 jQuery中所有静态方法就是这样扩展的 注:但是我们把扩展jQuery的大任交给fdev-4维护小组,以避免名字空间冲突。应用中一般情况下不允许扩展jQuery对象
摘录: jQuery.extend({ noConflict: function(deep) { isFunction: function( obj ) { 		return jQuery.type(obj) === "function"; 	}, isArray: Array.isArray || function( obj ) { 		return jQuery.type(obj) === "array"; 	}, isWindow: function( obj ) { 		return obj && typeofobj === "object" && "setInterval" in obj; 	}, isNaN: function( obj ) { 		return obj == null || !rdigit.test( obj ) || isNaN( obj ); 	},
在jQuery中,我们可以这样: $(‘#div’).addClass(‘error’); $(‘ul.tabs’, elm).eq(0).click(); 从上面我们知道 jQuery是一个函数, 从这里我们知道 函数返回值是一个对象,并且有很多的实例方法, 这些方法用来操作相关节点
varjQuery = function() { 	return new jQuery.fn.init(selector, context); }; jQuery.fn = { }; jQuery.fn.init = function() { }; jQuery.fn.init.prototype  { addClass: function()  { 	}, removeClass: function()  { 	} }; 从现在开始,我们的jQuery对象也有了addClass和removeClass方法
重构一下: varjQuery = function() { 	return new jQuery.fn.init(selector, context); } jQuery.fn = { 	init: function() { 	}, addClass: function() {}, removeClass: function() {} } jQuery.fn.init.prototype = jQuery.fn
现在我们就可以扩展jQuery实例方法了 $.fn.ajax = function(url, options) { } 专业点: $.extend($.fn, { 	get: function()… 	post: function()… }) 更专业 $.fn.extend({ 	bind: function() {…} }) 因为:$.fn.extend = $.extend = function(…,
关于链式调用 $.fn.extend({ addClass: function() { 		… 		return this; 	} toogleClass: function() { 		… 		return this; 	} hasClass: function() { 		return true|false; 	}
经验建议 为了增加可读性, 避免不同类型API之间的链试调用 var elm = $(‘#id’);   //为了增加可读性, 避免过多的$, 只在合适的地方使用$构造 elm.removeClass(‘error’).addClass(‘success’); elm.click(function() { 	… });
轻松一下:浏览一下常用静态方法 工具方法 $.noConflict  // 由fdev-v4 默认调用,以兼容fdev-v3  所以应用中使用jQuery应该在一个closure中 $.trim $.each	—— 可以对对象和数组进行迭代 $.extend	   ——  FD.common.apply /  YAHOO.lang.augmentObject $.extendIf $.grep 	——  $.map $.now	—— new Date().getTime(), 方便加时间戳
数组操作和类型检测 $.inArray	// 可以使用Array.indexOf代替 $.makeArray	// 很有用, 把任何东西变成数组 $.merge 		// 可惜了这个方法 $.type		// 返回类型字符串 $.isArray $.isEmptyObject $.isFunction $.isPlainObject $.isWindow $.isXMLDoc
AJAX和参数 $.param $.paramSpecial中文jsonp调用代替$.param $.unparam $.parseJSON $.parseXML $.globalEval $.ajax $.ajaxSetup 以下方法调用$.ajax $.get $.post $.getJSON $.getScript
特性检测/浏览器检测/函数包装 $.support $.browser 关于浏览器检测,文档中有一句话很有价值: We recommend against using this property;  please try to use feature detection instead jQuery.browser may be moved to a plugin in a future release of jQuery. $.error ——当作assert使用 $.noop  —— 空方法 $.proxy	——包装一个函数,改变this作用域 $.when $.sub
虽然在api文档中有,但不常用的方法, 一般应用于jQuery内部,被相应的实例方法调用 $.fx $.data $.hasData $.removeData $.contains     $.queue $.dequeue $.cssHooks
fdev-v4提供的静态方法 $.add $.use $.namespace $.extendIf $.unparam $.paramSpecial $.util.cookie $.util.subCookie $.util.substitute
万能构造器 jQuery对象是如何构造的 jQuery对象是数组吗? 构造成本有多大
回顾一下 varjQuery = function() { 	return new jQuery.fn.init(selector, context); } jQuery.fn = { 	init: function(selector, context) { 	},
1. $(null|false|…); 2. $(element); 3. $(‘body’) init: function(selector, context) ( 		// 1. 支持空selector 		if (!selector) { 			return this; 		} 		// 2. 原生dom节点 if (selector.nodeType) { this.context = this[0] = selector; this.length = 1; 			return this; 		}
		// 3. 字符串 body 		if (selector === 'body') { this.context = document; 			this[0] = document.body; this.selector = 'body'; this.length = 1; 			return this; 		} 现在我们知道: jQuery对象是普通的Object, 不是Array, 只是包含的property为数字,所以看起来像数组
4. $(function() { console.debug(‘domready’) }) 5. $(array|collection) //-------------------------------------------------------------------------------------- 		// 4. function 		} else if (jQuery.isFunction(selector)) { 			 return jQuery.ready(selector); 			// 等效于 $(document).ready(function()… 		} 		// 5. collection / array 		return jQuery.makeArray(selector, this);
6. $('<div></div>') 7. $('<div>') 8. $('<div />') selector = [ doc.createElement( ret[1] ) ]; 9. $('<img>', { 	width: '100', 	height: '200' }); selector = [ doc.createElement( ret[1] ) ]; jQuery.fn.attr.call( selector, context, true ); 所以上述相当于 $(‘<img>’).attr(…
10. html片段和id选择器 $(‘<a href=“#”>这个html很复杂</a>')  jQuery.buildFragment( [ match[1] ], [ doc ] );   1.  如果片段小于0.5K, 可cache, 以加快创建速度 2. createDocumentFragment()创建节点 3. innerHTML或 createTextNode来创建内容 11. $(‘#id’)   // 注意,这里需要#, 因为要使用CSS3选 择器 elem = document.getElementById( match[2] );
12. css3选择器 $('div.myclass', [context]) --->  $(context).find('div.myclass')     ----> $(context). pushStack(…  这一步会构造一个新的jQuery对象  -----> jQuery.find  === Sizzle; 所以采用css 3选择器的时候, 实际上会生成两个jQuery对象 不过不用担心,jQuery对象很小, 下面看看它的成本。
jQuery对象属性内存结构 看以上结构知道,jQuery对象是简单的轻量级对象,构造成本很小, 并且GC对小对象的回收效率非常高,所以从这上面讲不用担心效率和内存问题。 我在自己机子上构造了10万个jQuery对象,大概占用32M内存空间。
深入jQuery事件模型 页面中有下面代码: <a href="#" class="link-a">Click Me A</a> <a href="#" class="link-b">Click Me B</a> <script> (function($) { $('a.link-a').click(function() { console.debug('click a'); }); $('a.link-a').click(function() { console.debug('click a2'); }); $('a.link-a').dblclick(function() { console.debug('dbclick'); }); $('a.link-b').click(function() { console.debug('click other'); }); })(jQuery); </script>
在firebug的脚本监控中输入jQuery.cache 再查看节点的DOM
在源码中有这样一个字段:1328行 jQuery.extend({	 expando: "jQuery" + 		 ( jQuery.fn.jquery + Math.random() ).replace( //g, "" ),
一个节点一个事件一个handler 2197行: elemData.handle = eventHandle = function() {			 	return jQuery.event.handle.apply( eventHandle.elem, arguments ) : }; 2250行 if ( elem.addEventListener ) { elem.addEventListener( type,  eventHandle, false );	 } else if ( elem.attachEvent ) { elem.attachEvent( “on” + type,  eventHandle ); } 那么jQuery.event.handle应该是真正调用用户操作的地方
将上图数据结构展开 有了上图基础,看jQuery事件代码就容易多了,jQuery的事件也就不再神秘
事件冒泡 live & delegate 问题: 有何区别 如果实现 其实是一个问题: 事件最终挂接到哪里?
还是源码 delegate:  function( selector,  types,  fn) { 	return this.live( types, fn, selector);  <----- 第三个参数jq内部使用 }
jQuery.fn.live = function(types, fn, selector) { var context = selector ? this : $(this.context); 	… for ( var j = 0, l = context.length; j < l; j++ ) jQuery.event.add( context[j], "live." + liveConvert( type,  } 总结: 1. live 事件挂接在 jQuery对象的context上(这里的context不是jQuery的第二个参数)一般为document 2. delegate事件挂接在当前jQuery对象包含的节点上 简单地说: live挂接在document上(适合不复杂的冒泡) delegate挂接在指定节点上 (比较精细)
谢谢 谁教我做PPT啊!

Contenu connexe

Tendances

Patterns in Zend Framework
Patterns in Zend FrameworkPatterns in Zend Framework
Patterns in Zend FrameworkJace Ju
 
页游开发中的 Python 组件与模式
页游开发中的 Python 组件与模式页游开发中的 Python 组件与模式
页游开发中的 Python 组件与模式勇浩 赖
 
论 Python 与设计模式。
论 Python 与设计模式。论 Python 与设计模式。
论 Python 与设计模式。勇浩 赖
 
Arrays的Sort算法分析
Arrays的Sort算法分析Arrays的Sort算法分析
Arrays的Sort算法分析Zianed Hou
 
02 Objective-C
02 Objective-C02 Objective-C
02 Objective-CTom Fan
 
Python learn guide
Python learn guidePython learn guide
Python learn guiderobin yang
 
C++11 smart pointers
C++11 smart pointersC++11 smart pointers
C++11 smart pointerschchwy Chang
 
Jni攻略之八――操作对象的构造方法
Jni攻略之八――操作对象的构造方法Jni攻略之八――操作对象的构造方法
Jni攻略之八――操作对象的构造方法yiditushe
 
《Java程序设计》期末考试试题 (六)
《Java程序设计》期末考试试题 (六)《Java程序设计》期末考试试题 (六)
《Java程序设计》期末考试试题 (六)jane2006
 
常見設計模式介紹
常見設計模式介紹常見設計模式介紹
常見設計模式介紹Jace Ju
 
Programming python - part 1
Programming python - part 1Programming python - part 1
Programming python - part 1Che-Cheng Hsu
 
iPhone,ios,Object-C基础入门
iPhone,ios,Object-C基础入门iPhone,ios,Object-C基础入门
iPhone,ios,Object-C基础入门Lucien Li
 
《Python 3.5 技術手冊》第六章草稿
《Python 3.5 技術手冊》第六章草稿《Python 3.5 技術手冊》第六章草稿
《Python 3.5 技術手冊》第六章草稿Justin Lin
 
Free Marker中文文档
Free Marker中文文档Free Marker中文文档
Free Marker中文文档yiditushe
 
Ecma script edition5-小试
Ecma script edition5-小试Ecma script edition5-小试
Ecma script edition5-小试lydiafly
 
Python 于 webgame 的应用
Python 于 webgame 的应用Python 于 webgame 的应用
Python 于 webgame 的应用勇浩 赖
 

Tendances (19)

Patterns in Zend Framework
Patterns in Zend FrameworkPatterns in Zend Framework
Patterns in Zend Framework
 
Ooredis
OoredisOoredis
Ooredis
 
页游开发中的 Python 组件与模式
页游开发中的 Python 组件与模式页游开发中的 Python 组件与模式
页游开发中的 Python 组件与模式
 
论 Python 与设计模式。
论 Python 与设计模式。论 Python 与设计模式。
论 Python 与设计模式。
 
ios分享
ios分享ios分享
ios分享
 
Arrays的Sort算法分析
Arrays的Sort算法分析Arrays的Sort算法分析
Arrays的Sort算法分析
 
02 Objective-C
02 Objective-C02 Objective-C
02 Objective-C
 
Python learn guide
Python learn guidePython learn guide
Python learn guide
 
C++11 smart pointers
C++11 smart pointersC++11 smart pointers
C++11 smart pointers
 
Jni攻略之八――操作对象的构造方法
Jni攻略之八――操作对象的构造方法Jni攻略之八――操作对象的构造方法
Jni攻略之八――操作对象的构造方法
 
《Java程序设计》期末考试试题 (六)
《Java程序设计》期末考试试题 (六)《Java程序设计》期末考试试题 (六)
《Java程序设计》期末考试试题 (六)
 
JQuery Plugin
JQuery PluginJQuery Plugin
JQuery Plugin
 
常見設計模式介紹
常見設計模式介紹常見設計模式介紹
常見設計模式介紹
 
Programming python - part 1
Programming python - part 1Programming python - part 1
Programming python - part 1
 
iPhone,ios,Object-C基础入门
iPhone,ios,Object-C基础入门iPhone,ios,Object-C基础入门
iPhone,ios,Object-C基础入门
 
《Python 3.5 技術手冊》第六章草稿
《Python 3.5 技術手冊》第六章草稿《Python 3.5 技術手冊》第六章草稿
《Python 3.5 技術手冊》第六章草稿
 
Free Marker中文文档
Free Marker中文文档Free Marker中文文档
Free Marker中文文档
 
Ecma script edition5-小试
Ecma script edition5-小试Ecma script edition5-小试
Ecma script edition5-小试
 
Python 于 webgame 的应用
Python 于 webgame 的应用Python 于 webgame 的应用
Python 于 webgame 的应用
 

En vedette (20)

Ovento
OventoOvento
Ovento
 
Dedinho
DedinhoDedinho
Dedinho
 
Amigos SãO Estradas
Amigos SãO EstradasAmigos SãO Estradas
Amigos SãO Estradas
 
Carinho
CarinhoCarinho
Carinho
 
Educación basada en competencias
Educación basada en competenciasEducación basada en competencias
Educación basada en competencias
 
Chile Projecto Pascualama...Epnsr
Chile Projecto Pascualama...EpnsrChile Projecto Pascualama...Epnsr
Chile Projecto Pascualama...Epnsr
 
Uma Ora O Pra Voc
Uma Ora  O  Pra VocUma Ora  O  Pra Voc
Uma Ora O Pra Voc
 
Archivo ocs
Archivo ocsArchivo ocs
Archivo ocs
 
Pesquisa Esportiva 1
Pesquisa Esportiva 1Pesquisa Esportiva 1
Pesquisa Esportiva 1
 
Desconto Nos Impostos
Desconto Nos ImpostosDesconto Nos Impostos
Desconto Nos Impostos
 
Minerinhodandonoticia
MinerinhodandonoticiaMinerinhodandonoticia
Minerinhodandonoticia
 
Ciclo hidrologico
Ciclo hidrologicoCiclo hidrologico
Ciclo hidrologico
 
Cietec
CietecCietec
Cietec
 
41164 Sexta Feira
41164 Sexta Feira41164 Sexta Feira
41164 Sexta Feira
 
Los chicos
Los chicosLos chicos
Los chicos
 
A Ascensão das Redes Sociais na América Latina
A Ascensão das Redes Sociais na América LatinaA Ascensão das Redes Sociais na América Latina
A Ascensão das Redes Sociais na América Latina
 
Ferrari3
Ferrari3Ferrari3
Ferrari3
 
Presentación1
Presentación1Presentación1
Presentación1
 
Seja Felizz
Seja FelizzSeja Felizz
Seja Felizz
 
Quatroerros Roberto Shinyashiki 3me50s
Quatroerros Roberto Shinyashiki 3me50sQuatroerros Roberto Shinyashiki 3me50s
Quatroerros Roberto Shinyashiki 3me50s
 

Similaire à jQuery源码学习

用Jquery实现拖拽层
用Jquery实现拖拽层用Jquery实现拖拽层
用Jquery实现拖拽层yiditushe
 
Java script closures
Java script closuresJava script closures
Java script closuresskywalker1114
 
Java script closures
Java script closuresJava script closures
Java script closuresskywalker1114
 
jQuery底层架构
jQuery底层架构jQuery底层架构
jQuery底层架构fangdeng
 
Javascript之昨是今非
Javascript之昨是今非Javascript之昨是今非
Javascript之昨是今非Tony Deng
 
Js的国(转载)
Js的国(转载)Js的国(转载)
Js的国(转载)Leo Hui
 
JavaScript 闭包分享(一):传递参数
JavaScript 闭包分享(一):传递参数JavaScript 闭包分享(一):传递参数
JavaScript 闭包分享(一):传递参数Janlay Wu
 
潜力无限的编程语言Javascript
潜力无限的编程语言Javascript潜力无限的编程语言Javascript
潜力无限的编程语言Javascriptjay li
 
Keep your code clean
Keep your code cleanKeep your code clean
Keep your code cleanmacrochen
 
JavaScript Advanced Skill
JavaScript Advanced SkillJavaScript Advanced Skill
JavaScript Advanced Skillfirestoke
 
Javascript autoload
Javascript autoloadJavascript autoload
Javascript autoloadjay li
 
jQuery介绍@disandu.com
jQuery介绍@disandu.comjQuery介绍@disandu.com
jQuery介绍@disandu.comThink hy
 
JavaScript 快速複習 2017Q1
JavaScript 快速複習 2017Q1JavaScript 快速複習 2017Q1
JavaScript 快速複習 2017Q1Sheng-Han Su
 
學好 node.js 不可不知的事
學好 node.js 不可不知的事學好 node.js 不可不知的事
學好 node.js 不可不知的事Ben Lue
 
jQuery 選取器解析
jQuery 選取器解析jQuery 選取器解析
jQuery 選取器解析Kingsley Zheng
 
Backbone js and requirejs
Backbone js and requirejsBackbone js and requirejs
Backbone js and requirejsChi-wen Sun
 
淺談C#物件導向與DesignPattern.pdf
淺談C#物件導向與DesignPattern.pdf淺談C#物件導向與DesignPattern.pdf
淺談C#物件導向與DesignPattern.pdfBrian Chou 周家禾
 

Similaire à jQuery源码学习 (20)

用Jquery实现拖拽层
用Jquery实现拖拽层用Jquery实现拖拽层
用Jquery实现拖拽层
 
Java script closures
Java script closuresJava script closures
Java script closures
 
Java script closures
Java script closuresJava script closures
Java script closures
 
jQuery底层架构
jQuery底层架构jQuery底层架构
jQuery底层架构
 
Javascript之昨是今非
Javascript之昨是今非Javascript之昨是今非
Javascript之昨是今非
 
Js的国(转载)
Js的国(转载)Js的国(转载)
Js的国(转载)
 
J query
J queryJ query
J query
 
Banquet 52
Banquet 52Banquet 52
Banquet 52
 
JavaScript 闭包分享(一):传递参数
JavaScript 闭包分享(一):传递参数JavaScript 闭包分享(一):传递参数
JavaScript 闭包分享(一):传递参数
 
潜力无限的编程语言Javascript
潜力无限的编程语言Javascript潜力无限的编程语言Javascript
潜力无限的编程语言Javascript
 
Keep your code clean
Keep your code cleanKeep your code clean
Keep your code clean
 
JavaScript Advanced Skill
JavaScript Advanced SkillJavaScript Advanced Skill
JavaScript Advanced Skill
 
Javascript autoload
Javascript autoloadJavascript autoload
Javascript autoload
 
CRUD 綜合運用
CRUD 綜合運用CRUD 綜合運用
CRUD 綜合運用
 
jQuery介绍@disandu.com
jQuery介绍@disandu.comjQuery介绍@disandu.com
jQuery介绍@disandu.com
 
JavaScript 快速複習 2017Q1
JavaScript 快速複習 2017Q1JavaScript 快速複習 2017Q1
JavaScript 快速複習 2017Q1
 
學好 node.js 不可不知的事
學好 node.js 不可不知的事學好 node.js 不可不知的事
學好 node.js 不可不知的事
 
jQuery 選取器解析
jQuery 選取器解析jQuery 選取器解析
jQuery 選取器解析
 
Backbone js and requirejs
Backbone js and requirejsBackbone js and requirejs
Backbone js and requirejs
 
淺談C#物件導向與DesignPattern.pdf
淺談C#物件導向與DesignPattern.pdf淺談C#物件導向與DesignPattern.pdf
淺談C#物件導向與DesignPattern.pdf
 

Plus de fangdeng

Building an event driven web
Building an event driven webBuilding an event driven web
Building an event driven webfangdeng
 
浅尝jQuery
浅尝jQuery浅尝jQuery
浅尝jQueryfangdeng
 
Html基础培训
Html基础培训Html基础培训
Html基础培训fangdeng
 
前端开发之Js
前端开发之Js前端开发之Js
前端开发之Jsfangdeng
 
Javascript代码注释及文档生成
Javascript代码注释及文档生成Javascript代码注释及文档生成
Javascript代码注释及文档生成fangdeng
 
J engine -构建高性能、可监控的前端应用框架
J engine -构建高性能、可监控的前端应用框架J engine -构建高性能、可监控的前端应用框架
J engine -构建高性能、可监控的前端应用框架fangdeng
 
前端单元测试初体验
前端单元测试初体验前端单元测试初体验
前端单元测试初体验fangdeng
 
Java script测试之js unit ut
Java script测试之js unit utJava script测试之js unit ut
Java script测试之js unit utfangdeng
 
2011年方凳年度总结及颁奖
2011年方凳年度总结及颁奖2011年方凳年度总结及颁奖
2011年方凳年度总结及颁奖fangdeng
 
产品线中的思考
产品线中的思考产品线中的思考
产品线中的思考fangdeng
 
产品线中的思考
产品线中的思考产品线中的思考
产品线中的思考fangdeng
 
Postoffer前端架构设计
Postoffer前端架构设计Postoffer前端架构设计
Postoffer前端架构设计fangdeng
 
Varnish简介
Varnish简介Varnish简介
Varnish简介fangdeng
 
Let's talk about date in javascript
Let's talk about  date  in javascriptLet's talk about  date  in javascript
Let's talk about date in javascriptfangdeng
 
Test driven-frontend-develop
Test driven-frontend-developTest driven-frontend-develop
Test driven-frontend-developfangdeng
 
方凳良品1期
方凳良品1期方凳良品1期
方凳良品1期fangdeng
 
方凳良品2期
方凳良品2期方凳良品2期
方凳良品2期fangdeng
 
魏琪君-重构-关于可读性、原则和模式
魏琪君-重构-关于可读性、原则和模式魏琪君-重构-关于可读性、原则和模式
魏琪君-重构-关于可读性、原则和模式fangdeng
 
Datalazyload
DatalazyloadDatalazyload
Datalazyloadfangdeng
 

Plus de fangdeng (20)

Building an event driven web
Building an event driven webBuilding an event driven web
Building an event driven web
 
浅尝jQuery
浅尝jQuery浅尝jQuery
浅尝jQuery
 
Html基础培训
Html基础培训Html基础培训
Html基础培训
 
前端开发之Js
前端开发之Js前端开发之Js
前端开发之Js
 
Javascript代码注释及文档生成
Javascript代码注释及文档生成Javascript代码注释及文档生成
Javascript代码注释及文档生成
 
J engine -构建高性能、可监控的前端应用框架
J engine -构建高性能、可监控的前端应用框架J engine -构建高性能、可监控的前端应用框架
J engine -构建高性能、可监控的前端应用框架
 
前端单元测试初体验
前端单元测试初体验前端单元测试初体验
前端单元测试初体验
 
Java script测试之js unit ut
Java script测试之js unit utJava script测试之js unit ut
Java script测试之js unit ut
 
2011年方凳年度总结及颁奖
2011年方凳年度总结及颁奖2011年方凳年度总结及颁奖
2011年方凳年度总结及颁奖
 
产品线中的思考
产品线中的思考产品线中的思考
产品线中的思考
 
产品线中的思考
产品线中的思考产品线中的思考
产品线中的思考
 
Postoffer前端架构设计
Postoffer前端架构设计Postoffer前端架构设计
Postoffer前端架构设计
 
Varnish简介
Varnish简介Varnish简介
Varnish简介
 
Websocket
WebsocketWebsocket
Websocket
 
Let's talk about date in javascript
Let's talk about  date  in javascriptLet's talk about  date  in javascript
Let's talk about date in javascript
 
Test driven-frontend-develop
Test driven-frontend-developTest driven-frontend-develop
Test driven-frontend-develop
 
方凳良品1期
方凳良品1期方凳良品1期
方凳良品1期
 
方凳良品2期
方凳良品2期方凳良品2期
方凳良品2期
 
魏琪君-重构-关于可读性、原则和模式
魏琪君-重构-关于可读性、原则和模式魏琪君-重构-关于可读性、原则和模式
魏琪君-重构-关于可读性、原则和模式
 
Datalazyload
DatalazyloadDatalazyload
Datalazyload
 

jQuery源码学习