实例讲解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 相关文章推荐
javascript suggest效果 自动完成实现代码分享
Feb 17 Javascript
使用AmplifyJS组件配合JavaScript进行编程的指南
Jul 28 Javascript
jQuery Validate验证表单时多个name相同的元素只验证第一个的解决方法
Dec 24 Javascript
js实现鼠标左右移动,图片也跟着移动效果
Jan 25 Javascript
基于vue2的table分页组件实现方法
Mar 20 Javascript
vue2.0构建单页应用最佳实战
Apr 01 Javascript
详解angularjs的数组传参方式的简单实现
Jul 28 Javascript
JavaScrip数组删除特定元素的几种方法总结
Sep 06 Javascript
angularjs实现柱状图动态加载的示例
Dec 11 Javascript
laydate时间日历插件使用方法详解
Nov 14 Javascript
Vue 路由间跳转和新开窗口的方式(query、params)
Dec 25 Javascript
WebWorker 封装 JavaScript 沙箱详情
Nov 02 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
php foreach、while性能比较
2009/10/15 PHP
Yii操作数据库的3种方法
2014/03/11 PHP
PHP批量修改文件名称的方法分析
2017/02/27 PHP
PHP实现生成数据字典功能示例
2018/05/24 PHP
JavaScript继承方式实例
2010/10/29 Javascript
用Jquery实现多级下拉框无刷新的联动
2010/12/22 Javascript
ExtJs设置GridPanel表格文本垂直居中示例
2013/07/15 Javascript
兼容IE、firefox以及chrome的js获取时间(getFullYear)
2014/07/04 Javascript
AngularJS中的过滤器filter用法完全解析
2016/04/22 Javascript
使用jQuery Mobile框架开发移动端Web App的入门教程
2016/05/17 Javascript
AngularJs html compiler详解及示例代码
2016/09/01 Javascript
Vue组件BootPage实现简单的分页功能
2016/09/12 Javascript
jQuery实现的无限级下拉菜单功能示例
2016/09/12 Javascript
jQuery插件form-validation-engine正则表达式操作示例
2017/02/09 Javascript
详解angular用$sce服务来过滤HTML标签
2017/04/11 Javascript
js基于FileSaver.js 浏览器导出Excel文件的示例
2017/08/15 Javascript
解决Jstree 选中父节点时被禁用的子节点也会选中的问题
2017/12/27 Javascript
JS实现导出Excel的五种方法详解【附源码下载】
2018/03/15 Javascript
深入浅析Vue.js计算属性和侦听器
2018/05/05 Javascript
详解关于element级联选择器数据回显问题
2019/02/20 Javascript
layui 图片上传+表单提交+ Spring MVC的实例
2019/09/21 Javascript
原生JavaScript实现刮刮乐
2020/09/29 Javascript
Python实现在Linux系统下更改当前进程运行用户
2015/02/04 Python
python实现雪花飘落效果实例讲解
2019/06/18 Python
Python数据可视化图实现过程详解
2020/06/12 Python
Python -m参数原理及使用方法解析
2020/08/21 Python
Lacoste美国官网:经典POLO衫品牌
2016/10/12 全球购物
菲律宾最大的网上花店和礼品店:PhilFlower.com
2018/02/09 全球购物
YBF Beauty官网:美丽挚友,美国知名彩妆品牌
2020/11/22 全球购物
若干个Java基础面试题
2015/05/19 面试题
中文系学生自荐信范文
2013/11/13 职场文书
儿子婚宴答谢词
2014/01/09 职场文书
表彰先进的通报
2014/01/31 职场文书
2014年销售内勤工作总结
2014/12/01 职场文书
六年级语文教学反思
2016/03/03 职场文书
JAVA SpringMVC实现自定义拦截器
2022/03/16 Python