jQuery源码研究——解决命名冲突
在项目中难免不去使用多个插件,如此一来这些插件就有可能出现一样的名称,当出现同名变量时后一个将会覆盖上一个,这样的话我们就无法同时使用多个插件了。
当遇到这种情况我们可以手动去修改插件源码把它的名字改了,但这种方式是不明智的,假如说你使用的某个插件它的版本更新了,那么你还得再次去修改它的源码,再则随意去修改插件源码对团队来说是混乱不堪的,因此最好的方式应该是由插件自身来解决命名冲突,在jQuery中有一个noConflict方法,这个方法就是用来解决命名冲突的。
jQuery.noConflict
var _jQuery = window.jQuery,
_$ = window.$;
jQuery.noConflict = function( deep ) {
if ( window.$ === jQuery ) {
window.$ = _$;
}
if ( deep && window.jQuery === jQuery ) {
window.jQuery = _jQuery;
}
return jQuery;
};
if ( !noGlobal ) {
window.jQuery = window.$ = jQuery;
}
return jQuery;
代码中的window是全局的,jQuery是局部的,window.jQuery把全局中的jQuery保存下来,window.$的作用同上,将全局中的jQuery和$保存下来是为了当我们使用jQuery.noConflict方法时好将$和jQuery还原成之前的,因为在没有使用jQuery.noConflict方法前,全局的$和jQuery已经被咱们强大的jQuery给覆盖了,因此如果你不使用jQuery.noConflict方法将无法使用之前的那个插件,那么当我们使用jQuery.noConflict方法后jQuery不就被其他插件给覆盖了吗,插件确实会把jQuery给覆盖,不过在jQuery.noConflict方法中,它最后又将jQuery返回了,因此我们只需要将这个返回的jQuery取一个新的名字就好了。
因此我们可以看出jQuery在解决命名冲突上它是先将插件保存下来,然后使用自己的jQuery将插件覆盖,当调用jQuery.noConflict方法时再将插件放出并将自己返回。
需要注意的是此方法只能解决在jQuery之前导入的插件,因为如果在jQuery之后导入,那么jQuery就已经被覆盖了,自然也就无法使用noConflict方法。
在解决命名冲突方面,当jQuery检查到我们有使用CommonJS时,$和jQuery将不会暴露到window中,具体代码就是下面这句了
if ( !noGlobal ) {
window.jQuery = window.$ = jQuery;
}
这个noGlobal
是从这里传过去的
( function( global, factory ) {
"use strict";
// 判断是否有使用CommonJS
if ( typeof module === "object" && typeof module.exports === "object" ) {
module.exports = global.document ?
// true:不在window上暴露$和jQuery,因此使用CommonJS后你将无法在全局调用jQuery
factory( global, true ) :
function( w ) {
if ( !w.document ) {
throw new Error( "jQuery requires a window with a document" );
}
return factory( w );
};
} else {
factory( global );
}
} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ){
// 省略
});
jQuery.noConflict
注释版
var
// 将全局jQuery保存起来
_jQuery = window.jQuery,
// 将全局$保存起来
_$ = window.$;
// 解决命名冲突 当传递一个true值则会将$和jQuery命名权限都交出
jQuery.noConflict = function( deep ) {
// 如果现在使用的是jQuery则将$权限交出,给其他插件使用
if ( window.$ === jQuery ) {
window.$ = _$;
}
// 如果deep为true并且使用的是jQuery则将jQuery命名权限交出,给其他插件使用
if ( deep && window.jQuery === jQuery ) {
window.jQuery = _jQuery;
}
// 返回jQuery,我们可以去重新命名
return jQuery;
};
// 暴露jQuery和$标识符
// 关于在全局暴露jQuery的相关讨论:https://github.com/jquery/jquery/pull/557
if ( !noGlobal ) {
window.jQuery = window.$ = jQuery;
}
return jQuery;
} );
jQuery源码研究——解决命名冲突的更多相关文章
- jQuery源码研究——怎么看源码
废话 这几天有想看源码的想法,于是就开始了源码的研究,经过几天的摸索发现看源码还是有点技巧在里面的,想着把这些东东写下来作为一个小总结. 在一个多月前我对Vue源码进行了一次研究,那时看源码的方式基本 ...
- jquery源码中noConflict(防止$和jQuery的命名冲突)的实现原理
jquery源码中noConflict(防止$和jQuery的命名冲突)的实现原理 最近在看jquery源码分析的视频教学,希望将视频中学到的知识用博客记录下来,更希望对有同样对jquery源码有困惑 ...
- 原生JS研究:学习jquery源码,收集整理常用JS函数
原生JS研究:学习jquery源码,收集整理常用JS函数: 1. JS获取原生class(getElementsByClass) 转自:http://blog.csdn.net/kongjiea/ar ...
- 【菜鸟学习jquery源码】数据缓存与data()
前言 最近比较烦,深圳的工作还没着落,论文不想弄,烦.....今天看了下jquery的数据缓存的代码,参考着Aaron的源码分析,自己有点理解了,和大家分享下.以后也打算把自己的jquery的学习心得 ...
- Jquery源码分析与简单模拟实现
前言 最近学习了一下jQuery源码,顺便总结一下,版本:v2.0.3 主要是通过简单模拟实现jQuery的封装/调用.选择器.类级别扩展等.加深对js/Jquery的理解. 正文 先来说问题: 1. ...
- jQuery源码逐行分析学习02(第一部分:jQuery的一些变量和函数)
第一次尝试使用Office Word,方便程度大大超过网页在线编辑,不过初次使用,一些内容不甚熟悉,望各位大神见谅~ 在上次的文章中,把整个jQuery的结构进行了梳理,得到了整个jQuery的简化结 ...
- 从jquery源码中看类型判断和数组的一些操作
在深入看jquery源码中,大家会发现源码写的相当巧妙.那我今天也通过几个源码中用到的技巧来抛砖引玉,希望大家能共同研究源码之精华,不要囫囵吞枣. 1.将类数组转化成数组 我想大家首先想到的方法是fo ...
- jQuery源码笔记(一):jQuery的整体结构
jQuery 是一个非常优秀的 JS 库,与 Prototype,YUI,Mootools 等众多的 Js 类库相比,它剑走偏锋,从 web 开发的实用角度出发,抛除了其它 Lib 中一些中看但不实用 ...
- jQuery 源码解析一:jQuery 类库整体架构设计解析
如果是做 web 的话,相信都要对 Dom 进行增删查改,那大家都或多或少接触到过 jQuery 类库,其最大特色就是强大的选择器,让开发者脱离原生 JS 一大堆 getElementById.get ...
随机推荐
- 自制ZigBee协议分析仪
关键词 ZigBee Sniffer 协议 分析仪 自制 CC2530 CC2531 在开发ZigBee / Bluetooth的过程,难免会要用到Sniffer工具,Packet Sni ...
- 基于ARM的车牌识别技术研究与实现
在云盘里包含了我本科毕业设计的全部资料和代码.主要涉及下面摘要中的几个部分.虽然系统无法实用,但是适合机器视觉和嵌入式方向的入门.希望能对有志从事相关方向的朋友有所帮助.本人现在在深圳从事机器视觉算法 ...
- [国嵌攻略][164][USB驱动程序设计]
USB驱动模型 1.USB host controller driver(主控器驱动):为USB主控制器提供驱动程序 2.USB core(USB核心):连接USB主控制器驱动和USB设备驱动 3.U ...
- C++ 不定参数(转)
转自:http://www.cnblogs.com/jerrychenfly/archive/2010/10/22/1858232.html 下面,我们来看一下,如果在c++的函数中接收数量不定的函数 ...
- 阻止安卓实体返回键后退的网页js实现
提供两种解决方法吧,都是网上来的,侵权删,毕竟我等只是搞后端的-- 第一种方法: // 阻止安卓实体键后退 // 页面载入时使用pushState插入一条历史记录 history.pushState( ...
- 评论发布信息可插入QQ表情
demo例子: HTML文本内容: <template> <div id="publish"> <!-- 发布内容输入框,利用Html5的新属性con ...
- DEDECMS去掉自动生成首页或栏目后面带的index.html
Dede默认生成首页后,首页的链接后面会多出一个index.html.据官方说法这样有利于网站优化.但是这个index.html怎么看都不舒服,而且也不利于seo中主页url的统一.因为我的网站的ur ...
- PowerShell 异常处理
在使用 PowerShell 的过程中,发现它的异常处理并不像想象中的那么直观,所以在这里总结一下. Terminating Errors 通过 ThrowTerminatingError 触发的错误 ...
- 自学python Day01
What is Python 1. 面向对象的解释行语言 2. 非常丰富的库 3. 使用制表符作为语句缩进 (white space) 优点: 1. 免费.开源 2. 可扩展性.可嵌入性 3. 非常丰 ...
- python_20_socket
什么是socket? -- 通过各种协议,发送和接收数据,实现网络通信 -- 在python3中,网络发送只能发二进制数据 OSI七层模型是什么? 应用 表示 会话 传输 网络 ...