实例讲解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 相关文章推荐
javascript showModalDialog,open取得父窗口的方法
Mar 10 Javascript
Javascript封装DOMContentLoaded事件实例
Jun 12 Javascript
js实现绿白相间竖向网页百叶窗动画切换效果
Mar 02 Javascript
Javascript调用函数方法的几种方式介绍
Mar 20 Javascript
JQuery实现超链接鼠标提示效果的方法
Jun 10 Javascript
使用PHP+JavaScript将HTML页面转换为图片的实例分享
Apr 18 Javascript
jQuery子元素过滤选择器用法示例
Sep 09 Javascript
js图片延迟加载(Lazyload)三种实现方式
Mar 01 Javascript
discuz表情的JS提取方法分析
Mar 22 Javascript
vue 使用Jade模板写html,stylus写css的方法
Feb 23 Javascript
微信小程序上传图片到php服务器的方法
May 23 Javascript
详解jQuery中的prop()使用方法
Jan 05 jQuery
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 MVC
2014/09/10 PHP
WampServer搭建php环境时遇到的问题汇总
2015/07/23 PHP
配置eAccelerator和XCache扩展来加速PHP程序的执行
2015/12/22 PHP
php自定义扩展名获取函数示例
2016/12/12 PHP
php简单随机字符串生成方法示例
2017/04/19 PHP
[原创]PHP实现字节数Byte转换为KB、MB、GB、TB的方法
2017/08/31 PHP
PHP中使用jQuery+Ajax实现分页查询多功能操作(示例讲解)
2017/09/17 PHP
PHP中常见的密码处理方式和建议总结
2018/10/14 PHP
PHP的PDO事务与自动提交
2019/01/24 PHP
Alliance vs Liquid BO3 第二场2.13
2021/03/10 DOTA
js编写trim()函数及正则表达式的运用
2013/10/24 Javascript
jquery easyui combox一些实用的小方法
2013/12/25 Javascript
javascript使用数组的push方法完成快速排序
2014/09/15 Javascript
详细介绍jQuery.outerWidth() 函数具体用法
2015/07/20 Javascript
jQuery仿360导航页图标拖动排序效果代码分享
2015/08/24 Javascript
前端开发之CSS原理详解
2017/03/11 Javascript
js屏蔽退格键(backspace或者叫后退键与F5)
2019/02/10 Javascript
vue实现淘宝购物车功能
2020/04/20 Javascript
[14:21]VICI vs EG (BO3)
2018/06/07 DOTA
Python下Fabric的简单部署方法
2015/07/14 Python
深入探究Django中的Session与Cookie
2017/07/30 Python
Python爬虫小技巧之伪造随机的User-Agent
2018/09/13 Python
python实现LBP方法提取图像纹理特征实现分类的步骤
2019/07/11 Python
python3+openCV 获取图片中文本区域的最小外接矩形实例
2020/06/02 Python
python中Django文件上传方法详解
2020/08/05 Python
用Python自动清理系统垃圾的实现
2021/01/18 Python
CSS3制作气泡对话框的实例教程
2016/05/10 HTML / CSS
HTML5 Canvas实现360度全景图的示例代码
2018/01/29 HTML / CSS
C#笔试题集合
2013/06/21 面试题
统计员岗位职责
2013/11/14 职场文书
家具公司总经理岗位职责
2014/07/08 职场文书
投资意向书
2014/07/30 职场文书
2015年教务主任工作总结
2015/07/22 职场文书
导游词范文之颐和园/重庆/云台山
2019/09/10 职场文书
python中的装饰器该如何使用
2021/06/18 Python
SpringAop日志找不到方法的处理
2021/06/21 Java/Android