jQuery中noConflict()用法实例分析


Posted in Javascript onFebruary 08, 2015

本文实例讲述了jQuery中noConflict()用法。分享给大家供大家参考。具体分析如下:

jQuery默认使用"$"操作符,$ 符号只是 window.jQuery 对象的一个引用,jQuery.noConflict() ,这个函数将变量$的控制权让渡给第一个实现它的那个库。这有助于确保jQuery不会与其他库的$对象发生冲突。在运行这个函数后,就只能使用jQuery变量访问jQuery对象。例如,在要用到$("div p")的地方,就必须换成jQuery("div p")。

一、"$"操作符

1、jQuery默认使用"$"操作符,prototype等其他框架也是是使用"$",于是,如果jQuery在其他库之后引入,那么jQuery将获得"$"使用权。这样的情况也很容易理解,毕竟JS是从上到下流式执行的。

2、如果在其他使用"$"的库之前引入jQuery,那么jQuery将不会占用"$"。

提示:在其他 JavaScript 库为其函数使用 $ 时,该方法很有用。

我们在jquery中获取变量都会使用到$,但是还有很多插件都是可以使用$这个符号了,如果我们同时要引用就会导致出现问题了,jquery为了防止这种事情发生就引入了noconflict()

二、jQuery.noConflict的定义
 
jQuery.noConflict 方法包含一个可选的布尔参数,用以决定移交 $ 引用的同时是否移交 jQuery 对象本身:

jQuery.noConflict([removeAll])

函数的说明:

缺省情况下,执行 noConflict 会将变量 $ 的控制权移交给第一个产生 $ 的库;当 removeAll 设置为 true 时,执行 noConflict 则会将 $ 和 jQuery 对象本身的控制权全部移交给第一个产生他们的库。
 
三、jQuery.noConflict源码分析
 
jQuery 源码开头,首先做的一件事情是这样的:

// Map over jQuery in case of overwrite
_jQuery = window.jQuery,
// Map over the $ in case of overwrite
_$ = window.$,

容易理解的是,jQuery 通过两个私有变量映射了 window 环境下的 jQuery 和 $ 两个对象,以防止变量被强行覆盖。一旦 noConflict 方法被调用,则通过 _jQuery, _$, jQuery, $ 四者之间的差异,来决定控制权的移交方式,具体的代码如下:

noConflict: function( deep ) {
 if ( window.$ === jQuery ) {
 window.$ = _$;
 }
 if ( deep && window.jQuery === jQuery ) {
 window.jQuery = _jQuery;
 }
 return jQuery;
}

再来看上面所说的参数设定问题,如果 deep 没有设置,_$ 覆盖 window.$,此时 jQuery 别名 $ 失效,但 jQuery 本身完好无损。如果有其他类库或代码重新定义了 $ 变量,它的控制权就完全交接出去了。反之如果 deep 设置为 true 的话,_jQuery 覆盖 window.jQuery,此时 $ 和 jQuery 都将失效。
这种操作的好处是,不管是框架混用还是 jQuery 多版本共存这种高度冲突的执行环境,由于 noConflict 方法提供的移交机制,以及本身返回未被覆盖的 jQuery 对象,完全能够通过变量映射的方式解决冲突。

四、jQuery.noConflict实例
 
1、将 $ 引用的对象映射回原始的对象:

jQuery.noConflict();
jQuery("div p").hide(); // 使用 jQuery
$("content").style.display = "none"; // 使用其他库的 $()

2、恢复使用别名 $,然后创建并执行一个函数,在这个函数的作用域中仍然将 $ 作为 jQuery 的别名来使用。在这个函数中,原来的 $ 对象是无效的。这个函数对于大多数不依赖于其他库的插件都十分有效:

jQuery.noConflict();
(function($) { 
 $(function() {
  // 使用 $ 作为 jQuery 别名的代码
 });
})(jQuery);
... // 其他用 $ 作为别名的库的代码

3、可以将 jQuery.noConflict() 与简写的 ready 结合,使代码更紧凑:

jQuery.noConflict()(function(){
  // 使用 jQuery 的代码
});
... // 其他库使用 $ 做别名的代码

4、创建一个新的别名用以在接下来的库中使用 jQuery 对象:

var j = jQuery.noConflict();
j("div p").hide();  // 基于 jQuery 的代码
$("content").style.display = "none";// 基于其他库的 $() 代码

5、完全将 jQuery 移到一个新的命名空间:

var dom = {};
dom.query = jQuery.noConflict(true);
//结果:
dom.query("div p").hide();  // 新 jQuery 的代码
$("content").style.display = "none";  // 另一个库 $() 的代码
jQuery("div > p").hide();  // 另一个版本 jQuery 的代码

希望本文所述对大家的jQuery程序设计有所帮助。

Javascript 相关文章推荐
20个最新的jQuery插件
Jan 13 Javascript
一个支持任意尺寸的图片上下左右滑动效果
Aug 24 Javascript
jQuery控制网页打印指定区域的方法
Apr 07 Javascript
javascript实现根据时间段显示问候语的方法
Jun 18 Javascript
js滑动提示效果代码分享
Mar 10 Javascript
JS定时检测任务任务完成后执行下一步的解决办法
Dec 22 Javascript
AngularJS折叠菜单实现方法示例
May 18 Javascript
js实现本地图片文件拖拽效果
Jul 18 Javascript
es6学习之解构时应该注意的点
Aug 29 Javascript
node跨域转发 express+http-proxy-middleware的使用
May 31 Javascript
JavaScript引用类型RegExp基本用法详解
Aug 09 Javascript
详解JavaScript中Arguments对象用途
Aug 30 Javascript
jquery实现聚光灯效果的方法
Feb 06 #Javascript
js实现Select下拉框具有输入功能的方法
Feb 06 #Javascript
JQuery中serialize()用法实例分析
Feb 06 #Javascript
jQuery中on()方法用法实例详解
Feb 06 #Javascript
JS实现文字向下滚动完整实例
Feb 06 #Javascript
jquery中filter方法用法实例分析
Feb 06 #Javascript
Jquery对select的增、删、改、查操作
Feb 06 #Javascript
You might like
php IP转换整形(ip2long)的详解
2013/06/06 PHP
php实现图形显示Ip地址的代码及注释
2014/01/20 PHP
php实现给图片加灰色半透明效果的方法
2014/10/20 PHP
php使用ZipArchive函数实现文件的压缩与解压缩
2015/10/27 PHP
CI框架教程之优化验证码机制详解【验证码辅助函数】
2019/04/16 PHP
jquery 简短右键菜单 多浏览器兼容
2010/01/01 Javascript
能说明你的Javascript技术很烂的五个原因分析
2011/10/28 Javascript
Jquery中children与find之间的区别详细解析
2013/11/29 Javascript
教你在heroku云平台上部署Node.js应用
2014/07/30 Javascript
微信中一些常用的js方法汇总
2015/03/12 Javascript
XML、HTML、CSS与JS的区别整理
2016/02/18 Javascript
bootstrap-wysiwyg结合ajax实现图片上传实时刷新功能
2016/05/27 Javascript
javascript淘宝主图放大镜功能
2016/10/20 Javascript
浅谈vue自定义全局组件并通过全局方法 Vue.use() 使用该组件
2017/12/07 Javascript
详解Vue2.0配置mint-ui踩过的那些坑
2018/04/23 Javascript
详解Webpack-dev-server的proxy用法
2018/09/08 Javascript
es6数组的flat(),flatMap()函数用法实例分析
2020/04/18 Javascript
利用PHP实现递归删除链表元素的方法示例
2020/10/23 Javascript
[58:37]Serenity vs Fnatic 2018国际邀请赛淘汰赛BO1 8.21
2018/08/22 DOTA
python访问类中docstring注释的实现方法
2015/05/04 Python
Python从使用线程到使用async/await的深入讲解
2018/09/16 Python
Django命名URL和反向解析URL实现解析
2019/08/09 Python
tensorflow estimator 使用hook实现finetune方式
2020/01/21 Python
python连接mysql有哪些方法
2020/06/24 Python
Exoticca英国:以最优惠的价格提供豪华异国情调旅行
2018/10/18 全球购物
美国精品地毯网站:Boutique Rugs
2020/03/04 全球购物
英国银首饰公司:e&e Jewellery
2021/02/11 全球购物
EntityManager都有哪些方法
2013/11/01 面试题
short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
2014/09/26 面试题
房产转让协议书
2014/04/11 职场文书
建筑专业毕业生自荐信
2014/05/25 职场文书
自主招生学校推荐信
2014/09/26 职场文书
师德自我剖析材料范文
2014/10/06 职场文书
个人职业及收入证明
2014/10/13 职场文书
2015年秋季运动会加油稿
2015/07/22 职场文书
Java 使用类型为Object的变量指向任意类型的对象
2022/04/13 Java/Android