jQuery事件处理的特征(事件命名机制)


Posted in Javascript onAugust 23, 2016

JQuery中的bind()和unbind(),提供了事件的绑定和取消机制,既可以绑定html默认支持的事件,也能够绑定自定义的事件。JQuery支持自定义事件,这显然给编程带来了极大的灵活性。下面就一起学习下,jquery事件处理的一些特性。

1、JQuery中事件可以重复绑定,不会覆盖。

$("#button1").bind("click",function(){
alert("func1");
});
$("#button1").bind("click",function(){
alert("func2");
});

当点击button1的时候,这2个事件处理函数都会触发。也许你会说,上面绑定的是不同的匿名函数,占用不同的内存空间。的确是这样的,不过就算是同一个处理函数,依然存在重复绑定问题。当button1被点击的时候,下面的事件处理函数同样会被调用2次。

$("#button1").bind("click",sameFunc);
$("#button1").bind("click",sameFunc);
function sameFunc()
{
alert("func");
}

绝大部分场景下,事件处理函数都只需要绑定一次,所以一定要注意JQuery事件的重复绑定这个特性,事件多次执行,就算没有bug,终究也不是好的做法。

2、使用bind一次绑定多个事件和处理函数。

如果多个事件需要注册相同的处理函数,那么可以使用如下代码进行简化(事件名称使用空格分隔):

$("#button1").bind("mousedown mouseup",function(){
console.log(11);
});

如果每个事件的处理函数不同,那么可以使用如下的方式(json对象):

$("#button1").bind(
{
"mousedown":function(){
console.log("mousedown");
},
"mouseup":function(){
console.log("mouseup");
}
}
);

3、传递event对象和自定义参数。

一般来说,使用jquery的时候我们很少需要event对象,也不需要向事件处理函数传递自定义的参数。不过如果我们真的需要这么做,JQuery也是支持的。

$("#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个处理函数。

$("#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个保留,应该怎么办呢?由于我们注册的是匿名函数,所以没有办法实现。下面的代码是错误的,达不到预期的效果。

$("#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使用不同函数,是不是就能达到目的了?确实是这样,下面的代码是正确的。

$("#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当前事件类型的别名,即事件命名空间。由于点号是用来定义命名空间的,所以如果我们使用了自定义事件,那么事件名称一定不要包含点号,否则会引起意想不到的问题。这种问题,没有尝试的必要,特殊字符能不用则不用,否则是给自己找麻烦。

$("#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个好处:能够按照命名空间来取消事件。

// 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:

$("#button1").unbind("click.a");
$("#button1").unbind("mouseup");
$("#button1").unbind("mousedown");

方式2:

$("#button1").unbind(".a");

很显然方式2更加简单,更加技巧性,虽然代码更不容易看懂,不过只要你熟悉JQuery就能看懂。项目中如果出现了你看不懂的代码,只有2种情况:要么别人不行,代码写的烂;要么自己不行,知识懂的少。如果不熟悉某种语言,又怎能用它写好代码呢?所以,代码质量、开发效率,和个人技能水平,团队水平紧密相关。

以上所述是小编给大家介绍的jQuery事件处理的特征(事件命名机制),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
jQuery DIV弹出效果实现代码
Jul 03 Javascript
javascript判断iphone/android手机横竖屏模式的函数
Dec 20 Javascript
JS中的public和private对象,即static修饰符
Jan 18 Javascript
JavaScript中的细节分析
Jun 30 Javascript
浅析Node.js中的内存泄漏问题
Jun 23 Javascript
JQuery插件Marquee.js实现无缝滚动效果
Apr 26 Javascript
jQuery事件的绑定、触发、及监听方法简单说明
May 10 Javascript
自动适应iframe右边的高度
Dec 22 Javascript
Json按某个键的值进行排序
Dec 22 Javascript
AngularJS基于MVC的复杂操作实例讲解
Dec 31 Javascript
Vue.js中的组件系统
May 30 Javascript
vue中watch和computed为什么能监听到数据的改变以及不同之处
Dec 27 Javascript
深入浅出 jQuery中的事件机制
Aug 23 #Javascript
javascript实现简单的on事件绑定
Aug 23 #Javascript
js实现图片淡入淡出切换简易效果
Aug 22 #Javascript
JS对HTML表格进行增删改操作
Aug 22 #Javascript
AngularJS中$http服务常用的应用及参数
Aug 22 #Javascript
详解AngularJS如何实现跨域请求
Aug 22 #Javascript
深入浅析JS Function()构造函数
Aug 22 #Javascript
You might like
咖啡的传说和历史
2021/03/03 新手入门
php守护进程 加linux命令nohup实现任务每秒执行一次
2011/07/04 PHP
WordPress中给媒体文件添加分类和标签的PHP功能实现
2015/12/31 PHP
php pthreads多线程的安装与使用
2016/01/19 PHP
PHP调用存储过程返回值不一致问题的解决方法分析
2016/04/26 PHP
PHP 返回13位时间戳的实现代码
2016/05/13 PHP
php文件上传及下载附带显示文件及目录功能
2017/04/27 PHP
PHP基于socket实现客户端和服务端通讯功能
2017/07/13 PHP
JavaScript中“+=”的应用
2007/02/02 Javascript
js jq 单击和双击区分示例介绍
2013/11/05 Javascript
jQuery模拟完美实现经典FLASH导航动画效果【附demo源码下载】
2016/11/09 Javascript
原生js实现倒计时--2018
2017/02/21 Javascript
原生JS实现九宫格抽奖效果
2017/04/01 Javascript
jQuery移动端跑马灯抽奖特效升级版(抽奖概率固定)实现方法
2019/01/18 jQuery
利用JS响应式修改vue实现页面的input值
2019/09/02 Javascript
vue 解决uglifyjs-webpack-plugin打包出现报错的问题
2020/08/04 Javascript
vue单应用在ios系统中实现微信分享功能操作
2020/09/07 Javascript
JavaScript实现10秒后再次获取验证码
2020/12/02 Javascript
[41:54]2018DOTA2亚洲邀请赛 4.1 小组赛A组加赛 TNC vs Liquid
2018/04/03 DOTA
[54:53]完美世界DOTA2联赛PWL S2 GXR vs PXG 第二场 11.18
2020/11/18 DOTA
Python操作MySQL数据库9个实用实例
2015/12/11 Python
学习python之编写简单乘法口诀表实现代码
2016/02/27 Python
python类:class创建、数据方法属性及访问控制详解
2016/07/25 Python
Python 通过URL打开图片实例详解
2017/06/01 Python
python安装模块如何通过setup.py安装(超简单)
2018/05/05 Python
python获取文件真实链接的方法,针对于302返回码
2018/05/14 Python
python 矢量数据转栅格数据代码实例
2019/09/30 Python
Windows10下Tensorflow2.0 安装及环境配置教程(图文)
2019/11/21 Python
通过Python实现一个简单的html页面
2020/05/16 Python
使用CSS3来代替JS实现交互
2017/08/10 HTML / CSS
详解利用css3的var()实现运行时改变scss的变量值
2021/03/02 HTML / CSS
优质美利奴羊毛袜,不只是徒步旅行:Darn Tough Vermont
2018/11/05 全球购物
Magee 1866官网:Donegal粗花呢外套和大衣专家
2019/11/01 全球购物
班主任工作经验交流材料
2014/05/13 职场文书
工作调动申请报告
2015/05/18 职场文书
Python 数据可视化之Seaborn详解
2021/11/02 Python