我们都知道jQuery的事件其思想来源于Dean Edwards的addEvent,通过源码我们知道jQuery在为元素绑定事件时,每种类型的事件(click,blur)时只绑定了一次对应类型的事件处理方法,实际的方法是存在jQuery的缓存系统中的,这样做的好处我就不多说了,绑定方法的函数为add方法,在执行事件的时,通过handers在缓存系统中获取事件列表,然后通过dispatch函数来执行对应的事件。

jQuery.event = { 
     add: function( elem, types, handler, data, selector ) {                 var tmp, events, t, handleObjIn,             special, eventHandle, handleObj,             handlers, type, namespaces, origType,             elemData = jQuery._data( elem );//从缓存系统中获取对应的事件数据         // 如果不存在事件数据则直接退出         if ( !elemData ) {             return;         }         // Caller can pass in an object of custom data in lieu of the handler         if ( handler.handler ) {             handleObjIn = handler;             handler = handleObjIn.handler;             selector = handleObjIn.selector;         }         // 为事件添加标识         if ( !handler.guid ) {             handler.guid = jQuery.guid++;         }         //初始化事件对象数据         if ( !(events = elemData.events) ) {             events = elemData.events = {};         }                 //每种事件类型只绑定一次事件(eventHanle)         if ( !(eventHandle = elemData.handle) ) {             eventHandle = elemData.handle = function( e ) {                 // Discard the second event of a jQuery.event.trigger() and                 // when an event is called after a page has unloaded                 return typeof jQuery !== strundefined && (!e || jQuery.event.triggered !== e.type) ?                 //通过dispatch来触发事件的执行,eventHandle.elem来绑定当前元素,防止this指向错误(attachEvent中this会指向window的bug)                     jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :                     undefined;             };             // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events             eventHandle.elem = elem;         }         //多个事件的绑定         // Handle multiple events separated by a space         types = ( types || "" ).match( rnotwhite ) || [ "" ];         t = types.length;         while ( t-- ) {             tmp = rtypenamespace.exec( types[t] ) || [];             type = origType = tmp[1];             namespaces = ( tmp[2] || "" ).split( "." ).sort();             // There *must* be a type, no attaching namespace-only handlers             if ( !type ) {                 continue;             }             // If event changes its type, use the special event handlers for the changed type             special = jQuery.event.special[ type ] || {};             // If selector defined, determine special event api type, otherwise given type             type = ( selector ? special.delegateType : special.bindType ) || type;             // Update special based on newly reset type             special = jQuery.event.special[ type ] || {};             //将事件组合成一个事件对象             handleObj = jQuery.extend({                 type: type,                 origType: origType,                 data: data,                 handler: handler,                 guid: handler.guid,                 selector: selector,                 needsContext: selector && jQuery.expr.match.needsContext.test( selector ),                 namespace: namespaces.join(".")             }, handleObjIn );             //handlers对应事件类型的事件列表             if ( !(handlers = events[ type ]) ) {                 handlers = events[ type ] = [];                 handlers.delegateCount = 0;                 // Only use addEventListener/attachEvent if the special events handler returns false                 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 );                     }                 }             }             //特殊事件的处理             if ( special.add ) {                 special.add.call( elem, handleObj );                 if ( !handleObj.handler.guid ) {                     handleObj.handler.guid = handler.guid;                 }             }             // 将事件加入事件列表中             if ( selector ) {                 handlers.splice( handlers.delegateCount++, 0, handleObj );             } else {                 handlers.push( handleObj );             }             //表示事件曾经使用过,用于事件优化             jQuery.event.global[ type ] = true;         }         // 防止ie内存溢出         elem = null;      },      remove: function( elem, types, handler, selector, mappedTypes ) {           //为元素移除事件      },      trigger: function( event, data, elem, onlyHandlers ) {          //执行事件      },      dispatch: function( event ) {          //分配事件(在执行方法时执行)      },      handlers: function( event, handlers ) {          //获取缓存系统中对应事件类型的事件列表      } } //其实我们为每种事件绑定的方式是这样的 //通过dispatch来执行对应的事件 function ( e ) {      // Discard the second event of a jQuery.event.trigger() and      // when an event is called after a page has unloaded      return typeof jQuery !== strundefined && (!e || jQuery.event.triggered !== e.type) ?           jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :       undefined; }

好了,jQuery的绑定函数原理先介绍到这里。下次继续!一天一点,滴水汇河!

jQuery学习-事件之绑定事件(一)的更多相关文章

  1. jQuery学习-事件之绑定事件(三)

    在上一篇<jQuery学习-事件之绑定事件(二)>我们了解了jQuery的dispatch方法,今天我们来学习下handlers 方法: handlers: function( event ...

  2. jQuery学习-事件之绑定事件(二)

    在上一篇<jQuery学习-事件之绑定事件(一)>我们了解了jQuery的add方法,今天我们来学习下dispatch方法: dispatch: function( event ) {   ...

  3. jQuery如何给body绑定事件?

    jQuery如何给body绑定事件? 代码如下: $(document).bind("resize", function () { alert("php-note.com ...

  4. JQuery在循环中绑定事件的问题详解

    JQuery在循环中绑定事件的问题详解 有个页面上需要N个DOM,每个DOM里面的元素ID都要以数字结尾,比如说 ? 1 2 3 <input type="text" nam ...

  5. jquery学习笔记(三):事件和应用

    内容来自[汇智网]jquery学习课程 3.1 页面加载事件 在jQuery中页面加载事件是ready().ready()事件类似于就JavaScript中的onLoad()事件,但前者只要页面的DO ...

  6. jQuery学习小结1-CSS操作+事件

    一.DOM对象和jQuery 对象互换 1.jQuery对象 就是通过jQuery包装DOM对象后产生的对象.jQuery对象是jQuery独有的,其可以使用jQuery里的方法.比如: $(&quo ...

  7. [jquery]高级篇--js绑定事件

    参考:  http://www.cnblogs.com/leejersey/p/3545372.html jQuery on()方法是官方推荐的绑定事件的一个方法.$(selector).on(eve ...

  8. jquery html 动态添加元素绑定事件

    由于实际的需要,有时需要往网页中动态的插入HTML内容,并在插入的节点中绑定事件处理函数.我们知道,用Javascript向HTML文档中 插入内容,有两种方法, 一种是在写HTML代码写入JS,然后 ...

  9. jquery事件与绑定事件

    1.首先,我们来看一下经常使用的添加事件的方式: <input type="button" id="btn" value="click me!& ...

随机推荐

  1. 使用notepad++学习python爬虫,print网页中文乱码问题

    今天学习使用python爬虫的时候发现爬到的网页中文会乱码,一直网上搜索解决办法,一个一个试验过去,发现还是乱码,然后我就开始使用其它方法测试,用python自带的编辑器打开是正常的,发现是notep ...

  2. Linux下vim文件未正常退出,修复文件

    Linux下vim文件未正常退出,会产生一个 .文件名.swp的文件 ls -al  ,rm   删掉.swp文件 之后就可以正常使用文件了

  3. 修复被注入的sql server

    ) set @delStr='<script src=http://3b3.org/c.js></script>'----这边修改被注入的js set nocount on ) ...

  4. DM368启动串口打印分析

    DM36x initialization passed! TI UBL Version: 1.50 Booting Catalog Boot Loader                  //启动目 ...

  5. cf467A George and Accommodation

    A. George and Accommodation time limit per test 1 second memory limit per test 256 megabytes input s ...

  6. entity framework如何控制并发

     entity framework如何控制并发 针对字段http://msdn.microsoft.com/en-us/library/vstudio/bb738618(v=vs.100).aspx ...

  7. linux之SQL语句简明教程---SUBSTRING

    SQL 中的 substring 函数是用来抓出一个栏位资料中的其中一部分.这个函数的名称在不同的资料库中不完全一样: MySQL: SUBSTR( ), SUBSTRING( ) Oracle: S ...

  8. c++多线程崩溃错误1

    主线程中的子线程没有jion,导致主线程马上结束,子线程对象被释放掉,而子线程还在后台继续执行导致崩溃 int main() OBJ = classA() OBJ.START()//在start函数中 ...

  9. mysql中limit用法误区

    之前一直用oracle,在分页的时候用rownumber,转换到mysql上之后,用limit做分页: 在做某个业务的时候,需要先将数据排序,再分页,在给limit上参数的时候沿用了oracle的ro ...

  10. hunnu11543:小明的烦恼——分糖果

    Problem description   小明在班里一直是个非常公正的孩子.这点同学和老师都非常清楚,这不,老师每周都会从家里带来一些糖果.然后叫小明把糖果分给其它小朋友,但这个班里的同学都有一个非 ...