1 js中的对象都是object,使用firebug查看都是Object:{}形式,js中的function默认返回的是this对象,任何代码只要知道this对象那么就比较容易的理解,jquery中绝大多数的this对象都是一个数组对象,可以广泛的支持设计的需要。
2 createDocumentFragment主要可以提高效率。可以配合缓存使用,这个主要是通过jquery对象的fragement属性来实现。
3 动态方法apply和call的广泛的使用和isFunction,isObject等方法的使用。
4 初始化中的new jQuery.fn.init中的 jQuery.fn为jQuery的prototype,方便闭包的实现和可扩展性,而且jQuery.fn.init.prototype=jQuery.fn,所以 jQuery.fn=== jQuery.prototype===jQuery.fn.init.prototype。
5 正则表达式的使用,靠,看了好久终于看懂了一些,比较的强大,对一些基本的操作进行了比较完美的分类。反正我是想不到啦。
6 var getData = function(elem, key){
return1 && 2 || null; //如果缓存里没有, 返回null
}
这里有点linux的味道,如果1和2都是true则返回2的结果,否则返回null
6 大量使用闭包,即匿名function,可以有效的减少js的冲突,增加可用性。
平时我们都是调用 click(func) 之类的函数, 而其实这些都是工具函数,真正和事件挂钩的函数是
jQuery.fn.bind - 调用 jQuery.event.add
jQuery.fn.unbind - 调用 jQuery.event.remove
jQuery.fn.trigger - 调用 jQuery.event.trigger
jQuery.fn.one - 调用 jQuery.fn.bind,Query.fn.unbind
要想知道jQuery的事件原理,必须读 jQuery.event.add
add:
function
( elem, types, handler, data ) {
//
只对节点操作。
if
( elem.nodeType
===
3
||
elem.nodeType
===
8
) {
return
;
}
//
IE 无法传递 window,而是复制这个对象 。
if
( jQuery.isWindow( elem )
&&
( elem
!==
window
&&
!
elem.frameElement ) ) {
elem
=
window;
}
//
如果 handler === false, 也就是说就是阻止某事件,
//
这样只要 bind("evt", false); 就是阻止此事件。
if
( handler
===
false
) {
handler
=
returnFalse;
}
else
if
(
!
handler ) {
return
;
}
//
handleObjIn 是内部处理句柄, handleObj 是直接使用的处理句柄。
var
handleObjIn, handleObj;
if
( handler.handler ) {
handleObjIn
=
handler;
handler
=
handleObjIn.handler;
}
//
为函数生成唯一的 guid 。具体下面介绍。
if
(
!
handler.guid ) {
handler.guid
=
jQuery.guid
++
;
}
//
获取一个节点的数据。
var
elemData
=
jQuery.data( elem );
//
如果没有数据,则直接返回。
if
(
!
elemData ) {
return
;
}
//
避免和原生的js对象混淆。
var
eventKey
=
elem.nodeType
?
"
events
"
:
"
__events__
"
,
//
这里就是关键。
//
elemData 是存储数据的位置, 而 elemData[ eventKey ] 就是存储当前事件的对象。 elemData.handle 就是当前绑定的所有函数数组。
//
也就是说,当我们绑定一个函数时,会往 elemData.handle 放这个函数,然后事件触发时,会遍历 elemData.handle 中函数然后去执行。
//
肯能有人会问,为什么这么做,因为原生的DOM内部也有一个 函数数组,事件触发后会执行全部函数。答案还是 兼容。
//
标准浏览器使用 addEventListener
//
IE 使用 attachEvent
//
而这2者还是有差距的。因为 addEventListener 执行函数的顺序即添加函数的顺序,然而 attachEvent 执行函数的顺序和添加的顺序是相反的。
//
jQuery 使用自定义的 handler 数组,好处有:
//
因为最后仅绑定一次原生事件,事件触发后,手动执行 数组中的函数。这样保证兼容。
//
同时也可以知道到底绑定了什么函数,可以方便 trigger 函数的完成。
events
=
elemData[ eventKey ],
eventHandle
=
elemData.handle;
//
一些功能。。
if
(
typeof
events
===
"
function
"
) {
eventHandle
=
events.handle;
events
=
events.events;
}
else
if
(
!
events ) {
if
(
!
elem.nodeType ) {
elemData[ eventKey ]
=
elemData
=
function
(){};
}
elemData.events
=
events
=
{};
}
//
如果是第一次执行,需创建 eventHandle
if
(
!
eventHandle ) {
//
eventHandle 就是真正绑定到原生事件的那个函数,这个函数用来执行events.hadlers 用。
elemData.handle
=
eventHandle
=
function
() {
//
Handle the second event of a trigger and when
//
an event is called after a page has unloaded
return
typeof
jQuery
!==
"
undefined
"
&&
!
jQuery.event.triggered
?
jQuery.event.handle.apply( eventHandle.elem, arguments ) :
undefined;
};
}
//
绑定函数和原生,这样可以保证函数可执行为目前作用域。
eventHandle.elem
=
elem;
//
处理 jQuery(...).bind("mouseover mouseout", fn);
types
=
types.split(
"
"
);
var
type, i
=
0
, namespaces;
while
( (type
=
types[ i
++
]) ) {
handleObj
=
handleObjIn
?
jQuery.extend({}, handleObjIn) :
{ handler: handler, data: data };
//
略
//
绑定 type guid
handleObj.type
=
type;
if
(
!
handleObj.guid ) {
handleObj.guid
=
handler.guid;
}
//
获取当前的函数数组。
var
handlers
=
events[ type ],
special
=
jQuery.event.special[ type ]
||
{};
//
如果第一次,则创建这个数组。
if
(
!
handlers ) {
handlers
=
events[ type ]
=
[];
//
特殊事件要执行 setup 而不是标准 addEventListener。
//
此行用来支持自定义的事件。
if
(
!
special.setup
||
special.setup.call( elem, data, namespaces, eventHandle )
===
false
) {
//
标准事件。 这里绑定的为 eventHandle
if
( elem.addEventListener ) {
elem.addEventListener( type, eventHandle,
false
);
}
else
if
( elem.attachEvent ) {
elem.attachEvent(
"
on
"
+
type, eventHandle );
}
}
}
//
自定义事件,执行 add
if
( special.add ) {
special.add.call( elem, handleObj );
if
(
!
handleObj.handler.guid ) {
handleObj.handler.guid
=
handler.guid;
}
}
//
不管是不是首次,都放入目前绑定的函数。
handlers.push( handleObj );
//
为实现 trigger 。
jQuery.event.global[ type ]
=
true
;
}
//
让IE下可以正常回收 elem 内存。
elem
=
null
;
},
8.2 事件对象
框架的义务当然也包括 事件参数的修复。jQuery 是自定义事件对象, 这个对象模拟真实事件对象。
根据上文可以知道,真正绑定事件的是一个函数,这个函数执行时会先 生成自定义事件对象, 然后把此对象作为参数调用所有的 handler 。
jQuery 自定义事件是 jQuery.Event 。 (代码 2583-2610 行)
jQuery.Event
=
function
( src ) {
//
支持 没有 new jQuery.Event
if
(
!
this
.preventDefault ) {
return
new
jQuery.Event( src );
}
//
略
}
分享到:
相关推荐
"1.8.3", init: function() { return this; }, test: function() { console.log('test');...同时,这也展示了JavaScript中`this`的灵活用法和原型继承的概念,这些都是深入理解JavaScript和jQuery源码的关键。
描述中提到,“肯定有一个是你需要的”,这句话道出了jQuery源码学习的价值。无论你是初学者,希望通过阅读源码了解基础的DOM操作和事件处理,还是经验丰富的开发者,想要深入理解其内部机制,如选择器引擎Sizzle、...
通过对jQuery源码的深度剖析,我们可以学习到JavaScript设计模式、DOM操作的最佳实践、事件处理的优化策略,以及Ajax的封装技术,这些都将对我们的前端开发工作大有裨益。同时,理解源码也能帮助我们更好地利用...
三、jQuery源码学习要点 1. 封装:jQuery将原生JavaScript的一些复杂操作封装成易于使用的API,理解其封装策略有助于提高开发效率。 2. 性能优化:阅读源码可以学习jQuery如何通过缓存、选择器优化等方式提高性能。 ...
- **前言开光**:介绍分析jQuery源码的目的和价值,强调通过深入研究源码,可以学习到先进的设计理念和实践技巧。 - **总体架构**:解析jQuery的模块化设计,包括各个功能模块之间的关系和交互方式,帮助理解jQuery...
在本系列的第三篇文章中,我们将继续深入探讨通过jQuery源码学习JavaScript的各个方面。这篇文章主要讲解了几个关键的编程概念,包括对字符串遍历的理解、自调用匿名函数的用法、jQuery的`extend()`方法以及`param()...
**jQuery学习资料与源代码详解** jQuery是一款广泛应用于Web开发的JavaScript库,它极大地简化了JavaScript的DOM操作、事件处理、动画设计以及Ajax交互。这个压缩包中的"JQuery学习资料与源代码"包含了从基础到进阶...
通过对《Head First jQuery源码》的学习,开发者不仅能掌握jQuery的基本用法,还能深入理解其背后的设计思想和实现细节,提升Web开发技能。同时,这也为学习其他JavaScript库和框架打下坚实的基础。
《Head First jQuery》是一本非常受欢迎的前端开发书籍,它以直观、易懂的方式介绍了jQuery库的使用和原理。源码通常包含书中示例代码...通过源码学习,不仅能提高对jQuery的理解,还能培养解决问题和调试代码的能力。
《jQuery源码框架解读...通过对jQuery源码的深入学习,开发者不仅能掌握其工作原理,还能学习到面向对象编程、函数式编程、设计模式等多方面的知识。这将对提升开发效率、编写高性能代码以及构建复杂Web应用大有裨益。
### jQuery源码+中文详细注解 #### 一、引言 本文档是对jQuery源码进行中文注解的详细介绍,旨在帮助广大前端开发者更深入地理解jQuery的核心逻辑和技术要点。通过对核心部分的逐行注解,可以更好地掌握jQuery的...
《锋利的jQuery》是一本深受开发者欢迎的jQuery学习书籍,其源码是理解jQuery核心原理的重要参考资料。jQuery是一款高效、简洁的JavaScript库,它极大地简化了JavaScript在网页上的DOM操作、事件处理、动画设计和...
**jQuery 源码分析与实例详解** jQuery 是一个广泛使用的 JavaScript 库,它极大地简化了 JavaScript 的 DOM 操作、事件处理、动画制作以及 AJAX 交互。本教程旨在通过源码解析、实例演示和详细注释,帮助新手快速...
首先,我们来看看`jquery-1.11.1.js`,这是未压缩的jQuery源码,适合学习和理解。jQuery的核心在于它的选择器引擎(Sizzle)、DOM操作、事件处理和动画系统。在源码中,可以看到jQuery构造函数`jQuery`接收一个参数...
深入理解jQuery源码有助于开发者更好地利用其API并优化性能。主要关注点包括: 1. **选择器引擎(Sizzle)**:jQuery 使用Sizzle作为其选择器引擎,它是如何快速高效地解析CSS选择器并找到匹配元素的。 2. **链式...
jQuery 源码解读 jQuery 是一款非常流行的 JavaScript 库,以其简洁...通过学习源码,你可以了解到如何高效地操作 DOM,如何优雅地处理事件,以及如何编写高性能的 JavaScript 代码。这将极大地提升你的前端开发能力。
《jQuery源码解析:深入理解核心机制》 jQuery,这个小巧而强大的JavaScript库,自2006年发布以来,就以其简洁的API和出色的跨浏览器兼容性赢得了开发者们的广泛喜爱。今天,我们有幸深入剖析这份来之不易的jQuery...
**jQuery源码详解** jQuery,一个轻量级、高...通过深入学习jQuery源码,我们可以理解其背后的实现机制,进一步优化我们的代码,提升开发效率。jQuery的源码充满了高效的设计和编程技巧,值得每一个前端开发者去探究。
总的来说,这份《jQuery源码详细分析中文注释》是学习和研究jQuery源码的绝佳资料,通过深入阅读和理解注释,开发者不仅可以掌握jQuery的工作原理,还能提升JavaScript编程技巧,为自己的项目开发带来更高的效率和更...