读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 相关文章推荐
JavaScript中的变量声明早于赋值分析
Mar 01 Javascript
JavaScript 语言基础知识点总结(思维导图)
Nov 10 Javascript
jsPDF导出pdf示例
May 02 Javascript
JavaScript中的Function函数
Aug 27 Javascript
jquery.mousewheel实现整屏翻屏效果
Aug 30 Javascript
简介EasyUI datagrid editor combogrid搜索框的实现
Apr 01 Javascript
Node.js插件安装图文教程
May 06 Javascript
深入理解JavaScript中的对象复制(Object Clone)
May 18 Javascript
Bootstrap树形菜单插件TreeView.js使用方法详解
Nov 01 Javascript
JS实现点击按钮可实现编辑功能
Jul 03 Javascript
解决angular 使用原生拖拽页面卡顿及表单控件输入延迟问题
Apr 21 Javascript
使用vue构建多页面应用的示例
Oct 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
其他功能
2006/10/09 PHP
php下将多个数组合并成一个数组的方法与实例代码
2011/02/03 PHP
PHP采集利器 Snoopy 试用心得
2011/07/03 PHP
PHP实现对站点内容外部链接的过滤方法
2014/09/10 PHP
HTML中嵌入PHP的简单方法
2016/02/16 PHP
Thinkphp自定义代码生成工具及用法说明(附下载地址)
2016/05/27 PHP
Yii2增删改查之查询 where参数详细介绍
2016/08/08 PHP
PHP实现的多进程控制demo示例
2019/07/22 PHP
给jqGrid数据行添加修改和删除操作链接(之一)
2011/11/04 Javascript
jquery选择器的选择使用及性能介绍
2013/01/16 Javascript
JavaScript中的值类型转换介绍
2014/12/31 Javascript
JavaScript中字符串拼接的基本方法
2015/07/07 Javascript
jquery实现超简洁的TAB选项卡效果代码
2015/08/28 Javascript
javascript中eval和with用法实例总结
2015/11/30 Javascript
AngularJS基础 ng-cut 指令介绍及简单示例
2016/08/01 Javascript
几种二级联动案例(jQuery\Array\Ajax php)
2016/08/13 Javascript
基于JavaScript实现鼠标箭头移动图片跟着移动
2016/08/30 Javascript
基于AngularJS前端云组件最佳实践
2016/10/20 Javascript
微信小程序 Windows2008 R2服务器配置TLS1.2方法
2016/12/05 Javascript
使用原生js写ajax实例(推荐)
2017/05/31 Javascript
动态Axios的配置步骤详解
2018/01/12 Javascript
vue中上传视频或图片或图片和文字一起到后端的解决方法
2019/12/01 Javascript
Python Trie树实现字典排序
2014/03/28 Python
python中黄金分割法实现方法
2015/05/06 Python
深入理解NumPy简明教程---数组3(组合)
2016/12/17 Python
Python自定义函数实现求两个数最大公约数、最小公倍数示例
2018/05/21 Python
基于python3实现socket文件传输和校验
2018/07/28 Python
CSS3线性渐变简单实现以及该属性在浏览器中的不同
2012/12/12 HTML / CSS
详解CSS3浏览器兼容
2016/12/14 HTML / CSS
浅析CSS3中鲜为人知的属性:-webkit-tap-highlight-color
2017/01/12 HTML / CSS
传统HTML页面实现模块化加载的方法
2018/10/15 HTML / CSS
打印机墨盒:123Inkjets
2017/02/16 全球购物
西雅图的买手店:Totokaelo
2019/10/19 全球购物
TCP协议通讯的过程和步骤是什么
2015/10/18 面试题
护士自我评价
2014/02/01 职场文书
医学院毕业生自荐信范文
2014/03/06 职场文书