jQuery挖源码——事件绑定

jQuery版本:2.1.4

  • 最常用事件绑定bind,调用了on。
1 bind: function( types, data, fn ) {
2         return this.on( types, null, data, fn );
3     }

对应解绑unband,调用了off。

1 unbind: function( types, fn ) {
2         return this.off( types, null, fn );
3     }
  • 只执行一次的one绑定,赤裸裸调用on。
1 one: function( types, selector, data, fn ) {
2         return this.on( types, selector, data, fn, 1 );
3     }
  • 委托delegate,调用on
1 delegate: function( selector, types, data, fn ) {
2         return this.on( types, selector, data, fn );
3     }

undelegate调用off

1 undelegate: function( selector, types, fn ) {
2         // ( namespace ) or ( selector, types [, fn] )
3         return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn );
4     }
  • 最后揭开on的面纱。

参数:

  • types 事件类型
  • selector 委托中是子元素。(曾经的one中貌似没有这个参数)
  • data 参数
  • fn  事件处理函数
  • one  是否one绑定

 1 on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
 2         var origFn, type;
 3
 4         // Types can be a map of types/handlers
 5         if ( typeof types === "object" ) {
 6             // ( types-Object, selector, data )
 7             if ( typeof selector !== "string" ) {
 8                 // ( types-Object, data )
 9                 data = data || selector;
10                 selector = undefined;
11             }
12             for ( type in types ) {
13                 this.on( type, selector, data, types[ type ], one );
14             }
15             return this;
16         }
17
18         if ( data == null && fn == null ) {
19             // ( types, fn )
20             fn = selector;
21             data = selector = undefined;
22         } else if ( fn == null ) {
23             if ( typeof selector === "string" ) {
24                 // ( types, selector, fn )
25                 fn = data;
26                 data = undefined;
27             } else {
28                 // ( types, data, fn )
29                 fn = data;
30                 data = selector;
31                 selector = undefined;
32             }
33         }
34         if ( fn === false ) {
35             fn = returnFalse;
36         } else if ( !fn ) {
37             return this;
38         }
39
40         if ( one === 1 ) {
41             origFn = fn;
42             fn = function( event ) {
43                 // Can use an empty set, since event contains the info
44                 jQuery().off( event );
45                 return origFn.apply( this, arguments );
46             };
47             // Use same guid so caller can remove using origFn
48             fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
49         }
50         return this.each( function() {
51             jQuery.event.add( this, types, fn, data, selector );
52         });
53     }

on

对应解绑off

 1 off: function( types, selector, fn ) {
 2         var handleObj, type;
 3         if ( types && types.preventDefault && types.handleObj ) {
 4             // ( event )  dispatched jQuery.Event
 5             handleObj = types.handleObj;
 6             jQuery( types.delegateTarget ).off(
 7                 handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
 8                 handleObj.selector,
 9                 handleObj.handler
10             );
11             return this;
12         }
13         if ( typeof types === "object" ) {
14             // ( types-object [, selector] )
15             for ( type in types ) {
16                 this.off( type, selector, types[ type ] );
17             }
18             return this;
19         }
20         if ( selector === false || typeof selector === "function" ) {
21             // ( types [, fn] )
22             fn = selector;
23             selector = undefined;
24         }
25         if ( fn === false ) {
26             fn = returnFalse;
27         }
28         return this.each(function() {
29             jQuery.event.remove( this, types, fn, selector );
30         });
31     },

off

时间: 2024-09-30 11:42:09

jQuery挖源码——事件绑定的相关文章

【深入浅出jQuery】源码浅析2--奇技淫巧

最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐进增强)优雅的处理能力以及 Ajax 等方面周到而强大的定制功能无不令人惊叹. 另外,阅读源码让我接触到了大量底层的知识.对原生JS .框架设计.代码优化有了全新的认识,接下来将会写一系列关于 jQuery 解析的文章. 我在 github 上关于 jQuery 源码的全文注解,感兴趣的可以围观一下

模拟jQuery底层源码的链式调用和常用的$()方法的实现

最近在看jQuery框架的源码,感觉还是学到不少东西的,所以就想总结一下自己的知识,和广大的前端爱好者一起 交流一下,我下面所说的并不是直接对jQuery的源码来解读,我是模拟一下jQuery底层源码的链式调用大概是怎么 实现的和常用的$功能是怎么实现的.好了废话不多说了.你要看这个,你就要对jQuery有一定的了解,最起码你要用过jQuery.首先看下jQuery的源码开始是怎么写的 (function( window, undefined){    })(window);它的代码就是被这个块

jQuery选择器源码分析和easyui核心分析

写在选择器源码分析之前 这里指对1.7.2版本的源码分析,更高版本添加了更多代码. 整个jQuery的代码是写在一个(function(window, undefined){})(window);这样一个闭包里.请思考,为什么要这样做? 将其写在一个闭包函数里,并传入window直接运行的好处有三: 1,统一命名空间,防止变量的污染:  2,将window作为参数传入函数,在函数里调用window的时候,就不用再去找外层的对象,可以提高效率 : 3,undefined并不是javascript的

jQuery.attributes源码分析(attr/prop/val/class)

回顾 有了之前的几篇对于jQuery.attributes相关的研究,是时候分析jQuery.attr的源码了 Javascript中的attribute和property分析 attribute和property兼容性分析 jQuery.access源码分析 结构 jQuery.fn.extend({ attr: function (name, value) { }, removeAttr: function (name) { }, prop: function (name, value) {

自写图片遮罩层放大功能jquery插件源码,photobox.js 1.0版,不兼容IE6

阿嚏~~~ 话说本屌丝没啥开发插件的经验,但是天公不作美,公司需要让我自己开发个图片放大的插件 但公司老大的话,犹如吾皇之圣旨,微臣必当肝脑涂地,莫敢不从啊~~~ 于是乎,作为一个超级小白,本人只能瞎研究了,幸好黑天不负屌丝人,本屌丝终于搞出来了,虽然不尽善尽美,但是功能还是可以用的啦 先附上源码,求各种大神指导: /******************************* * photobox跨浏览器兼容插件 v1.0(不支持IE6) * 格式:<a href="big.jpg&q

jQuery.access源码分析

基本理解 jQuery.attr是jQuery.attr,jQuery.prop,jQuery.css提供底层支持,jQuery里一个比较有特色的地方就是函数的重载, 比如attr,有如下几种重载 $('#box').attr('title') $('#box').attr('title','标题') $('#box').attr({title:'标题',data-menu-toggle:'dropdown'}) $('#box').attr('title',function () {....}

jQuery方法源码解析--jQuery($)方法(一)

jQuery方法源码解析--jQuery($)方法 注: 1.本文分析的代码为jQuery.1.11.1版本,在官网上下载未压缩版即可 2.转载请注明出处 jQuery方法: 这个方法大家都不陌生,在使用过程中,它还有另外一个名字,美元符号:$,$(...)其实就是jQuery(...); 它有很多种用法,通常都返回一个jquery对象,也可以作为$(document).ready(...);的简写形式,分析之前先看一下jQuery都有什么用法. 1.jQuery( selector [, co

jquery 新建的元素事件绑定问题[转]

原文:http://www.cnblogs.com/linzheng/archive/2010/10/17/1853568.html js的事件监听跟css不一样,css只要设定好了样式,不论是原来就有的还是新添加的,都有一样的表现.而事件监听不是,你必须给每一个元素单独绑定事件. 常见的例子是处理表格的时候.每行行末有个删除按钮,点了这个能够删除这一行. <table>    <tbody>        <tr>            <td>这行原来就

【深入浅出jQuery】源码浅析--整体架构(转)

最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐进增强)优雅的处理能力以及 Ajax 等方面周到而强大的定制功能无不令人惊叹. 另外,阅读源码让我接触到了大量底层的知识.对原生JS .框架设计.代码优化有了全新的认识,接下来将会写一系列关于 jQuery 解析的文章. 我在 github 上关于 jQuery 源码的全文注解,感兴趣的可以围观一下