`
xxh123
  • 浏览: 33749 次
  • 性别: Icon_minigender_1
  • 来自: 南京
文章分类
社区版块
存档分类

jquery源码的学习

 
阅读更多

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 );
}

//

}

    // 处理字符串参数,分七种情形:

     //①单个标签,带对象属性包           --->   jQuery.merge
     //②单个标签,不带对象属性包         --->   attr + jQuery.merge
     //③复杂的HTML片断                 --->   buildFragment + jQuery.merge
     //④ID选择器,与找到的元素的ID不同   --->   getElementById + Sizzle + pushStack
     //⑤ID选择器,与找到的元素的ID相同   --->   getElementById + 简单属性添加
     //⑥标签选择器                     --->   getElementsByTagName + jQuery.merge

     //⑦其他CSS表达式                  --->   Sizzle + pushStack

分享到:
评论

相关推荐

    通过jQuery源码学习javascript(二)

    "1.8.3", init: function() { return this; }, test: function() { console.log('test');...同时,这也展示了JavaScript中`this`的灵活用法和原型继承的概念,这些都是深入理解JavaScript和jQuery源码的关键。

    jquery各种版本源码

    描述中提到,“肯定有一个是你需要的”,这句话道出了jQuery源码学习的价值。无论你是初学者,希望通过阅读源码了解基础的DOM操作和事件处理,还是经验丰富的开发者,想要深入理解其内部机制,如选择器引擎Sizzle、...

    Jquery源码分析 源码

    通过对jQuery源码的深度剖析,我们可以学习到JavaScript设计模式、DOM操作的最佳实践、事件处理的优化策略,以及Ajax的封装技术,这些都将对我们的前端开发工作大有裨益。同时,理解源码也能帮助我们更好地利用...

    精通js+jquery源码

    三、jQuery源码学习要点 1. 封装:jQuery将原生JavaScript的一些复杂操作封装成易于使用的API,理解其封装策略有助于提高开发效率。 2. 性能优化:阅读源码可以学习jQuery如何通过缓存、选择器优化等方式提高性能。 ...

    jQuery源码分析系列.pdf

    - **前言开光**:介绍分析jQuery源码的目的和价值,强调通过深入研究源码,可以学习到先进的设计理念和实践技巧。 - **总体架构**:解析jQuery的模块化设计,包括各个功能模块之间的关系和交互方式,帮助理解jQuery...

    通过jQuery源码学习javascript(三)

    在本系列的第三篇文章中,我们将继续深入探讨通过jQuery源码学习JavaScript的各个方面。这篇文章主要讲解了几个关键的编程概念,包括对字符串遍历的理解、自调用匿名函数的用法、jQuery的`extend()`方法以及`param()...

    JQuery学习资料与源代码

    **jQuery学习资料与源代码详解** jQuery是一款广泛应用于Web开发的JavaScript库,它极大地简化了JavaScript的DOM操作、事件处理、动画设计以及Ajax交互。这个压缩包中的"JQuery学习资料与源代码"包含了从基础到进阶...

    Head First jquery源码

    通过对《Head First jQuery源码》的学习,开发者不仅能掌握jQuery的基本用法,还能深入理解其背后的设计思想和实现细节,提升Web开发技能。同时,这也为学习其他JavaScript库和框架打下坚实的基础。

    Head First jQuery源码

    《Head First jQuery》是一本非常受欢迎的前端开发书籍,它以直观、易懂的方式介绍了jQuery库的使用和原理。源码通常包含书中示例代码...通过源码学习,不仅能提高对jQuery的理解,还能培养解决问题和调试代码的能力。

    jquery源码框架解读

    《jQuery源码框架解读...通过对jQuery源码的深入学习,开发者不仅能掌握其工作原理,还能学习到面向对象编程、函数式编程、设计模式等多方面的知识。这将对提升开发效率、编写高性能代码以及构建复杂Web应用大有裨益。

    jQuery源码+中文详细注解

    ### jQuery源码+中文详细注解 #### 一、引言 本文档是对jQuery源码进行中文注解的详细介绍,旨在帮助广大前端开发者更深入地理解jQuery的核心逻辑和技术要点。通过对核心部分的逐行注解,可以更好地掌握jQuery的...

    锋利的Jquery 源码 锋利的Jquery 源码 jQuery学习资料

    《锋利的jQuery》是一本深受开发者欢迎的jQuery学习书籍,其源码是理解jQuery核心原理的重要参考资料。jQuery是一款高效、简洁的JavaScript库,它极大地简化了JavaScript在网页上的DOM操作、事件处理、动画设计和...

    jQuery 源码+实例+注释

    **jQuery 源码分析与实例详解** jQuery 是一个广泛使用的 JavaScript 库,它极大地简化了 JavaScript 的 DOM 操作、事件处理、动画制作以及 AJAX 交互。本教程旨在通过源码解析、实例演示和详细注释,帮助新手快速...

    jquery 源码分析

    首先,我们来看看`jquery-1.11.1.js`,这是未压缩的jQuery源码,适合学习和理解。jQuery的核心在于它的选择器引擎(Sizzle)、DOM操作、事件处理和动画系统。在源码中,可以看到jQuery构造函数`jQuery`接收一个参数...

    jquery api, jquery ui api, jquery源码分析

    深入理解jQuery源码有助于开发者更好地利用其API并优化性能。主要关注点包括: 1. **选择器引擎(Sizzle)**:jQuery 使用Sizzle作为其选择器引擎,它是如何快速高效地解析CSS选择器并找到匹配元素的。 2. **链式...

    jQuery源码解读

    jQuery 源码解读 jQuery 是一款非常流行的 JavaScript 库,以其简洁...通过学习源码,你可以了解到如何高效地操作 DOM,如何优雅地处理事件,以及如何编写高性能的 JavaScript 代码。这将极大地提升你的前端开发能力。

    jquery源码好不容易找到的与大家分享

    《jQuery源码解析:深入理解核心机制》 jQuery,这个小巧而强大的JavaScript库,自2006年发布以来,就以其简洁的API和出色的跨浏览器兼容性赢得了开发者们的广泛喜爱。今天,我们有幸深入剖析这份来之不易的jQuery...

    jquery源码

    **jQuery源码详解** jQuery,一个轻量级、高...通过深入学习jQuery源码,我们可以理解其背后的实现机制,进一步优化我们的代码,提升开发效率。jQuery的源码充满了高效的设计和编程技巧,值得每一个前端开发者去探究。

    jQuery源码详细分析中文注释

    总的来说,这份《jQuery源码详细分析中文注释》是学习和研究jQuery源码的绝佳资料,通过深入阅读和理解注释,开发者不仅可以掌握jQuery的工作原理,还能提升JavaScript编程技巧,为自己的项目开发带来更高的效率和更...

Global site tag (gtag.js) - Google Analytics