读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 相关文章推荐
关于eval 与new Function 到底该选哪个?
Apr 17 Javascript
使用jquery实现div的tab切换实例代码
May 27 Javascript
document.documentElement和document.body区别介绍
Sep 16 Javascript
javascript浏览器窗口之间传递数据的方法
Jan 20 Javascript
javascript中JSON.parse()与eval()解析json的区别
May 19 Javascript
JS简单实现DIV相对于浏览器固定位置不变的方法
Jun 17 Javascript
原生JS封装ajax 传json,str,excel文件上传提交表单(推荐)
Jun 21 Javascript
js实现悬浮窗效果(支持拖动)
Mar 09 Javascript
JS实现元素上下左右移动效果
Oct 18 Javascript
详解js中Array的方法及技巧
Sep 12 Javascript
jquery实现上传文件进度条
Mar 26 jQuery
vue中el-input绑定键盘按键(按键修饰符)
Jul 22 Javascript
读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
Zerg基本策略
2020/03/14 星际争霸
php数组函数序列之end() - 移动数组内部指针到最后一个元素,并返回该元素的值
2011/10/31 PHP
2014过年倒计时示例
2014/01/31 PHP
学习ExtJS form布局
2009/10/08 Javascript
javascript中apply、call和bind的使用区别
2016/04/05 Javascript
JS中的hasOwnProperty()和isPrototypeOf()属性实例详解
2016/08/11 Javascript
jquery操作checkbox火狐下第二次无法勾选的解决方法
2016/10/10 Javascript
可输入文字查找ajax下拉框控件 ComBox的实现方法
2016/10/25 Javascript
教大家轻松制作Bootstrap漂亮表格(table)
2016/12/13 Javascript
BootStrap整体框架之基础布局组件
2016/12/15 Javascript
Angularjs 双向绑定时字符串的转换成数字类型的问题
2017/06/12 Javascript
BootStrap点击保存后实现模态框自动关闭的思路(模态框)
2017/09/26 Javascript
Vue 2.0学习笔记之Vue中的computed属性
2017/10/16 Javascript
JS表单传值和URL编码转换
2018/03/03 Javascript
Node.js console控制台简单用法分析
2019/01/04 Javascript
用node.js写一个jenkins发版脚本
2019/05/21 Javascript
vue路由切换之淡入淡出的简单实现
2019/10/31 Javascript
[01:05:56]Liquid vs VP Supermajor决赛 BO 第二场 6.10
2018/07/04 DOTA
Python getopt模块处理命令行选项实例
2014/05/13 Python
使用基于Python的Tornado框架的HTTP客户端的教程
2015/04/24 Python
python基础练习之几个简单的游戏
2017/11/10 Python
对pandas中to_dict的用法详解
2018/06/05 Python
对Python3中bytes和HexStr之间的转换详解
2018/12/04 Python
python selenium循环登陆网站的实现
2019/11/04 Python
python3.x 生成3维随机数组实例
2019/11/28 Python
python爬虫用mongodb的理由
2020/07/28 Python
Python 程序员必须掌握的日志记录
2020/08/17 Python
Python基于Serializer实现字段验证及序列化
2020/11/04 Python
HTML5实现的震撼3D焦点图动画的示例代码
2019/09/26 HTML / CSS
Html5页面上如何禁止手机虚拟键盘弹出
2020/03/19 HTML / CSS
销售人员个人求职信
2013/09/26 职场文书
毕业生就业自荐信
2013/12/04 职场文书
新品发布会策划方案
2014/06/08 职场文书
妇联领导班子剖析材料
2014/08/21 职场文书
高一课前三分钟演讲稿
2014/09/13 职场文书
2014年药房工作总结
2014/11/22 职场文书