实例讲解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 相关文章推荐
js nextSibling属性和previousSibling属性概述及使用注意
Feb 16 Javascript
js实现checkbox全选和反选示例
May 01 Javascript
jquery转盘抽奖功能实现
Nov 13 Javascript
JavaScript中校验银行卡号的实现代码
Dec 19 Javascript
ES6概念 Symbol.keyFor()方法
Dec 25 Javascript
微信小程序 页面跳转传值实现代码
Jul 27 Javascript
VUE实现表单元素双向绑定(总结)
Aug 08 Javascript
微信小程序模板(template)使用详解
Jan 31 Javascript
详解微信小程序开发聊天室—实时聊天,支持图片预览
May 20 Javascript
js获取 gif 的帧数的代码实例
Sep 10 Javascript
Jquery 动态添加元素并添加点击事件实现过程解析
Oct 12 jQuery
Layui表格监听行单双击事件讲解
Nov 14 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
ThinkPHP页面跳转success与error方法概述
2014/06/25 PHP
php三元运算符知识汇总
2015/07/02 PHP
php session实现多级目录存放实现代码
2016/02/03 PHP
PHP经典设计模式之依赖注入定义与用法详解
2019/05/21 PHP
PHP数组对象与Json转换操作实例分析
2019/10/22 PHP
asp javascript 实现关闭窗口时保存数据的办法
2007/11/24 Javascript
JavaScript自动设置IFrame高度的小例子
2013/06/08 Javascript
js css后面所带参数含义介绍
2013/08/18 Javascript
JavaScript中的函数(二)
2015/12/23 Javascript
不能不知道的10个angularjs英文学习网站
2016/03/23 Javascript
Jquery $when done then的用法详解
2016/05/20 Javascript
使用SVG基本操作API的实例讲解
2017/09/14 Javascript
浅析JS中回调函数及用法
2018/07/25 Javascript
解决JavaScript中0.1+0.2不等于0.3问题
2018/10/23 Javascript
JS监听事件的叠加和移除功能
2018/11/19 Javascript
Vue实现商品详情页的评价列表功能
2019/09/04 Javascript
JavaScript setInterval()与setTimeout()计时器
2019/12/27 Javascript
JS实现分页导航效果
2020/02/19 Javascript
JavaScript获取时区实现过程解析
2020/09/24 Javascript
简单介绍Python的Django框架加载模版的方式
2015/07/20 Python
python实现教务管理系统
2018/03/12 Python
TensorFlow用expand_dim()来增加维度的方法
2018/07/26 Python
Python中new方法的详解
2019/01/15 Python
使用Python-OpenCV向图片添加噪声的实现(高斯噪声、椒盐噪声)
2019/05/28 Python
python根据时间获取周数代码实例
2019/09/30 Python
jupyter notebook快速入门及使用详解
2020/11/13 Python
基于HTML5 audio元素播放声音jQuery小插件
2011/05/11 HTML / CSS
深入探究HTML5的History API
2015/07/09 HTML / CSS
详解HTML5中rel属性的prefetch预加载功能使用
2016/05/06 HTML / CSS
阿玛尼化妆品美国官网:Giorgio Armani Beauty
2017/02/02 全球购物
Why we need EJB
2016/10/20 面试题
模具专业自荐信
2014/05/29 职场文书
就业协议书
2014/09/12 职场文书
个人债务授权委托书
2014/10/17 职场文书
维稳工作情况汇报
2014/10/27 职场文书
python基于turtle绘制几何图形
2021/06/15 Python