读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 相关文章推荐
跟随鼠标旋转的文字
Nov 30 Javascript
利用腾讯的ip地址库做ip物理地址定位
Jul 24 Javascript
javascript 运算数的求值顺序
Aug 23 Javascript
深入理解MVC中的时间js格式化
May 19 Javascript
JS中script标签defer和async属性的区别详解
Aug 12 Javascript
详解ES6语法之可迭代协议和迭代器协议
Jan 13 Javascript
vue2 设置router-view默认路径的实例
Sep 20 Javascript
vue如何获取自定义元素属性参数值的方法
May 14 Javascript
详解Vue后台管理系统开发日常总结(组件PageHeader)
Nov 01 Javascript
jQuery实现滑动星星评分效果(每日分享)
Nov 13 jQuery
详解vue 组件
Jun 11 Javascript
JavaScript实现优先级队列
Dec 06 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
某大型网络公司应聘时的笔试题目附答案
2008/03/27 PHP
php adodb连接不同数据库
2009/03/19 PHP
PHP生成随机密码类分享
2014/06/25 PHP
修改PHP脚本使WordPress拦截垃圾评论的方法示例
2015/12/10 PHP
windows7配置Nginx+php+mysql的详细教程
2016/09/04 PHP
laravel解决迁移文件一次删除创建字段报错的问题
2019/10/24 PHP
原生Js实现元素渐隐/渐现(原理为修改元素的css透明度)
2013/06/24 Javascript
jQuery javaScript捕获回车事件(示例代码)
2013/11/07 Javascript
项目实践一图片上传之form表单还是base64前端图片压缩(前端图片压缩)
2016/07/28 Javascript
JS获取本周周一,周末及获取任意时间的周一周末功能示例
2017/02/09 Javascript
js 转义字符及URI编码详解
2017/02/28 Javascript
Bootstrap 模态框多次显示后台提交多次BUG的解决方法
2017/12/26 Javascript
javascript高仿热血传奇游戏实现代码
2018/02/22 Javascript
Vue中如何实现proxy代理
2018/04/20 Javascript
webstorm和.vue中es6语法报错的解决方法
2018/05/08 Javascript
浅谈webpack-dev-server的配置和使用
2018/05/17 Javascript
Vue中登录验证成功后保存token,并每次请求携带并验证token操作
2020/09/08 Javascript
jdk1.8+vue elementui实现多级菜单功能
2020/09/24 Javascript
原生js实现点击按钮复制内容到剪切板
2020/11/19 Javascript
Python实现抓取页面上链接的简单爬虫分享
2015/01/21 Python
Python一行代码实现快速排序的方法
2019/04/30 Python
python读写csv文件并增加行列的实例代码
2019/08/01 Python
Python类中的魔法方法之 __slots__原理解析
2019/08/26 Python
python子线程退出及线程退出控制的代码
2019/10/16 Python
Python绘制动态水球图过程详解
2020/06/03 Python
python 实现图像快速替换某种颜色
2020/06/04 Python
让IE支持HTML5的方法
2012/12/11 HTML / CSS
法国太阳镜店:Sunglasses Shop
2016/08/27 全球购物
俄罗斯茶和咖啡网上商店:Tea.ru
2021/01/26 全球购物
网络安全方面的面试题
2016/01/07 面试题
大二法学专业职业生涯规划范文
2014/02/12 职场文书
庆元旦演讲稿
2014/09/15 职场文书
解除劳动合同通知书范本
2015/04/16 职场文书
主题班会开场白
2015/06/01 职场文书
建国大业电影观后感
2015/06/01 职场文书
漂亮妈妈观后感
2015/06/08 职场文书