实例讲解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 相关文章推荐
jquery文本框中的事件应用以输入邮箱为例
May 06 Javascript
JS版的date函数(和PHP的date函数一样)
May 12 Javascript
JQuery标签页效果实例详解
Dec 24 Javascript
BootStrap中Datetimepicker和uploadify插件应用实例小结
May 26 Javascript
深入理解jQuery layui分页控件的使用
Aug 17 Javascript
浅析BootStrap Treeview的简单使用
Oct 12 Javascript
ES6入门教程之let和const命令详解
May 17 Javascript
给vue项目添加ESLint的详细步骤
Sep 29 Javascript
pace.js和NProgress.js两个加载进度插件的一点小总结
Jan 31 Javascript
详解Puppeteer 入门教程
May 09 Javascript
微信小程序自定义带价格显示日历效果
Dec 29 Javascript
js 数组当前行添加数据方法详解
Jul 28 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
windows服务器中检测PHP SSL是否开启以及开启SSL的方法
2014/04/25 PHP
PHP输入输出流学习笔记
2015/05/12 PHP
php 微信开发获取用户信息如何实现
2016/12/13 PHP
动态修改DOM 里面的 id 属性的弊端分析
2008/09/03 Javascript
在jQuery 1.5中使用deferred对象的代码(翻译)
2011/03/10 Javascript
jQuery1.6 类型判断实现代码
2011/09/01 Javascript
什么是json和jsonp,jQuery json实例详详细说明
2012/12/11 Javascript
js设置function参数默认值(适合没有传参情况)
2014/02/24 Javascript
js类型转换与引用类型详解(Boolean_Number_String)
2014/03/07 Javascript
JS实现关键字搜索时的相关下拉字段效果
2014/08/05 Javascript
基于bootstrap插件实现autocomplete自动完成表单
2016/05/07 Javascript
js窗口震动小程序分享
2016/11/28 Javascript
使用snowfall.jquery.js实现爱心满屏飞的效果
2017/01/05 Javascript
js前端实现图片懒加载(lazyload)的两种方式
2017/04/24 Javascript
详解JS中的attribute属性
2017/04/25 Javascript
vue中v-model的应用及使用详解
2018/06/27 Javascript
深入浅析var,let,const的异同点
2018/08/07 Javascript
解决angularjs WdatePicker ng-model的问题
2018/09/13 Javascript
详解基于原生JS验证表单组件xy-form
2019/08/20 Javascript
详解如何在Javascript中使用Object.freeze()
2020/10/18 Javascript
python读取浮点数和读取文本文件示例
2014/05/06 Python
Python实现程序判断季节的代码示例
2019/01/28 Python
使用 Python 玩转 GitHub 的贡献板(推荐)
2019/04/04 Python
Python OpenCV实现视频分帧
2019/06/01 Python
对python中基于tcp协议的通信(数据传输)实例讲解
2019/07/22 Python
Python3安装pip工具的详细步骤
2019/10/14 Python
用Python生成HTML表格的方法示例
2020/03/06 Python
python实现用户名密码校验
2020/03/18 Python
Ubuntu16安装Python3.9的实现步骤
2020/12/15 Python
解决virtualenv -p python3 venv报错的问题
2021/02/05 Python
Python3+PyCharm+Django+Django REST framework配置与简单开发教程
2021/02/16 Python
The North Face北面英国官网:美国著名户外品牌
2017/12/13 全球购物
法律专业应届生自荐信范文
2014/01/06 职场文书
餐厅楼面部长岗位职责范文
2014/02/16 职场文书
体育专业大学生职业生涯规划范文:打造自己的运动帝国
2014/09/12 职场文书
2014年个人售房协议书
2014/10/30 职场文书