读jQuery之十二 删除事件核心方法


Posted in Javascript onJuly 31, 2011

读jQuery之十二 删除事件核心方法

.remove 所作的事情与上一篇提到的.add 刚好相反。且与.add中的处理代码一一对应,即  .add 中有多少种添加事件的方式.remove就有对应的删除方式。

.remove 定义了四个参数 elem, types, handler, pos 。从字面上看四个参数的意义很明了

elem 为HTMLElement

types 为String类型,事件名称如'click'或'mouseover mouseout'  

handler 为Function类型,事件回调函数

pos 为Number类型,指定数组位置

但.remove内部没这么简单,如
1,handler 有时会传布尔类型false,这时会把handler赋值为另一个函数(此处的处理同.add)。

if ( handler === false ) { 
handler = returnFalse; 
}

2, types 有时会为一个对象,这时真正的handler是types.handler,types是types.type。
// types is actually an event object here 
if ( types && types.type ) { 
handler = types.handler; 
types = types.type; 
}

我们知道变量命名要具有意义,名副其实而避免误导。从这个意义上讲,jQuery中存在大量这样的写法,一个变量往往具有多种含义,晦涩难读。如这里的types,应该是String类型,但实际内部对typeos为Object类型也做了处理。这是JS没有类型检查的原因导致。反过来讲这种语言会比较灵活,jQuery才如此 紧凑,内聚。
闲言少叙,看看.remove方法都做了哪些事。
1、当只传elem时,会将elem上添加的所有事件都删除。如$('#id').unbind()
2、当types为String,且以点号(.)开头时将删除该命名空间下的事件。如$('#id').unbind('.name')。会把添加click.name,mouseover.name等都删除。
对应的代码如下
// Unbind all events for the element 
if ( !types || typeof types === "string" && types.charAt(0) === "." ) { 
types = types || ""; 
for ( type in events ) { 
jQuery.event.remove( elem, type + types ); 
} 
return; 
}

我们发现for in中是个递归调用。
如果这么调用
jQuery.event.remove(el, 'click', fn)
那么是不会走上面的递归的,而是直接进入了while循环
while ( (type = types[ i++ ]) ) { 
... 
}

这是标准的删除事件的流程。大概步骤如下
1、判断事件名称是否具有命名空间(以点号区分),如果没有命名空间则删除该事件名称下的所有事件。否则只删除命名空间的某事件。
2、取得事件数组(eventType = events[ type ]),如果没有传handler则表示删除该类型事件的所有hanlder,否则只删除该事件类型的指定handler。
3、对特殊事件(如live)的处理
4、最后对elemData进行处理,如果events为空对象则删除elemData的events和handle属性。如
// Remove the expando if it's no longer used 
if ( jQuery.isEmptyObject( events ) ) { 
var handle = elemData.handle; 
if ( handle ) { 
handle.elem = null; 
} 
delete elemData.events; 
delete elemData.handle; 
if ( jQuery.isEmptyObject( elemData ) ) { 
jQuery.removeData( elem, undefined, true ); 
} 
}

jQuery事件管理数据结构图:

读jQuery之十二 删除事件核心方法

Javascript 相关文章推荐
学习YUI.Ext 第三天
Mar 10 Javascript
JS通过ajax动态读取xml文件内容的方法
Mar 24 Javascript
js实现类似jquery里animate动画效果的方法
Apr 10 Javascript
js库Modernizr的介绍和使用
May 07 Javascript
js 转json格式的字符串为对象或数组(前后台)的方法
Nov 02 Javascript
用户管理的设计_jquery的ajax实现二级联动效果
Jul 13 jQuery
vuejs项目打包之后的首屏加载优化及打包之后出现的问题
Apr 01 Javascript
jquery实现进度条状态展示
Mar 26 jQuery
小程序实现可拖动的悬浮按钮
Sep 07 Javascript
Ant Design Vue table中列超长显示...并加提示语的实例
Oct 31 Javascript
js异步接口并发数量控制的方法示例
Nov 22 Javascript
Vue接口封装的完整步骤记录
May 14 Vue.js
读jQuery之十一 添加事件核心方法
Jul 31 #Javascript
仅Firefox中链接A无法实现模拟点击以触发其默认行为
Jul 31 #Javascript
各浏览器对click方法的支持差异小结
Jul 31 #Javascript
js中将HTMLCollection/NodeList/伪数组转换成数组的代码
Jul 31 #Javascript
对象无length属性时IE6/IE7中无法将其转换成伪数组(ArrayLike)
Jul 31 #Javascript
javascript中length属性的探索
Jul 31 #Javascript
javascript string字符串优化问题
Jul 31 #Javascript
You might like
一个oracle+PHP的查询的例子
2006/10/09 PHP
多重?l件?合查?(二)
2006/10/09 PHP
php面向对象中static静态属性和静态方法的调用
2015/02/08 PHP
php header函数的常用http头设置
2015/06/25 PHP
PHP数组式访问接口ArrayAccess用法分析
2017/12/28 PHP
php利用ob_start()清除输出和选择性输出的方法
2018/01/18 PHP
js判断undefined类型,undefined,null, 的区别详细解析
2013/12/16 Javascript
js实现图片拖动改变顺序附图
2014/05/13 Javascript
浅谈jquery事件处理
2015/04/24 Javascript
js实现Select列表各项上移和下移的方法
2015/08/14 Javascript
jquery插件ContextMenu设置右键菜单
2017/03/13 Javascript
Vue引用第三方datepicker插件无法监听datepicker输入框的值的解决
2018/01/27 Javascript
基于jQuery实现无缝轮播与左右点击效果
2018/05/13 jQuery
react 父子组件之间通讯props
2018/09/08 Javascript
怎么使用javascript深度拷贝一个数组
2019/06/06 Javascript
微信小程序制作扭蛋机代码实例
2019/09/24 Javascript
vue resource发送请求的几种方式
2019/09/30 Javascript
vue 父组件通过$refs获取子组件的值和方法详解
2019/11/07 Javascript
[37:45]完美世界DOTA2联赛PWL S3 LBZS vs Phoenix 第二场 12.09
2020/12/11 DOTA
JSON文件及Python对JSON文件的读写操作
2018/10/07 Python
Anaconda+VSCode配置tensorflow开发环境的教程详解
2020/03/30 Python
parser.add_argument中的action使用
2020/04/20 Python
python logging 重复写日志问题解决办法详解
2020/08/04 Python
纯CSS实现菜单、导航栏的3D翻转动画效果
2014/04/23 HTML / CSS
利用CSS3实现单选框动画特效示例代码
2016/09/26 HTML / CSS
Gerry Weber德国官网:优质女性时装,德国最大的时装公司之一
2019/11/02 全球购物
ruby如何进行集成操作?Ruby能进行多重继承吗?
2013/10/16 面试题
农场厂长岗位职责
2013/12/28 职场文书
职业生涯规划书基本格式
2014/01/06 职场文书
房地产公司见习自我鉴定
2014/04/28 职场文书
四风问题党员个人整改措施
2014/10/27 职场文书
地方课程教学计划
2015/01/19 职场文书
党员违纪检讨书
2015/05/05 职场文书
python中的被动信息搜集
2021/04/29 Python
常用的Python代码调试工具总结
2021/06/23 Python
JavaScript组合继承详解
2021/11/07 Javascript