实例讲解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 相关文章推荐
Document 对象的常用方法
Jul 31 Javascript
推荐5 个常用的JavaScript调试技巧
Jan 08 Javascript
学习JavaScript编程语言的8张思维导图分享
Mar 27 Javascript
javascript生成img标签的3种实现方法(对象、方法、html)
Dec 25 Javascript
基于Bootstrap实现Material Design风格表单插件 附源码下载
Apr 18 Javascript
js判断空对象的实例(超简单)
Jul 26 Javascript
Bootstrap Scrollspy源码学习
Mar 02 Javascript
jQuery菜单实例(全选,反选,取消)
Aug 28 jQuery
vue里面父组件修改子组件样式的方法
Feb 03 Javascript
layui结合form,table的全选、反选v1.0示例讲解
Aug 15 Javascript
element ui分页多选,翻页记忆的实例
Sep 03 Javascript
vue resource发送请求的几种方式
Sep 30 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
留言板翻页的实现详解
2006/10/09 PHP
PHP中全局变量global和$GLOBALS[]的区别分析
2012/08/06 PHP
Codeigniter上传图片出现“You did not select a file to upload”错误解决办法
2014/06/12 PHP
Yii使用CLinkPager分页实例详解
2014/07/23 PHP
Aliyun Linux 编译安装 php7.3 tengine2.3.2 mysql8.0 redis5的过程详解
2020/10/20 PHP
用JavaScript实现对话框的教程
2015/06/04 Javascript
两种JS实现屏蔽鼠标右键的方法
2020/08/20 Javascript
Javascript 高性能之递归,迭代,查表法详解及实例
2017/01/08 Javascript
ES6中Generator与异步操作实例分析
2017/03/31 Javascript
jQuery实现下拉菜单的实例代码
2017/06/19 jQuery
angular+ionic返回上一页并刷新页面
2017/08/08 Javascript
详解Python中的__init__和__new__
2014/03/12 Python
介绍Python中几个常用的类方法
2015/04/08 Python
Python中if __name__ == '__main__'作用解析
2015/06/29 Python
在Django的视图(View)外使用Session的方法
2015/07/23 Python
使用Django的模版来配合字符串翻译工作
2015/07/27 Python
Python实现字符串格式化输出的方法详解
2017/09/20 Python
python距离测量的方法
2018/03/06 Python
python实现浪漫的烟花秀
2019/01/30 Python
Python实现定时自动关闭的tkinter窗口方法
2019/02/16 Python
Python3+OpenCV2实现图像的几何变换(平移、镜像、缩放、旋转、仿射)
2019/05/13 Python
python批量修改xml属性的实现方式
2020/03/05 Python
你正在寻找的CSS3 动画技术
2011/07/27 HTML / CSS
加拿大城市本地限时优惠:Buytopia.ca
2018/09/19 全球购物
办公室副主任岗位职责
2013/11/25 职场文书
师范毕业生个人求职信
2013/12/09 职场文书
便利店的创业计划书
2014/01/15 职场文书
软件专业毕业生个人自我鉴定
2014/04/17 职场文书
群教个人对照检查材料
2014/08/20 职场文书
安全责任书范文
2014/08/25 职场文书
公安局负责人查摆问题及整改方案
2014/09/27 职场文书
大学生党员批评与自我批评
2014/09/28 职场文书
奖学金个人总结
2015/03/04 职场文书
让生命充满爱观后感
2015/06/08 职场文书
小爸爸观后感
2015/06/15 职场文书
Nginx图片服务器配置之后图片访问404的问题解决
2022/03/21 Servers