实例讲解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的$(document).ready()和onload的加载顺序
May 26 Javascript
使用jQuery动态加载js脚本文件的方法
Apr 03 Javascript
浅析javascript中函数声明和函数表达式的区别
Feb 15 Javascript
IE中document.createElement的iframe无法设置属性name的解决方法
Sep 14 Javascript
JavaScript匿名函数之模仿块级作用域
Dec 12 Javascript
详解JavaScript中数组和字符串的lastIndexOf()方法使用
Mar 13 Javascript
针对BootStrap中tabs控件的美化和完善(推荐)
Jul 06 Javascript
微信小程序实现根据字母选择城市功能
Aug 16 Javascript
推荐10款扩展Web表单的JS插件
Dec 25 Javascript
javascript使用链接跨域下载图片
Nov 01 Javascript
Vue.js实现大屏数字滚动翻转效果
Nov 29 Javascript
javascript 代码是如何被压缩的示例代码
May 06 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
CodeIgniter基本配置详细介绍
2013/11/12 PHP
php二维数组转成字符串示例
2014/02/17 PHP
JS下高效拼装字符串的几种方法比较与测试代码
2010/04/15 Javascript
idTabs基于JQuery的根据URL参数选择Tab插件
2012/04/11 Javascript
一个封装js代码-----展开收起效果示例
2013/07/03 Javascript
使用jquery解析XML示例代码
2014/09/05 Javascript
一个不错的js html页面倒计时可精确到秒
2014/10/22 Javascript
AngularJS表单编辑提交功能实例
2015/02/13 Javascript
javascript实现的淘宝旅行通用日历组件用法实例
2015/08/03 Javascript
JS集成fckeditor及判断内容是否为空的方法
2016/05/27 Javascript
浅谈JavaScript前端开发的MVC结构与MVVM结构
2016/06/03 Javascript
JS点击某个图标或按钮弹出文件选择框的实现代码
2016/09/27 Javascript
微信小程序 navigation API实例详解
2016/10/02 Javascript
input file上传 图片预览功能实例代码
2016/10/25 Javascript
three.js实现3D视野缩放效果
2017/11/16 Javascript
微信小程序常用的3种提示弹窗实现详解
2019/09/19 Javascript
Windows上配置Emacs来开发Python及用Python扩展Emacs
2015/11/20 Python
解决出现Incorrect integer value: '' for column 'id' at row 1的问题
2017/10/29 Python
Python标准库inspect的具体使用方法
2017/12/06 Python
python中正则表达式的使用方法
2018/02/25 Python
Python第三方Window模块文件的几种安装方法
2018/11/22 Python
通过pykafka接收Kafka消息队列的方法
2018/12/27 Python
Python字符串通过'+'和join函数拼接新字符串的性能测试比较
2019/03/05 Python
Python实现手机号自动判断男女性别(实例解析)
2019/12/22 Python
Python logging模块写入中文出现乱码
2020/05/21 Python
python中元组的用法整理
2020/06/15 Python
Pycharm新手使用教程(图文详解)
2020/09/17 Python
CSS3 translate导致字体模糊的实例代码
2019/08/30 HTML / CSS
英国家庭珠宝商:T. H. Baker
2018/02/08 全球购物
什么是makefile? 如何编写makefile?
2013/01/02 面试题
幼儿园中班下学期评语
2014/04/18 职场文书
家长对学生的评语
2014/04/18 职场文书
工作证明范本(2篇)
2014/09/14 职场文书
欢迎新生标语2015
2015/07/16 职场文书
2019自荐信范文集锦!
2019/07/03 职场文书
idea下配置tomcat避坑详解
2022/04/12 Servers