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 相关文章推荐
Jquery从头学起第四讲 jquery入门教程
Aug 01 Javascript
JS解决url传值出现中文乱码的另类办法
Apr 08 Javascript
JS图片根据鼠标滚动延时加载的实例代码
Jul 13 Javascript
jQuery 属性选择器element[herf*='value']使用示例
Oct 20 Javascript
js数组中如何随机取出一个值
Jun 13 Javascript
JavaScript中停止执行setInterval和setTimeout事件的方法
May 14 Javascript
Angular2  NgModule 模块详解
Oct 19 Javascript
浅谈Angular路由复用策略
Oct 04 Javascript
JS中的回调函数实例浅析
Mar 21 Javascript
JS检索下拉列表框中被选项目的索引号(selectedIndex)
Dec 17 Javascript
JavaScript日期库date-fn.js使用方法解析
Sep 09 Javascript
Vue3 响应式侦听与计算的实现
Nov 11 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
PHPMYADMIN 简明安装教程 推荐
2010/03/07 PHP
php中DOMElement操作xml文档实例演示
2013/03/26 PHP
PHP简单获取视频预览图的方法
2015/03/12 PHP
浅谈PHP的数据库接口和技术
2016/12/09 PHP
详解关于php的xdebug配置(编辑器vscode)
2019/01/29 PHP
PHP切割汉字的常用方法实例总结
2019/04/27 PHP
JavaScript delete 属性的使用
2009/10/08 Javascript
检测jQuery.js是否已加载的判断代码
2011/05/20 Javascript
推荐10个超棒的jQuery工具提示插件
2011/10/11 Javascript
解决jQuery动态获取手机屏幕高和宽的问题
2014/05/07 Javascript
js添加select下默认的option的value和text的方法
2014/10/19 Javascript
浅谈javascript获取元素transform参数
2015/07/24 Javascript
Javascript闭包实例详解
2015/11/29 Javascript
利用jQuery来动态为属性添加或者删除属性的简单方法
2016/12/02 Javascript
深入理解jQuery()方法的构建原理
2016/12/05 Javascript
JS中检测数据类型的几种方式及优缺点小结
2016/12/12 Javascript
nodejs acl的用户权限管理详解
2018/03/14 NodeJs
利用Webpack实现小程序多项目管理的方法
2019/02/25 Javascript
vue实现按需加载组件及异步组件功能
2019/05/27 Javascript
Vue的属性、方法、生命周期实例代码详解
2019/09/17 Javascript
原生js实现碰撞检测
2020/03/12 Javascript
vue 使用 vue-pdf 实现pdf在线预览的示例代码
2020/04/26 Javascript
详解Django缓存处理中Vary头部的使用
2015/07/24 Python
python实现的二叉树定义与遍历算法实例
2017/06/30 Python
Python并发编程协程(Coroutine)之Gevent详解
2017/12/27 Python
python 对多个csv文件分别进行处理的方法
2019/01/07 Python
python 带时区的日期格式化操作
2020/10/23 Python
员工年终演讲稿
2014/01/03 职场文书
《小池塘》教学反思
2014/02/28 职场文书
2014预备党员党课学习心得范文
2014/07/08 职场文书
年检委托书
2014/08/30 职场文书
违纪学生保证书
2015/02/27 职场文书
李强优秀员工观后感
2015/06/16 职场文书
新郎结婚感言
2015/07/31 职场文书
三好学生主要事迹怎么写
2015/11/03 职场文书
C3 线性化算法与 MRO之Python中的多继承
2021/10/05 Python