读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编程起步(第二课)
Jan 10 Javascript
jQuery版仿Path菜单效果
Dec 15 Javascript
绑定回车enter事件代码
May 18 Javascript
jQuery模拟新浪微博首页滚动效果的方法
Mar 11 Javascript
初识Node.js
Mar 20 Javascript
原生js实现的贪吃蛇网页版游戏完整实例
May 18 Javascript
js实现点击获取验证码倒计时效果
Jan 28 Javascript
vue 简单自动补全的输入框的示例
Mar 12 Javascript
jQuery实现根据身份证号获取生日、年龄、性别等信息的方法
Jan 09 jQuery
Vue 组件修改根实例的数据的方法
Apr 02 Javascript
react 中父组件与子组件双向绑定问题
May 20 Javascript
JavaScript进制转换实现方法解析
Jan 18 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
Terran兵种对照表
2020/03/14 星际争霸
mantis安装、配置和使用中的问题小结
2014/07/14 PHP
PHP原生函数一定好吗?
2014/12/08 PHP
PHP+MySQL高并发加锁事务处理问题解决方法
2018/04/30 PHP
JavaScript 事件查询综合
2009/07/13 Javascript
Extjs EditorGridPanel中ComboBox列的显示问题
2011/07/04 Javascript
JavaScript 用cloneNode方法克隆节点的代码
2012/10/15 Javascript
javascript数组去重3种方法的性能测试与比较
2013/03/26 Javascript
JS图片切换的具体方法(带缩略图版)
2013/11/12 Javascript
不使用ajax实现无刷新提交表单
2014/12/21 Javascript
javascript中cookie对象用法实例分析
2015/01/30 Javascript
轻松实现javascript图片轮播特效
2016/01/13 Javascript
JS判断浏览器是否安装flash插件的简单方法
2016/09/13 Javascript
详解jquery easyui之datagrid使用参考
2016/12/05 Javascript
vue.js+Element实现表格里的增删改查
2017/01/18 Javascript
详解vuejs几种不同组件(页面)间传值的方式
2017/06/01 Javascript
Vue+Element使用富文本编辑器的示例代码
2017/08/14 Javascript
bootstrap-table实现服务器分页的示例 (spring 后台)
2017/09/01 Javascript
Vue.js最佳实践(五招助你成为vuejs大师)
2018/05/04 Javascript
CentOS7中源码编译安装NodeJS的完整步骤
2018/10/13 NodeJs
Vue 页面状态保持页面间数据传输的一种方法(推荐)
2018/11/01 Javascript
详解利用nodejs对本地json文件进行增删改查
2019/09/20 NodeJs
微信小程序地图绘制线段并且测量(实例代码)
2020/01/02 Javascript
在Python的Django框架中更新数据库数据的方法
2015/07/17 Python
window下eclipse安装python插件教程
2017/04/24 Python
Django框架使用富文本编辑器Uedit的方法分析
2018/07/31 Python
Python实现数值积分方式
2019/11/20 Python
Python中顺序表原理与实现方法详解
2019/12/03 Python
python实现百度OCR图片识别过程解析
2020/01/17 Python
收藏!10个免费高清视频素材网站!【设计、视频剪辑必备】
2021/03/18 杂记
法国在线药房:DoctiPharma
2020/10/21 全球购物
校长四风对照检查材料
2014/09/27 职场文书
查摆问题自查报告范文
2014/10/13 职场文书
导游词之五台山
2019/10/11 职场文书
教你怎么用Python实现GIF动图的提取及合成
2021/06/15 Python
Win11黑色桌面背景怎么办?Win11黑色壁纸解决方法汇总
2022/04/05 数码科技