`

jQuery事件命名空间的深入分析

 
阅读更多
今天群里的同学突然很疑惑的问:this.$element.on(\'keyup.dismiss.bs.modal\',function{}) 这段代码里的 keyup.dismiss.bs.modal 是啥?
 

命名空间
复制一份维基百科的说法:

命名空间(英语:Namespace)表示标识符(identifier)的可见范围。一个标识符可在多个命名空间中定义,它在不同命名空间中的含义是互不相干的。这样,在一个新的命名空间中可定义任何标识符,它们不会与任何已有的标识符发生冲突,因为已有的定义都处于其它命名空间中。

简单点说:

假如网吧里有好多人,都没有名字的话,你妈妈喊你回家吃饭的时候,该怎么叫谁呢? 所以聪明的妈妈,给你起了一个名字,下次妈妈只需要站在门口大喊一声“xx,回家吃饭了!”

jQuery命名空间的出现
注意这里说的只是jquery1.7,因为它推荐大家使用 on 代替以前的 bind,使用 off 代替以前的 unbind。因为所有的事件都是通过 on 来绑定的。

好嘞!绑一个试试

 代码如下 复制代码
$(document).on('click', function(){
  ....
});

挺好用,为了不让它多次触发,我要解绑掉

 代码如下 复制代码
$(document).off('click')

细心的同学可能已经发现了,如果我只想解绑某个特定的事件,就比较蛋疼了,举个栗子!

 代码如下 复制代码
$(document).on('click', function(){
  console.log(1111);
});
$(document).on('click', function(){
  console.log(222);
});
$(document).on('click', function(){
  console.log(333);
});

我觉得 打印出111的比较不合群,想踢出去,这时候会不会很无语呢?

聪明的你马上想到 我可以这样啊!

 代码如下 复制代码

function a(){
  console.log(1111);  
}

$(document).on('click', a);
$(document).off('click', a);

是滴! 你可以这样!但是你不觉得很麻烦么?

我们可以这样

 代码如下 复制代码
$(document).on('click.a', function(){
  console.log(123);
})
$(document).off('click.a');

该方法最早出现在jQuery1.3.2中

代码实现如下(1.3.2中的实现):

 代码如下 复制代码

// Namespaced event handlers
var namespaces = type.split(".");
type = namespaces.shift();
handler.type = namespaces.slice().sort().join(".");

// Get the current list of functions bound to this event
var handlers = events[type];

if ( jQuery.event.specialAll[type] )
  jQuery.event.specialAll[type].setup.call(elem, data, namespaces);

// Init the event handler queue
if (!handlers) {
  handlers = events[type] = {};

  // Check for a special event handler
  // Only use addEventListener/attachEvent if the special
  // events handler returns false
  if ( !jQuery.event.special[type] || jQuery.event.special[type].setup.call(elem, data, namespaces) === false ) {
    // Bind the global event handler to the element
    if (elem.addEventListener)
      elem.addEventListener(type, handle, false);
    else if (elem.attachEvent)
      elem.attachEvent("on" + type, handle);
  }
}

命名空间配合trigger的使用

 代码如下 复制代码

$(document).on('click.a', funciton(){
  console.log(111);  
});
$(document).on('click', funciton(){
  console.log(222);  
});

$(document).trigger('click.a');

//output: 111

还可以这样

 代码如下 复制代码

$(document).on('click.a', funciton(){
  console.log(111);  
});
$(document).on('click', funciton(){
  console.log(222);  
});

$(document).trigger('click!');

//output: 222

注意:
! 在jquery1.9之后被删除相应实现

事件绑定命名空间

命名空间方式的一般使用:

 代码如下 复制代码

$('.class').bind('click.namespace', function(){}); 
$('.class').trigger('click.namespace');
$('.class').unbind('click.namespace');


同一个命名空间的事件可以直接用命名空间批量解绑。

 代码如下 复制代码

$('.class').bind('click.namespace', function(){});
$('.class').bind('blur.namespace', function(){});
$('.class').unbind('.namespace');

 

 

 

 
分享到:
评论

相关推荐

    jquery命名空间模拟

    在JavaScript编程中,全局变量和函数常常会导致命名冲突,特别是在...对于`registNamespase.js`的具体内容,需要实际查看代码才能提供详细的解析和示例,但上述信息应该为你提供了理解和使用jQuery命名空间的基本框架。

    jQuery.js执行过程分析

    本文将深入分析jQuery.js的核心执行流程,帮助读者理解其内部机制,尤其是jQuery如何利用构造函数和原型链实现其强大的功能。 #### 二、jQuery的基础构建 1. **防止重复加载**: 在jQuery的加载过程中,首先会...

    深入PHP与jQuery开发

    2. PHP高级特性:包括对象编程、命名空间、文件和目录操作、数据库交互(如MySQLi或PDO)、会话管理、cookies、错误和日志记录等。 3. jQuery基础:介绍如何引入jQuery库,理解选择器、DOM操作、事件处理、动画效果...

    jQuery源码分析-03构造jQuery对象

    根据所提供的文件内容,本节将深入分析如何构建jQuery对象及其核心构造逻辑。首先,让我们从整体上理解jQuery构造函数的设计思路。 ##### 总体结构 在jQuery的源码中,通过立即执行函数表达式(IIFE)来定义jQuery...

    Beginning jQuery:From the Basics of jQuery to Writing your Own Plug-ins

    6. **jQuery插件开发**:深入部分,读者将学习如何设计和实现自定义的jQuery插件,包括插件结构、命名空间、选项和回调函数的使用,从而拓展jQuery的功能。 7. **源码分析**:附带的源代码可以帮助读者更好地理解和...

    jquery1.43源码分析(核心部分)[收集].pdf

    })()`,这是一个立即执行的函数表达式(IIFE),确保了jQuery对象在全局作用域中被定义,但不会污染全局命名空间。内部的`jQuery`函数是构造函数,用于创建jQuery对象实例。在jq2处,我们可以看到构造函数接受两个...

    jquery1.43源码分析(核心部分)

    这里使用了 IIFE 来创建一个私有作用域,这样可以避免污染全局命名空间,并且允许 jQuery 内部定义私有变量和方法。 #### 三、jQuery 构造函数 ```javascript var jQuery = function(selector, context) { return...

    Jquery源码资料_jquery_

    源码中,我们可以学习到如何利用$.fn.extend()来添加新的方法,以及如何利用命名空间和闭包保持插件的独立性。 6. **性能优化** - 遍历优化:jQuery提供了多种遍历DOM的方法,如`.each()`和`.map()`。源码中,我们...

    jquery源码 带格式

    该函数接收两个参数:`window`对象和`undefined`,后者用于确保即使在全局命名空间中存在`undefined`变量的情况下,代码仍然可以正常运行。 #### 核心变量定义 - `rootjQuery`: 提供了一个对整个文档的根jQuery...

    jQuery Design Patterns

    1. **模块化编程**:书中会介绍如何使用命名空间、立即执行函数表达式(IIFE)以及AMD(Asynchronous Module Definition)和CommonJS模块加载机制来组织代码,避免全局变量污染,提高代码的可复用性和可测试性。...

    jquery拖拽功能

    `监听`mousedown`事件,这里还使用了命名空间(`.chartdrag`)来区分不同的事件处理程序。 - 获取鼠标按下时的位置(`downX`, `downY`)以及元素的初始位置(`downLeft`, `downTop`)。 4. **处理鼠标移动事件**:...

    jquery左侧浮动层热门新闻列表滑动动画展示

    6. **插件架构**:学习如何编写可复用的jQuery插件,包括命名空间、参数传递和暴露公共方法。 通过深入研究这个实例,你可以提高自己的jQuery技能,同时也可以学习如何创建自己的自定义插件,从而提升你的Web开发...

    jquery-1.4.4 + jquery-2.1.1 + jquery-3.1.1

    2.1.1版本引入了一些新的API,如`.on()`的命名空间功能,增强了事件处理的灵活性。此外,这个版本的$.ajax()函数也有了改进,如支持跨域请求的CORS配置。 最后,jQuery 3.1.1是2016年的发布,标志着jQuery进入了3.x...

    ecshop和jquery冲突的解决方法

    这主要是因为Ecshop默认使用了一套自定义的JavaScript函数库(如eCS),而这些函数库与jQuery存在命名空间上的重叠或函数名相同的情况。当两者同时存在于同一个页面时,就可能发生冲突,导致某些功能失效。 #### ...

    锋利的JQuery源码下载

    我们可以看到,jQuery使用了闭包来保护内部变量,以及立即执行函数(IIFE)来避免污染全局命名空间,这些都是JavaScript高级编程技巧的体现。 在DOM操作方面,jQuery提供了一套优雅的API,如`$(selector)`用于选取...

    jQuery 1.9.1源码分析系列(十)事件系统之主动触发事件和模拟冒泡处理

    `jQuery.event.trigger`是触发所有类型事件的支持API,主要包括普通浏览器事件(可能包含命名空间)和自定义事件。它不采用`.click()`等直接触发事件的捷径,而是采用统一的处理流程: 1. 获取要触发的事件,如果...

    JQuery王兴魁源码

    1. **源码结构**:理解jQuery的模块化设计,如如何组织函数和类,以及如何通过命名空间和闭包来管理作用域。 2. **性能优化**:学习jQuery如何通过缓存DOM查询结果、延迟执行和选择器优化等方式提高性能。 3. **...

    《锋利的jQuery》实例源码

    通过封装功能并利用jQuery的命名空间和插件模式,可以创建复用性强的代码模块。 通过研究《锋利的jQuery》实例源码,读者可以加深对jQuery核心概念的理解,并且能够在实际项目中灵活应用。同时,这些源码也展示了...

    在线rss阅读器(.net+jquery)

    在.NET中,可以使用XML解析器如System.Xml命名空间中的类来读取和解析RSS XML文档。解析后的数据可以被存储到服务器端的数据结构中,然后通过Ajax请求传递到客户端,由jQuery处理并展示在页面上。 此外,考虑到项目...

    jquery in action second

    作者分享了许多最佳实践,如避免全局变量污染、使用命名空间、编写可重用的函数和模块化代码等。这些技巧有助于提高代码的可读性、可维护性和性能。 ### 实战案例分析 《jQuery in Action Second Edition》不仅仅...

Global site tag (gtag.js) - Google Analytics