实例讲解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 相关文章推荐
Firefox和IE浏览器兼容JS脚本写法小结
Jul 07 Javascript
仿JQuery输写高效JSLite代码的一些技巧
Jan 13 Javascript
JavaScript中扩展Array contains方法实例
Aug 23 Javascript
jQuery插件Zclip实现完美兼容个浏览器点击复制内容到剪贴板
Apr 30 Javascript
node.js调用C++开发的模块实例
Jul 03 Javascript
BootStrap的Datepicker控件使用心得分享
May 25 Javascript
js实现拖拽功能
Mar 01 Javascript
ReactJs实现树形结构的数据显示的组件的示例
Aug 18 Javascript
基于Vue-cli快速搭建项目的完整步骤
Nov 03 Javascript
React+Redux实现简单的待办事项列表ToDoList
Sep 29 Javascript
使用JavaScript实现网页秒表功能(含开始、暂停、继续、重置功能)
Jun 05 Javascript
JS实现拖拽元素时与另一元素碰撞检测
Aug 27 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中根据IP地址判断城市实现城市切换或跳转代码
2012/09/04 PHP
PHP cdata 处理(详细介绍)
2013/07/05 PHP
php中使用getimagesize获取图片、flash等文件的尺寸信息实例
2014/04/29 PHP
PHP IDE PHPStorm配置支持友好Laravel代码提示方法
2015/05/12 PHP
[原创]PHP实现字节数Byte转换为KB、MB、GB、TB的方法
2017/08/31 PHP
kindeditor 加入七牛云上传的实例讲解
2017/11/12 PHP
IE6下JS动态设置图片src地址问题
2010/01/08 Javascript
jQuery+jqmodal弹出窗口实现代码分明
2010/06/14 Javascript
js去除重复字符串两种实现方法
2013/01/09 Javascript
用jquery中插件dialog实现弹框效果实例代码
2013/11/15 Javascript
Jquery实现地铁线路指示灯提示牌效果的方法
2015/03/02 Javascript
jquery-tips悬浮提示插件分享
2015/07/31 Javascript
JS运动相关知识点小结(附弹性运动示例)
2016/01/08 Javascript
jQuery 如何给Carousel插件添加新的功能
2016/04/18 Javascript
JavaScript中instanceof运算符的使用示例
2016/06/08 Javascript
json定义及jquery操作json的方法
2016/09/29 Javascript
详谈jQuery.load()和Jsp的include的区别
2017/04/12 jQuery
详解ElementUI之表单验证、数据绑定、路由跳转
2017/06/21 Javascript
微信小程序左右滑动的实现代码
2017/12/15 Javascript
vue中简单弹框dialog的实现方法
2018/02/26 Javascript
用VsCode编辑TypeScript的实现方法
2020/05/07 Javascript
Python字符串特性及常用字符串方法的简单笔记
2016/01/04 Python
使用python获取csv文本的某行或某列数据的实例
2018/04/03 Python
python 简单照相机调用系统摄像头实现方法 pygame
2018/08/03 Python
django解决跨域请求的问题详解
2019/01/20 Python
对python 调用类属性的方法详解
2019/07/02 Python
在Python中利用pickle保存变量的实例
2019/12/30 Python
Python基于正则表达式实现计算器功能
2020/07/13 Python
详解Python模块化编程与装饰器
2021/01/16 Python
印尼购物网站:iLOTTE
2019/10/16 全球购物
文化与传播毕业生求职信
2014/03/09 职场文书
档案保密承诺书
2014/06/03 职场文书
售房协议书范本2014
2014/10/23 职场文书
银行自荐信怎么写
2015/03/05 职场文书
我的生日感言
2015/08/03 职场文书
《认识钟表》教学反思
2016/02/16 职场文书