jQuery中noconflict函数的实现原理分解


Posted in Javascript onFebruary 03, 2015

jQuery中,noconflict是用来防止变量冲突,用来释放变量控制权的一个重要方法。我们知道,jQuery中对外提供有两个全局变量,$和jQuery,虽然jQuery只产生了两个全局变量,极少情况下才会出现冲突,但是如果网页中如果包涵较多的类库,有自定义$或jQuery全局变量的存在时,就产生冲突。

jQuery提供的noconflict函数很好的解决了变量冲突问题,无论是$或者jQuery冲突都可以解决,接下来我们就来分析一下jQuery的冲突处理。

先来看一下jQuery源码中noconflict的实现:

(function(window,undefined){
var 
// Map over jQuery in case of overwrite
_jQuery = window.jQuery,
// Map over the $ in case of overwrite
_$ = window.$,
jQuery.extend({
noConflict: function( deep ){
 if ( window.$ === jQuery ) {
 window.$ = _$;
 }
 if ( deep && window.jQuery === jQuery ) {
 window.jQuery = _jQuery;
 }
 return jQuery;
}
})
}(window)

在这里jQuery.extend是jQuery扩展静态属性的方法,这里可以看成直接在jQuery上附加noConflict方法。在匿名函数的内部,分别定义内部变量_jQuery和_$用来存储window.jQuery和window.$, 这么做的用作在于用内部变量保存jQuery运行之前这两个全局变量的状态, 以便在后面的防冲突操作中还原这两个变量。noConflict可处理$和jQuery这两个变量冲突的情况,默认处理$,传入一个true参数,则处理jQuery冲突的情况。
window.$ === jQuery用来判断全局变量是否等于jQuery,如果等于,则重新还原全局变量$为jQuery运行之前的变量(存储在内部变量 _$ 中);deep && window.jQuery === jQuery 当开启深度冲突处理并且全局变量jQuery等于内部jQuery,则把全局jQuery还原成之前的状况。判断window.$ === jQuery和window.jQuery=jQuery的意义在于保护已经定义的变量不被重写,如下面的代码:

//引入jQuery库
var $="String";
var jq=jQuery.noconflict();
var jQuery="This is a line";
var j=jq.noconflict(true);
console.log($);//这里如果没有window.$===jQuery这句判断,那么$将会等于undefined而不是"String"。
console.log(jQuery); //同上,如果没有判断window.jQuery===jQuery,重新定义的jQuery就会被undefined覆盖。

整个运行流程参加下图:

jQuery中noconflict函数的实现原理分解

noConflict返回的是jQuery库内部的jQuery构造函数, 像使用$一样尽情使用它吧!

Javascript 相关文章推荐
jquery中eq和get的区别与使用方法
Apr 14 Javascript
js中AppendChild与insertBefore的用法详细解析
Dec 16 Javascript
获取鼠标在div中的相对位置的实现代码
Dec 30 Javascript
生成二维码方法汇总
Dec 26 Javascript
javascript中数组的定义及使用实例
Jan 21 Javascript
javascript检测flash插件是否被禁用的方法
Jan 14 Javascript
jQuery插件实现图片轮播特效
Jun 16 Javascript
使用Bootstrap Tabs选项卡Ajax加载数据实现
Dec 23 Javascript
vue微信分享 vue实现当前页面分享其他页面
Dec 02 Javascript
微信小程序tabBar用法实例详解
Dec 04 Javascript
vue+elementUI实现表单和图片上传及验证功能示例
May 14 Javascript
react-native聊天室|RN版聊天App仿微信实例|RN仿微信界面
Nov 12 Javascript
jQuery中的pushStack实现原理和应用实例
Feb 03 #Javascript
JavaScript闭包详解
Feb 02 #Javascript
js实现浏览器窗口大小被改变时触发事件的方法
Feb 02 #Javascript
javascript的switch用法注意事项分析
Feb 02 #Javascript
jQuery实现长按按钮触发事件的方法
Feb 02 #Javascript
jQuery实现跟随鼠标运动图层效果的方法
Feb 02 #Javascript
JavaScript针对网页节点的增删改查用法实例
Feb 02 #Javascript
You might like
PHPlet在Windows下的安装
2006/10/09 PHP
什么是PEAR?什么是PECL?PHP中两个容易混淆的概念解释
2015/07/01 PHP
PHP实现简单的新闻发布系统实例
2015/07/28 PHP
解决windows上php xdebug 无法调试的问题
2020/02/19 PHP
通过PHP的Wrapper无缝迁移原有项目到新服务的实现方法
2020/04/02 PHP
JavaScript XML实现两级级联下拉列表
2008/11/10 Javascript
JavaScript isArray()函数判断对象类型的种种方法
2010/10/11 Javascript
js函数调用的方式
2014/05/06 Javascript
JavaScript匿名函数与委托使用示例
2014/07/22 Javascript
jQuery使用post方法提交数据实例
2015/03/25 Javascript
JS实现仿QQ面板的手风琴效果折叠菜单代码
2015/09/11 Javascript
javascript基础语法学习笔记
2016/01/04 Javascript
jQuery设置Easyui校验规则(推荐)
2016/11/21 Javascript
JS实现发送短信验证后按钮倒计时功能(防止刷新倒计时失效)
2017/07/07 Javascript
JavaScript根据json生成html表格的示例代码
2018/10/24 Javascript
基于JavaScript获取base64图片大小
2019/10/18 Javascript
Taro小程序自定义顶部导航栏功能的实现
2020/12/17 Javascript
[01:19:23]2018DOTA2亚洲邀请赛 4.5 淘汰赛 Mineski vs VG 第二场
2018/04/06 DOTA
使用python将mdb数据库文件导入postgresql数据库示例
2014/02/17 Python
Python常见工厂函数用法示例
2018/03/21 Python
python利用Excel读取和存储测试数据完成接口自动化教程
2020/04/30 Python
python 日志模块 日志等级设置失效的解决方案
2020/05/26 Python
使用Nibabel库对nii格式图像的读写操作
2020/07/01 Python
解决Keras的自定义lambda层去reshape张量时model保存出错问题
2020/07/01 Python
小狗电器官方商城:中国高端吸尘器品牌
2017/03/29 全球购物
佳能加拿大网上商店:Canon eStore Canada
2018/04/04 全球购物
Ryderwear澳洲官网:澳大利亚高端健身训练装备品牌
2018/09/18 全球购物
Bose英国官方网站:美国知名音响品牌
2020/01/26 全球购物
浙大毕业生自荐信
2014/01/26 职场文书
幼儿园英语教学反思
2014/01/30 职场文书
高中军训感想800字
2014/02/23 职场文书
缓刑期间思想汇报范文
2014/10/10 职场文书
2014年初级职称工作总结
2014/12/08 职场文书
廉政承诺书
2015/01/19 职场文书
2015年全国爱眼日活动小结
2015/02/27 职场文书
Python数据处理的三个实用技巧分享
2022/04/01 Python