实例讲解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 相关文章推荐
一个分享按钮的插件使用介绍(可扩展,内附开发制作流程)
Sep 19 Javascript
js动态添加onload、onresize、onscroll事件(另类方法)
Dec 26 Javascript
简单实用jquery版三级联动select示例
Jul 04 Javascript
GridView中获取被点击行中的DropDownList和TextBox中的值
Jul 18 Javascript
jQuery $.extend()用法总结
Jun 15 Javascript
无限树Jquery插件zTree的常用功能特性总结
Sep 11 Javascript
node.js中的console.warn方法使用说明
Dec 09 Javascript
解决webpack dev-server不能匹配post请求的问题
Aug 24 Javascript
React实现全局组件的Toast轻提示效果
Sep 21 Javascript
Node.js一行代码实现静态文件服务器的方法步骤
May 07 Javascript
微信小程序 搜索框组件代码实例
Sep 06 Javascript
解决idea开发遇到javascript动态添加html元素时中文乱码的问题
Sep 29 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使用curl发送json格式数据实例
2013/12/17 PHP
php base64 编码与解码实例代码
2017/03/21 PHP
jQuery当鼠标悬停时放大图片的效果实例
2013/07/03 Javascript
JS调试必备的5个debug技巧
2014/03/07 Javascript
javascript瀑布流式图片懒加载实例解析与优化
2016/02/23 Javascript
Three.js学习之Lamber材质和Phong材质
2016/08/04 Javascript
浅谈JS运算符&&和|| 及其优先级
2016/08/10 Javascript
详解JavaScript时间处理之几个月前或几个月后的指定日期
2016/12/21 Javascript
JavaScript数据结构之二叉查找树的定义与表示方法
2017/04/12 Javascript
React 高阶组件入门介绍
2018/01/11 Javascript
ajax请求data遇到的问题分析
2018/01/18 Javascript
手写简单的jQuery雪花飘落效果实例
2018/04/22 jQuery
加快Vue项目的开发速度的方法
2018/12/12 Javascript
JS中使用react-tooltip插件实现鼠标悬浮显示框
2019/05/15 Javascript
RxJS的入门指引和初步应用
2019/06/15 Javascript
vue学习笔记之过滤器的基本使用方法实例分析
2020/02/01 Javascript
Javascript ParentNode和ChildNode接口原理解析
2020/03/16 Javascript
查看Python安装路径以及安装包路径小技巧
2015/04/28 Python
关于python的bottle框架跨域请求报错问题的处理方法
2017/03/19 Python
python 实现分页显示从es中获取的数据方法
2018/12/26 Python
Ubuntu中配置TensorFlow使用环境的方法
2020/04/21 Python
Pycharm安装python库的方法
2020/11/24 Python
从一次项目重构说起CSS3自定义变量在项目的使用方法
2021/03/01 HTML / CSS
移动端开发HTML5页面点击按钮后出现闪烁或黑色背景的解决办法
2018/09/19 HTML / CSS
WiFi云数码相框:Nixplay
2018/07/05 全球购物
英国排名第一的停车场运营商:NCP
2019/08/26 全球购物
改变生活的男士内衣:SAXX Underwear
2019/08/28 全球购物
小区门卫岗位职责
2013/12/31 职场文书
竞争上岗演讲稿
2014/01/05 职场文书
公司租房协议书范本
2014/10/08 职场文书
民事诉讼代理词
2015/05/25 职场文书
采购部年度工作总结
2015/08/13 职场文书
2019西餐厅创业计划书范文!
2019/07/12 职场文书
OpenCV实现反阈值二值化
2021/11/17 Java/Android
Go语言特点及基本数据类型使用详解
2022/03/21 Golang
微信告警的zabbix监控系统 监控整个NGINX集群
2022/04/18 Servers