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 相关文章推荐
19个很有用的 JavaScript库推荐
Jun 27 Javascript
Extjs显示从数据库取出时间转换JSON后的出现问题
Nov 20 Javascript
JavaScript通过元素的ID和name设置样式
Jul 08 Javascript
javascript实现漂亮的拖动层,窗口拖拽特效
Apr 24 Javascript
浅谈jquery点击label触发2次的问题
Jun 12 Javascript
基于JS实现bookstore静态页面的实例代码
Feb 22 Javascript
微信小程序开发之麦克风动画 帧动画 放大 淡出
Apr 18 Javascript
一个有意思的鼠标点击文字特效jquery代码
Sep 23 jQuery
详解vue 组件之间使用eventbus传值
Oct 25 Javascript
redux-saga 初识和使用
Mar 10 Javascript
Vue 中使用 CSS Modules优雅方法
Apr 09 Javascript
利用chrome浏览器进行js调试并找出元素绑定的点击事件详解
Jan 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
Zend Studio去除编辑器的语法警告设置方法
2012/10/24 PHP
php获取CSS文件中图片地址并下载到本地的方法
2014/12/02 PHP
php eval函数一句话木马代码
2015/05/21 PHP
关于php支持的协议与封装协议总结(推荐)
2017/11/17 PHP
ModelDialog JavaScript模态对话框类代码
2011/04/17 Javascript
方便实用的jQuery checkbox复选框全选功能简单实例
2013/10/09 Javascript
php,js,css字符串截取的办法集锦
2014/09/26 Javascript
JS模拟键盘打字效果的方法
2015/08/05 Javascript
基于jQuery实现自动轮播旋转木马特效
2015/11/02 Javascript
javascript之Array 数组对象详解
2016/06/07 Javascript
jQuery+CSS实现简单切换菜单示例
2016/07/27 Javascript
JavaScript判断浏览器及其版本信息
2017/01/20 Javascript
JavaScript解析任意形式的json树型结构展示
2017/07/23 Javascript
Vue单文件组件基础模板小结
2017/08/10 Javascript
利用Vue2.x开发实现JSON树的方法
2018/01/04 Javascript
vue.js整合vux中的上拉加载下拉刷新实例教程
2018/01/09 Javascript
jQuery表单元素过滤选择器用法实例分析
2019/02/20 jQuery
微信小程序五子棋游戏的棋盘,重置,对弈实现方法【附demo源码下载】
2019/02/20 Javascript
[53:21]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS LGD-CDEC
2014/05/22 DOTA
python中mechanize库的简单使用示例
2014/01/10 Python
python多线程扫描端口示例
2014/01/16 Python
python异常和文件处理机制详解
2016/07/19 Python
Python实现读取txt文件并转换为excel的方法示例
2018/05/17 Python
python3 kmp 字符串匹配的方法
2018/07/07 Python
centos6.8安装python3.7无法import _ssl的解决方法
2018/09/17 Python
对django xadmin自定义菜单的实例详解
2019/01/03 Python
将labelme格式数据转化为标准的coco数据集格式方式
2020/02/17 Python
Python基于pyjnius库实现访问java类
2020/07/31 Python
Python爬虫之Selenium下拉框处理的实现
2020/12/04 Python
AmazeUI 点击元素显示全屏的实现
2020/08/25 HTML / CSS
幼儿园教师岗位职责
2014/03/17 职场文书
车辆工程专业求职信
2014/06/14 职场文书
一般基层干部群众路线教育实践活动个人对照检查材料
2014/11/04 职场文书
tensorboard 可视化之localhost:6006不显示的解决方案
2021/05/22 Python
python 对图片进行简单的处理
2021/06/23 Python
Redis之RedisTemplate配置方式(序列和反序列化)
2022/03/13 Redis