实例讲解jQuery中对事件的命名空间的运用


Posted in Javascript onMay 24, 2016

用 jQuery 绑定和解绑事件监听器都是非常简单的。但是当你为一个元素的一个事件绑定了多个监听器时,怎样精确地解绑其中一个监听器?我们需要了解一下事件的命名空间。

看下面这段代码:

$(“#element”)
  .on(“click”, doSomething)
  .on(“click”, doSomethingElse);

像上面这样绑定事件监听器,当元素被点击时,doSomething 和 doSomethingElse 这两个监听器都会被触发。这是使用 jQuery 的一个便利之处,可以随时给元素的同一个事件添加不同的监听器。不像用 onclick 那样,新的监听器会覆盖旧的。

如果你想解绑其中一个监听器,比如 doSomething,怎么做呢?

是这样吗?

$(“#element”).off(“click”);

注意!上面这行代码会把元素的 click 事件的所有监听器全部解绑,而这并不是我们要的结果。

幸运的是 jQuery 的 .off() 方法可以接受第二个参数,就像 .on() 一样。只要把监听器函数的名字作为第二个参数传入 .off() 方法,就能够解绑指定的监听器。

$(“#element”).off(“click”, doSomething);

但是如果你不知道这个函数的名字,或者你用的是匿名函数:

$(“#element”)
  .on(“click”, function() {
    console.log(“doSomething”);
  });

怎样才能精确地解绑某一个 click 事件监听器呢?该了解一下 jQuery 的事件命名空间了!

先上代码:

$(“#element”)
  .on(“click.myNamespace”, function() {
    console.log(“doSomething”);
  });

这里不只是把 click 事件作为参数传入 .on() 方法,而是给 click 事件指定了一个命名空间,然后监听了这个命名空间里的 click 事件。此时,即使监听器是匿名函数,实际上它也是“有名”的了。现在你可以像下面这样解绑某一个具体的命名空间里的事件监听器了。

$(“#element”).off(“click.myNamespace”);

这是 jQuery 为我们提供的又一个方便而强大的功能,它的内部实现肯定很有意思!

我们再来看一些代码:

$(“#haorooms”).on("click.a",function(){});
$(“#haorooms”).on("click.a.bb",function(){});
$(“#haorooms”).on("dbclick.a",function(){});
$(“#haorooms”).on("mouseover.a",function(){});
$(“#haorooms”).on("mouseout.a",function(){});

当然,我们也可以用bind进行事件绑定。我们看到上面的代码,我们可以在事件后面,以点号,加我们的名字,就是事件命名空间。所谓事件命名空间,就是事件类型后面以点语法附加一个别名,以便引用事件,如”click.a”,其中”a”就是click当前事件类型的别名,即事件命名空间。

假如我们要删除如下命名空间:

$(“#haorooms”).on("click.a.bb",function(){});

我们可以用:

$(“#haorooms”).off("click.a.bb");//直接删除bb命名空间 【推荐】
$(“#haorooms”).off(".bb"); //直接删除bb命名空间 【推荐】
$(“#haorooms”).off(".a"); //删除.a命名空间下面所有的子空间【包括.a.bb  .a.cc等等,.a是.bb的父级,因此.a下面的都会删掉】
$(“#haorooms”).off("click");//直接解绑click,下面的命名空间都会删除。

要注意的是:

假如我们写了如下代码:

$(“#haorooms”).on("click",function(){});
$(“#haorooms”).on("click.a",function(){});
$(“#haorooms”).on("click.a.bb",function(){});

那么我们要用trigger触发click事件,也就是触发第一个,岂不是把click.a和click.a.bb都触发了,那如何解决这个问题呢,我只想触发click,而不触发click.a及以下的命名空间?

没关系! 有如下解决办法:

如果事件类型后面附加感叹号,则表示触发不包含命名空间的特定事件类型。

假如我们只想触发click,可以这么写:

$(“#haorooms”).trigger("click!")

只触发bb,可以这么写:

$(“#haorooms”).trigger("click.a.bb");

有了命名空间,可以方便我们在同一个事件上面做管理啦!!!

Javascript 相关文章推荐
在textarea文本域中显示HTML代码的方法
Mar 06 Javascript
javascript mouseover、mouseout停止事件冒泡的解决方案
Apr 07 Javascript
JS判断客户端是手机还是PC的2个代码
Apr 12 Javascript
jQuery实现手机号码输入提示功能实例
Apr 30 Javascript
跟我学习javascript的闭包
Nov 16 Javascript
javascript实现图片轮播效果
Jan 20 Javascript
JavaScript中的对象和原型(一)
Aug 12 Javascript
vue深入解析之render function code详解
Jul 18 Javascript
Vue+Jwt+SpringBoot+Ldap完成登录认证的示例代码
May 21 Javascript
微信小程序MUI导航栏透明渐变功能示例(通过改变rgba的a值实现)
Jan 24 Javascript
详解基于vue-cli3快速发布一个fullpage组件
Mar 08 Javascript
Element PageHeader页头的使用方法
Jul 26 Javascript
json传值以及ajax接收详解
May 24 #Javascript
JS获取屏幕高度的简单实现代码
May 24 #Javascript
基于JavaScript实现回到页面顶部动画代码
May 24 #Javascript
jquery简单插件制作(fn.extend)完整实例
May 24 #Javascript
jQuery获取及设置表单input各种类型值的方法小结
May 24 #Javascript
jQuery+php实时获取及响应文本框输入内容的方法
May 24 #Javascript
jQuery中事件与动画的总结分享
May 24 #Javascript
You might like
php4的彩蛋
2006/10/09 PHP
php使用smtp发送支持附件的邮件示例
2014/04/13 PHP
Laravel最佳分割路由文件(routes.php)的方式
2016/08/04 PHP
js实现仿阿里巴巴城市选择框效果实例
2015/06/24 Javascript
使用Jasmine和Karma对AngularJS页面程序进行测试
2016/03/05 Javascript
AngularJS ngModel实现指令与输入直接的数据通信
2016/09/21 Javascript
完美实现js焦点轮播效果(一)
2017/03/07 Javascript
javascript将url解析为json格式的两种方法
2017/08/18 Javascript
react-native DatePicker日期选择组件的实现代码
2017/09/12 Javascript
Angular 作用域scope的具体使用
2017/12/11 Javascript
在Vue中使用highCharts绘制3d饼图的方法
2018/02/08 Javascript
使用Vue.js中的过滤器实现幂方求值的方法
2019/08/27 Javascript
从源码解析Python的Flask框架中request对象的用法
2016/06/02 Python
网站渗透常用Python小脚本查询同ip网站
2017/05/08 Python
python+selenium+chromedriver实现爬虫示例代码
2020/04/10 Python
Django如何使用redis作为缓存
2020/05/21 Python
python多线程和多进程关系详解
2020/12/14 Python
Pandas之缺失数据的实现
2021/01/06 Python
美国男士内衣品牌:Tommy John
2017/12/22 全球购物
怀旧收藏品和经典纪念品:Betty’s Attic
2018/08/29 全球购物
ManoMano英国:欧洲第一家专注于DIY和园艺市场的电商平台
2020/03/12 全球购物
如何高效率的查找一个月以内的数据
2012/04/15 面试题
如何从一个文件档案的尾端新增记录
2016/12/02 面试题
酒店司机岗位职责
2013/12/14 职场文书
《孔子拜师》教学反思
2014/02/24 职场文书
中学校庆方案
2014/03/17 职场文书
领导干部群众路线剖析材料
2014/10/09 职场文书
党员群众路线整改措施及今后努力方向
2014/10/28 职场文书
2014年维修电工工作总结
2014/11/20 职场文书
2014年环卫工作总结
2014/11/22 职场文书
汽车4S店前台接待岗位职责
2015/04/03 职场文书
监理中标通知书
2015/04/16 职场文书
2016学校元旦晚会经典开场白台词
2015/12/03 职场文书
想要创业,那么你做好准备了吗?
2019/07/01 职场文书
pytorch fine-tune 预训练的模型操作
2021/06/03 Python
golang操作rocketmq的示例代码
2022/04/06 Golang