我们都知道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. jq插件第二款来袭 图片滚动

    这第二款也是非常实用的插件,也是与图片相关,关于图片的需求太多了,这个是图片滚动哦,不过不是无缝滚动,是左像右滚动,到头的话再往回滚动,利用scrollLeft实现的,支持自动滚动和每次滚动的个数默认 ...

  2. Oracle数据库中如何选择合适的索引类型 .

    索引就好象一本字典的目录.凭借字典的目录,我们可以非常迅速的找到我们所需要的条目.数据库也是如此.凭借Oracle数据库的索引,相关语句可以迅速的定位记录的位置,而不必去定位整个表. 虽然说,在表中是 ...

  3. ios html5 长按复制文本

    以前做的项目,主要是针对ios的,安卓上面也没有测试. 原理其实是系统自带的功能,那时候借鉴的其他网站,没有试验通过document.execCommand("Copy"),别的j ...

  4. php 记住密码自动登录

    当我们登录网站管理后台的时候,会有提示说记住登录状态,记住我等这样的提示,这个选项有什么用呢?如果选中了记登录状态后,下次在浏览这个网站后 台时就不用在填写用户名和密码了,在去登录了.下面写了一小代码 ...

  5. 复习:IPC机制

    一.为什么需要IPC机制 当我们开启多个进程的时候,我们有时需要和各个进程进行交互.但是进程间的交互就不能够共享对象(就是进程A中创建了一个对象,进程B中的类或者方法不能够直接使用,需要用到IPC机制 ...

  6. 由PhysicalFileProvider构建的物理文件系统

    由PhysicalFileProvider构建的物理文件系统 ASP.NET Core应用中使用得最多的还是具体的物理文件,比如配置文件.View文件以及网页上的静态文件,物理文件系统的抽象通过Phy ...

  7. Android 自定义PopupWindow动画效果

    public class RollActivity extends Activity { private View view; private Button btn; private PopupWin ...

  8. 生成war的jdk版本高于tomcat使用的jdk版本,导致项目不能正常被访问

    记录一个耽误30分钟的一个坑: 生成war的jdk版本高于tomcat使用的jdk版本,导致项目不能正常被访问 报404错误

  9. C 语言的可变参数表函数的设计

    在c语言中使用变长参数最常见的就是下面两个函数了: int printf(const char *format, ...); int scanf(const char *format, ...); 那 ...

  10. linux之SQL语句简明教程---Subquery

    我们可以在一个 SQL 语句中放入另一个 SQL 语句.当我们在 WHERE 子句或 HAVING 子句中插入另一个 SQL 语句时,我们就有一个 subquery 的架构. Subquery 的作用 ...