读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 相关文章推荐
常用js脚本
Dec 03 Javascript
JavaScript语言核心数据类型和变量使用介绍
Aug 23 Javascript
经过绑定元素时会多次触发mouseover和mouseout事件
Feb 28 Javascript
jQuery实现瀑布流布局详解(PC和移动端)
Sep 01 Javascript
详解javascript函数的参数
Nov 10 Javascript
如何理解Vue的render函数的具体用法
Aug 30 Javascript
微信小程序之数据缓存的实例详解
Sep 29 Javascript
vue组件父子间通信之综合练习(聊天室)
Nov 07 Javascript
VUE2.0中Jsonp的使用方法
May 22 Javascript
js+html5实现手机九宫格密码解锁功能
Jul 30 Javascript
基于layui内置模块(element常用元素的操作)
Sep 20 Javascript
vue移动端模态框(可传参)的实现
Nov 20 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
弄了个检测传输的参数是否为数字的Function
2006/12/06 PHP
php 计算两个时间戳相隔的时间的函数(小时)
2009/12/18 PHP
为PHP安装imagick时出现Cannot locate header file MagickWand.h错误的解决方法
2014/11/03 PHP
分享最受欢迎的5款PHP框架
2014/11/27 PHP
php中get_cfg_var()和ini_get()的用法及区别
2015/03/04 PHP
PHP框架实现WebSocket在线聊天通讯系统
2019/11/21 PHP
Add a Table to a Word Document
2007/06/15 Javascript
Flash+XML滚动新闻代码 无图片 附源码下载
2007/11/22 Javascript
JavaScript 事件记录使用说明
2009/10/20 Javascript
Javascript Math ceil()、floor()、round()三个函数的区别
2010/03/09 Javascript
一个简单的js动画效果代码
2010/07/20 Javascript
js图片上传前预览功能(兼容所有浏览器)
2016/08/24 Javascript
AngularJS动态生成div的ID源码解析
2016/08/29 Javascript
微信小程序 图片加载(本地,网路)实例详解
2017/03/10 Javascript
Angular4学习之Angular CLI的安装与使用教程
2018/01/04 Javascript
基于Vue、Vuex、Vue-router实现的购物商城(原生切换动画)效果
2018/01/09 Javascript
详解vue为什么要求组件模板只能有一个根元素
2019/07/22 Javascript
小程序实现左滑删除效果
2019/07/25 Javascript
js面向对象之实现淘宝放大镜
2020/01/15 Javascript
js cavans实现静态滚动弹幕
2020/05/21 Javascript
python删除指定类型(或非指定)的文件实例详解
2015/07/06 Python
Python ldap实现登录实例代码
2016/09/30 Python
Python实现对象转换为xml的方法示例
2017/06/08 Python
python实现简易动态时钟
2018/11/19 Python
Python-opencv 双线性插值实例
2020/01/17 Python
numpy中生成随机数的几种常用函数(小结)
2020/08/18 Python
python 获取域名到期时间的方法步骤
2021/02/10 Python
HTML5 解决苹果手机不能自动播放音乐问题
2017/12/27 HTML / CSS
John Varvatos官方网站:设计师男士时装
2017/02/08 全球购物
this关键字的作用
2016/01/30 面试题
创伤外科专业推荐信范文
2013/11/19 职场文书
珍惜时间演讲稿
2014/05/14 职场文书
党员剖析材料范文
2014/09/30 职场文书
离婚财产分配协议书
2014/10/21 职场文书
消费者投诉书范文
2015/07/02 职场文书
总结三种用 Python 作为小程序后端的方式
2022/05/02 Python