实例讲解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 相关文章推荐
如何取得中文输入的真实长度?
Jun 24 Javascript
裁剪字符串trim()自定义改进版
Apr 10 Javascript
如何阻止复制剪切和粘贴事件为了表单内容的安全
May 23 Javascript
JS对话框_JS模态对话框showModalDialog用法总结
Jan 11 Javascript
js判断浏览器是否支持html5
Aug 17 Javascript
JQuery基础语法小结
Feb 27 Javascript
jQuery+css实现炫目的动态块漂移效果
Jan 28 Javascript
js手动播放图片实现图片轮播效果
Sep 17 Javascript
JavaScript 随机验证码的生成实例代码
Sep 22 Javascript
JS定时器用法分析【时钟与菜单中的应用】
Dec 21 Javascript
在微信小程序中使用图表的方法示例
Apr 25 Javascript
Vue的列表之渲染,排序,过滤详解
Feb 24 Vue.js
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
Windows 下的 PHP-PEAR 安装方法
2010/11/20 PHP
PHP采集利器 Snoopy 试用心得
2011/07/03 PHP
深入理解PHP内核(二)之SAPI探究
2015/11/10 PHP
PHP 生成微信红包代码简单
2016/03/25 PHP
OfflineSave离线保存代码再次发布使用说明
2007/05/23 Javascript
jquery实现的导航固定效果
2014/04/28 Javascript
JavaScript更改原始对象valueOf的方法
2015/03/19 Javascript
JavaScript基于ajax编辑信息用法实例
2015/07/15 Javascript
javascript封装的sqlite操作类实例
2015/07/17 Javascript
JavaScript获取页面中超链接数量的方法
2015/11/09 Javascript
基于BootStrap Metronic开发框架经验小结【二】列表分页处理和插件JSTree的使用
2016/05/12 Javascript
bootstrap flask登录页面编写实例
2016/11/01 Javascript
将json转换成struts参数的方法
2016/11/08 Javascript
Angular路由简单学习
2016/12/26 Javascript
微信小程序 input表单与redio及下拉列表的使用实例
2017/09/20 Javascript
小程序富文本提取图片可放大缩小
2020/05/26 Javascript
js实现轮播图特效
2020/05/28 Javascript
Vue实现小购物车功能
2020/12/21 Vue.js
为Python的web框架编写前端模版的教程
2015/04/30 Python
python3+PyQt5实现自定义流体混合窗口部件
2018/04/24 Python
python 对key为时间的dict排序方法
2018/10/17 Python
python matplotlib库绘制散点图例题解析
2019/08/10 Python
Django Serializer HiddenField隐藏字段实例
2020/03/31 Python
Hertz荷兰:荷兰和全球租车
2018/01/07 全球购物
香港通票:Hong Kong Pass
2019/02/26 全球购物
Brydge英国:适用于Apple iPad和Microsoft Surface Pro的蓝牙键盘
2019/05/16 全球购物
下面代码从性能上考虑,有什么问题
2015/04/03 面试题
农业资源与环境专业自荐信范文
2013/12/30 职场文书
服装电子商务创业计划书
2014/01/30 职场文书
平安建设工作方案
2014/06/02 职场文书
小学课外阅读总结
2014/07/09 职场文书
中国梦演讲稿5分钟
2014/08/19 职场文书
行政主管岗位职责
2015/02/03 职场文书
公司搬迁通知
2015/04/20 职场文书
解决golang post文件时Content-Type出现的问题
2021/05/02 Golang
MutationObserver在页面水印实现起到的作用详解
2022/07/07 Javascript