我们都知道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. Python之路第六天,基础(7)-正则表达式(re)

    Python RE模块(正则表达式) 就其本质而言,正则表达式(或 RE)是一种小型的.高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现.正则表达式模式被编译成 ...

  2. mysql 1054错误

    往数据库插入数据的时候报错,插入数据的是这样的 [SQL] insert into stock(code,name,b_price,s_price,num,rate,profit) values (1 ...

  3. python学习day1

    python简单介绍: Python的创始人为Guido van Rossum.1989年圣诞节期间,在阿姆斯特丹,Guido为了打发圣诞节的无趣,决心开发一个新的脚本解释程序,做为ABC 语言的一种 ...

  4. winform,wpf全屏 还显示任务栏的解决方法

    原文:winform,wpf全屏 还显示任务栏的解决方法 以wpf为例: 全屏代码: this.Topmost = true; this.WindowStyle = System.Windows.Wi ...

  5. 深入剖析MFC中对于Windows消息处理、运行机制

    序: 本人对Windows系统.MFC谈不上有深入的了解,但对MFC本身包装API的机制很有兴趣,特别是读了候老师的<深入浅出MFC>后,感觉到VISUAL C++的Application ...

  6. Lipschitz连续【zz】

    转载地址:http://moosewoler.blog.163.com/blog/static/6986605201242643122296/ 李普希兹连续是以德国数学家Rudolf Lipschit ...

  7. OSCHina技术导向:Java模板引擎velocity

    OSChina 采用 velocity 作为页面模板 Velocity是一个基于java的模板引擎(template engine).它允许任何人仅仅简单的使用模板语言(template langua ...

  8. SQL Server中的sysobjects

    摘自:http://www.cnblogs.com/bugY/archive/2011/09/21/2184182.html 关于SQL Server数据库的一切信息都保存在它的系统表格里.我怀疑你是 ...

  9. 黑马程序员 Java基础<九>---> 多线程

    ASP.Net+Android+IOS开发..Net培训.期待与您交流! 多线程 一.概述: 1.线程是什么 说到线程,我们就得先说说进程.所谓进程,就是一个正在执行(进行)中的程序,每一个进程执行都 ...

  10. 【奇偶剪枝】【HDU1010】Tempter of the Bone

    题意:输入一个n*m的迷宫,和一个T:可以在迷宫中生存的最大时间.S为起点,D为终点.并且,每个格子只能踩一次,且只能维持一秒,然后该块地板就会塌陷.所以你必须每秒走一步,且到D点时,所用时间为T. ...