读jQuery之十二(删除事件核心方法)

使用jQuery删除事件(或称解除事件绑定)有三个函数:unbind、die和undelegate。这三个方法都依赖于未公开的jQuery.event.remove(后续使用remove简写)。此为删除事件的核心方法。

 

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事件管理数据结构图:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/267691.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

像Excel一样使用python进行数据分析(1)

(虽然是转载,但是是我每块都测试过得,容易出问题的地方我会添加一些自己的经验,仅供参考) 像Excel一样使用python进行数据分析(2) 像Excel一样使用python进行数据分析(3)…

Xshell配置ssh免密码登录-密钥公钥(Public key)

1 简介 ssh登录提供两种认证方式:口令(密码)认证方式和密钥认证方式。其中口令(密码)认证方式是我们最常用的一种,这里介绍密钥认证方式登录到linux/unix的方法。 使用密钥登录分为3步: 1、生成密钥(公钥与私钥)&#…

linux vim ctags,Linux环境上代码阅读与编写的利器-vim+ctags+cscope

Linux环境下代码阅读与编写的利器----vimctagscscope所谓工欲善其事,必先利其器。从事Linux程序开发,特别是Linux驱动程序的开发,不管是通过windows下虚拟一个Linux,还是通过samba访问Linux都是很郁闷的事情。原因就是程序本身需要Linux的编译…

oracle vm中的xp添加共享文件夹

接着就可以在虚拟的电脑系统里面打开我们的共享文件夹,在桌面找到”网络邻居“,双击打开 我们需要通过”添加一个网络邻居“来加载我们刚才添加的”共享文件夹“,根据向导一步步执行 然后点击”浏览“ 展开前面的 ”“ visualBox shared fold…

MSBuild + MSILInect实现编译时AOP-改变前后对比

实现静态AOP,就需要我们在预编译时期,修改IL实现对代码逻辑的修改。Mono.Cecil就是一个很好的IL解析和注入框架,参见编译时MSIL注入--实践Mono Cecil(1)。 我的思路为:在编译时将加有继承制MethodInterceptBaseAttribute标签的原方…

惊人体积,无码改造,黑月V1.7.4增强版[20110810]

使用方法:替换 易语言 LIB目录下的黑月支持库 记得备份 去掉代码长度过少不能编译的限制.(比如空代码) 优化编译出来的文件体积大小.(exe貌似没问题,dll貌似也没问题,就是dll对体积的优化不会太多) 体积减少了N倍...不解释,不解释,高手懂得... 转载于:https://blog.51cto.com…

linux stm32 ide,一文教你如何在ubuntu上快速搭建STM32 CubeIDE环境(图文超详细+文末有附件)...

在快速ubuntu上安装cubeide你值得拥有;适合对linux系统还不是很熟悉的同学;1 下载 cubeide登陆官网,下载链接不知道是否有效,如果无效,需要提交自己的邮箱地址,ST官方会将下载链接发送至你的邮箱&#xff0…

思科(Cisco)路由器策略路由配置详解

策略路由是路由优化的常用方法。在做路由牵引时很多情况都要用到策略路由。 网络拓扑 R2的E1\E2口分别与R3的E1\E2口相连。 先配置好静态路由&#xff0c;使192.168.2.X与192.168.1.X互通(不经过R3)。即R1<->R2<->R4是互通的。 下面介绍一下配置策略路由的方法。 实…

python numpy中sum()时出现负值

import numpy anumpy.random.randint(1, 4095, (5000,5000)) a.sum() 结果为负值, 这是错误的&#xff0c;a.sum()的类型为 int32&#xff0c;如何做才能是结果显示正确呢&#xff1f;按照如下做法&#xff1a; cnumpy.int64(a).sum() 结果为正直&#xff0c;正确&#xff0c;c…

SQL Server插入中文数据出现乱码问题

问题如上图。 创建数据库的代码---创建promary表 create table promary ( proID int primary key, proName varchar(50) not null ) 出现上图所示内容是因为proName varchar(50) not null这个地方有问题。一般来说&#xff0c;如果含有中文字符&#xff0c;用nchar/nvarchar&…

c语言find和mid函数的使用方法,Excel Mid函数和MidB函数使用方法的7个实例,含与Len和Find组合反向提取字符或截取单位...

在 Excel 中&#xff0c;Mid函数用于从文本中提取从指定位置开始的指定字符数&#xff0c;而MidB函数用于从文本中提取从指定位置开始的指定字节数&#xff1b;它们的区别为&#xff1a;前者把全角(如汉字)与半角(如数字和字母)都算作一个字符&#xff0c;后者把全角算作两个字…

C++类指针类型的成员变量的浅复制与深复制

本篇文章旨在阐述C类的构造&#xff0c;拷贝构造&#xff0c;析构机制&#xff0c;以及指针成员变量指针悬空问题的解决。需要读者有较好的C基础&#xff0c;熟悉引用&#xff0c;const的相关知识。 引言&#xff1a; 类作为C语言的一种数据类型&#xff0c;是对C语言结构体的一…

21天学通c语言第四版pdf,21天学通Visual C++ PDF扫描版[116MB]

21天学通Visual C 内容简介&#xff1a;本书是Visual C语言的入门教程&#xff0c;较全面地介绍了Visual C编程的相关知识&#xff0c;然而&#xff0c;本书并没有泛讲Visual C语言的所有知识&#xff0c;而是突出重点&#xff0c;选择最重要的内容进行讲解。本书一共分为五篇&…

继续聊WPF——动态数据模板

我为啥称之为“动态数据模板”&#xff1f;先看看下面的截图&#xff0c;今天&#xff0c;我们就是要实现这种功能。 大概是这样的&#xff0c;我们定义的DataTemplate是通过触发器动态应用到 ComboBoxItem 上。 这个下拉列表控件绑定了一个Person集合&#xff0c;Person类的定…

刺激战场c语言,刺激战场:假车库、C字楼都是啥?学会吃鸡术语新手变大神!...

原标题&#xff1a;刺激战场&#xff1a;假车库、C字楼都是啥&#xff1f;学会吃鸡术语新手变大神&#xff01;刺激战场有越来越多的新玩家加入其中&#xff0c;然而新手想入门&#xff0c;却有时候找不对方法&#xff0c;其实吃鸡这个游戏其实还是非常简单的&#xff0c;不过想…

HTMLParser-实战

了解了HTMLParser库的知识后&#xff0c;选择做一个小训练&#xff0c;对https://www.python.org/events/python-events/这个网址进行分析&#xff0c;之后输出其中每次会议的题目、时间和地点。 如果要简单了解下HTMLParser库可以点击打开 下面进入正题 这是网站的源码&#x…

c++2015语言,2015年7月TIOBE编程语言排行榜:C++ 的复兴

2015年7月TIOBE编程语言排行榜&#xff1a;C 的复兴C是2015年上半年同比增长最快的编程语言。具体为C 增长3.1%&#xff0c;Java 增长2.0%&#xff0c;C#增长1.6%&#xff0c;Python增长1.6%。C大幅度增长的原因可能是引入了新的C11标准。这使得C被大范围的接受。C 11标准为C带…

android抽奖动画,Android App中实现简单的刮刮卡抽奖效果的实例详解

主要思想&#xff1a;将一个view设计成多层&#xff1a;背景层&#xff0c;含中奖信息等&#xff1b;遮盖层&#xff0c;用于刮奖&#xff0c;使用关联一个Bitmap的Canvas在该Bitmap上&#xff0c;使用它的canvas.drawPath的api来处理 手势滑动(类似刮奖的动作)使用paint.setXf…

如何提高英语听力(内容摘自NECCS)+ 乘法表

乘法表 print(\n.join([ .join([%s*%s%-2s%(y,x,x*y) for y in range(1,x1)]) for x in range(1,10)])) 如何提高英语听力 很喜欢这篇关于提高英语听力的文章&#xff0c;所以收藏下来和大家一同分享一下 人走路时要用两条腿&#xff0c;没有任何人会觉得走路费劲。可如果让人…

android新拟态实现方法,Android 新拟态UI (Neumorphism)

前言本文转自github&#xff0c;只是进行了图片的处理和部分翻译&#xff0c;已获作者授权截至首次发文前找到的原作者的文章地址-May,17,2020若找到本文章更新的时间节点&#xff0c;请私信我更新。原作者github地址文末附源码下载地址&#xff0c;免费。Android上的拟态化UIT…