Jquery中的事件命名机制
来源:aitangyong的专栏
JQuery中的bind()和unbind(),提供了事件的绑定和取消机制,既可以绑定html默认支持的事件,也能够绑定自定义的事件。JQuery支持自定义事件,这显然给编程带来了极大的灵活性。下面就一起学习下,jquery事件处理的一些特性。
1、JQuery中事件可以重复绑定,不会覆盖。
|
1
2
3
4
5
6
|
$("#button1").bind("click",function(){ alert("func1");});$("#button1").bind("click",function(){ alert("func2");}); |
当点击button1的时候,这2个事件处理函数都会触发。也许你会说,上面绑定的是不同的匿名函数,占用不同的内存空间。的确是这样的,不过就算是同一个处理函数,依然存在重复绑定问题。当button1被点击的时候,下面的事件处理函数同样会被调用2次。
|
1
2
3
4
5
6
7
|
$("#button1").bind("click",sameFunc);$("#button1").bind("click",sameFunc);function sameFunc(){ alert("func");} |
绝大部分场景下,事件处理函数都只需要绑定一次,所以一定要注意JQuery事件的重复绑定这个特性,事件多次执行,就算没有bug,终究也不是好的做法。
2、使用bind一次绑定多个事件和处理函数。
如果多个事件需要注册相同的处理函数,那么可以使用如下代码进行简化(事件名称使用空格分隔):
|
1
2
3
|
$("#button1").bind("mousedown mouseup",function(){ console.log(11);}); |
如果每个事件的处理函数不同,那么可以使用如下的方式(json对象):
|
1
2
3
4
5
6
7
8
9
10
|
$("#button1").bind( { "mousedown":function(){ console.log("mousedown"); }, "mouseup":function(){ console.log("mouseup"); } }); |
3、传递event对象和自定义参数。
一般来说,使用jquery的时候我们很少需要event对象,也不需要向事件处理函数传递自定义的参数。不过如果我们真的需要这么做,JQuery也是支持的。
|
1
2
3
|
$("#button1").bind("click", {name:"aty"}, function(eventObject){ alert("params=" + eventObject.data.name); }); |
eventObject很像IE和FF中的event对象,通过它能够获取事件发生时更详细的信息。如果我们指定了自定义的参数,那么JQuery会将它放在事件对象的data属性中,即通过eventObject.data就能够拿到我们传递的参数值。
4、事件取消的三种形式。
unbind用来取消之前通过bind绑定的事件处理函数,总的来说有三种形式:取消所有事件、取消某种类型的事件、取消某种类型下的某个事件处理函数。
假如我们给button1绑定了click、mouseup、mousedown事件,其中click事件绑定2个处理函数。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
$("#button1").bind("click",function(eventObj){ console.log("click1"); }); $("#button1").bind("click",function(eventObj){ console.log("click2"); }); $("#button1").bind("mouseup",function(eventObj){ console.log("mouseup"); }); $("#button1").bind("mousedown",function(eventObj){ console.log("mousedown"); }); |
$("#button1").unbind():取消button1上所有已经绑定的事件处理函数。
$("#button1").unbind("click"):只取消button1上绑定的click类型的事件处理函数。
这2种形式很好理解,也是我们平时编程最常用的做法。上面的代码我们注册了2个click类型的事件处理函数,如果要取消第2个click事件处理函数,第1个保留,应该怎么办呢?由于我们注册的是匿名函数,所以没有办法实现。下面的代码是错误的,达不到预期的效果。
|
1
2
3
4
5
6
7
8
9
10
11
|
$("#button1").bind("click",function(eventObj){ console.log("click1"); }); $("#button1").bind("click",function(eventObj){ console.log("click2"); }); // try to cancel function2$("#button1").unbind("click",function(eventObj){ console.log("click2"); }); |
虽然bind和unbind是用的匿名函数功能是相同的,但是这2个函数不是同一个javascript对象,因为它们占用不同的内存空间。聪明的你可能已经想到:如果bind和unbind使用不同函数,是不是就能达到目的了?确实是这样,下面的代码是正确的。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
$("#button1").bind("click",func1); $("#button1").bind("click",func2); // try to cancel function2$("#button1").unbind("click",func2); function func1(){ console.log("click1"); }function func2(){ console.log("click2"); } |
这就是unbind的第三种使用形式,可以看到这种做法非常的不好,因为这种做法不允许使用匿名函数,我们不得不暴露全局的函数(至少要求unbind的时候能够看得见)。JQuery提供了事件命名空间机制,个人感觉就是为了解决这个问题。
5、事件命名空间。
上面已经提到,事件命名空间就是为了解决unbind第三种形式遇到的问题。下面是JQuery官方API文档的解释:
Instead of maintaining references to handlers in order to unbind them, we can namespace the events and use this capability to narrow the scope of our unbinding actions.
所谓事件命名空间,其实就是在事件类型后面以点语法附加一个别名,以便引用事件,如”click.a”,其中”a”就是click当前事件类型的别名,即事件命名空间。由于点号是用来定义命名空间的,所以如果我们使用了自定义事件,那么事件名称一定不要包含点号,否则会引起意想不到的问题。这种问题,没有尝试的必要,特殊字符能不用则不用,否则是给自己找麻烦。
|
1
2
3
4
5
6
7
8
9
|
$("#button1").bind("click.a",function(eventObj){ console.log("click1"); }); $("#button1").bind("click.b",function(eventObj){ console.log("click2"); }); // success to cancel function2$("#button1").unbind("click.a"); |
可以看到:使用命名空间,能够以一种更优雅的方式取消某种事件类型下的某个事件处理函数。这里值得一提:使用了命名空间与unbind并不冲突,上面三种形式的unbind依然可以正常使用。$("#button1").unbind()依然可以取消button1上的所有事件,$("#button1").unbind("click")依然可以取消所有的click事件。这种兼容性设计是非常棒的。
使用命名空间还要1个好处:能够按照命名空间来取消事件。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
// 2个命名空间a和b$("#button1").bind("click.a",function(eventObj){ console.log("click1"); }); $("#button1").bind("click.b",function(eventObj){ console.log("click2"); }); $("#button1").bind("mouseup.a",function(eventObj){ console.log("mouseup"); }); $("#button1").bind("mousedown.a",function(eventObj){ console.log("mousedown"); }); |
这段代码我们使用2个命名空间a和b,如果我只想要保留第2个click事件处理函数,其余的全部删除。我们可以有2种方式达到目的:
方式1:
|
1
2
3
|
$("#button1").unbind("click.a");$("#button1").unbind("mouseup");$("#button1").unbind("mousedown"); |
方式2:
|
1
|
$("#button1").unbind(".a"); |
很显然方式2更加简单,更加技巧性,虽然代码更不容易看懂,不过只要你熟悉JQuery就能看懂。项目中如果出现了你看不懂的代码,只有2种情况:要么别人不行,代码写的烂;要么自己不行,知识懂的少。如果不熟悉某种语言,又怎能用它写好代码呢?所以,代码质量、开发效率,和个人技能水平,团队水平紧密相关。
Jquery中的事件命名机制的更多相关文章
- jQuery中的事件机制深入浅出
昨天呢,我们大家一起分享了jQuery中的样式选择器,那么今天我们就来看一下jQuery中的事件机制,其实,jQuery中的事件机制与JavaScript中的事件机制区别是不大的,只是,JavaScr ...
- 【jQuery基础学习】03 jQuery中的事件与动画
关于jQuery中的事件 js与HTML之间的交互是通过用户和浏览器操作页面时引发的事件来处理的. jQuery增加并扩展了基本的事件处理机制,jQuery不仅提供了更加优雅的事件处理方法,而且极大地 ...
- jQuery中的事件绑定方法
在jQuery中,事件绑定方法大致有四种:bind(),live(), delegate(),和on(). 那么在工作中应该如何选择呢?首先要了解四种方法的区别和各自的特点. 在了解这些之前,首先要知 ...
- jQuery:详解jQuery中的事件(一)
之前用过一些jQuery的动画和特效,但是用到的部分也不超过10%的样子,感觉好浪费啊——当然浪费的不是jQuery,而是Web资源.后来就想深入研究下jQuery的内部机理,读过两遍jQuery源代 ...
- jQuery学习笔记(三)jQuery中的事件
目录 加载DOM 事件绑定 合成事件 事件冒泡 移除事件 一.加载DOM Javascript 与HTML之间的交互是通过用户操作浏览器页面引发的事件来处理的.jQuery提供了丰富的事件处理机制.从 ...
- Javascript事件模型系列(三)jQuery中的事件监听方式及异同点
作为全球最知名的js框架之一,jQuery的火热程度堪称无与伦比,简单易学的API再加丰富的插件,几乎是每个前端程序员的必修课.从读<锋利的jQuery>开始,到现在使用jQuery有一年 ...
- 关于jQuery新的事件绑定机制on()的使用技巧
关于jQuery新的事件绑定机制on()的使用技巧 http://www.jb51.net/article/36064.htm 本篇文章介绍了,关于jQuery新的事件绑定机制on()的使用技巧.需要 ...
- jQuery中的事件与动画<思维导图>
Javascript和HTML之间的交互是通过用户和浏览器操作页面时引发的事件来处理的.当文档或者它的某些元素发生某些变化或操作时,浏览器会自动生成一个事件.例如当浏览器装载完一个文档后,会生成事件. ...
- jQuery中的事件监听方式及异同点
jQuery中的事件监听方式及异同点 作为全球最知名的js框架之一,jQuery的火热程度堪称无与伦比,简单易学的API再加丰富的插件,几乎是每个前端程序员的必修课.从读<锋利的jQuery&g ...
随机推荐
- 我的第一个WCF程序
写WCF,VS需要一管理员身份呢启动,否则服务无法访问. model层 using System; using System.Runtime.Serialization; namespace MyMo ...
- maven构建ssh工程
1.1 需求 在web工程的基础上实现ssh工程的创建,规范依赖管理. 1.2 数据库环境 使用之前学习hibernate创建的数据库: 1.3 创建父工程 选择创建Maven Project ...
- Linux pip安装使用详解
简介 pip是Python有它自己的包管理工具,与yum和apt-get相似. 安装步骤: 1.下载get-pip.py:https://bootstrap.pypa.io/get-pip.py 2. ...
- Oracle_SQL(7) 复杂查询
1.rownum 伪列<,<=select * from emp where rownum<5; 取工资前3名的人员 select * from (select * from emp ...
- Git二进制文件冲突解决
Git二进制文件冲突解决 在我们合并分支的时候,如果两个分支都进行了修改那么就会产生合并冲突.对于非二进制文件的冲突解决,git会给出冲突的位置我们可以手动修改然后再commit.但是对于非二进制文件 ...
- Hadoop(三) HADOOP常用命令参数介绍
-help 功能:输出这个命令参数手册 -ls 功能:显示目录信息 示例: hadoop fs -ls hdfs://hadoop-server01:9000/ 备注 ...
- fastdfs 上传图片 完整版
1.jsp文件 <%@ page language="java" import="java.util.*" pageEncoding="UTF- ...
- iOS.PrototypeTools
1. iPhone/iPad 原型工具 http://giveabrief.com/ 2. proto.io https://proto.io/ 3. Origami http://facebook. ...
- xagrs 指定参数位置
xargs还有指定参数位置的作用.假设我们要将目录下所有的.py文件放到Python目录中去,可以使用命令find . -name '*.py' | xargs -I {} mv {} ./Pytho ...
- swift NSdata 转换 nsstring
result = NSString(data: data, encoding: NSUTF8StringEncoding) 做HTTP 请求时 遇到 打印结果看 所以~~~