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 相关文章推荐
IE8 下的Js错误HTML Parsing Error...
Aug 14 Javascript
Javascript Math ceil()、floor()、round()三个函数的区别
Mar 09 Javascript
JavaScript实现GriwView单列全选(自写代码)
May 13 Javascript
javascript中直接引用Microsoft的COM生成Word
Jan 20 Javascript
原生JavaScript+LESS实现瀑布流
Dec 12 Javascript
JS实现点击按钮自动增加一个单元格的方法
Mar 09 Javascript
js验证框架实现代码分享
May 18 Javascript
微信小程序搜索组件wxSearch实例详解
Jun 08 Javascript
Vue中render函数的使用方法
Jan 31 Javascript
Node.js+Express+Mysql 实现增删改查
Apr 03 Javascript
微信小程序实现的一键连接wifi功能示例
Apr 24 Javascript
vue使用Sass时报错问题的解决方法
Oct 14 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
PHP+MySQL投票系统的设计和实现分享
2012/09/23 PHP
php查看请求头信息获取远程图片大小的方法分享
2013/12/25 PHP
php中current、next与reset函数用法实例
2014/11/17 PHP
PHP的命令行命令使用指南
2015/08/18 PHP
PHP输入流php://input实例讲解
2015/12/22 PHP
php采集神器cURL使用方法详解
2016/02/19 PHP
PHP将数据导出Excel表中的实例(投机型)
2017/07/31 PHP
PHP压缩图片功能的介绍
2019/03/21 PHP
setAttribute 与 class冲突解决
2008/02/17 Javascript
超级有用的13个基于jQuery的内容滚动插件和教程
2011/07/31 Javascript
JavaScript中的View-Model使用介绍
2011/08/11 Javascript
模拟一个类似百度google的模糊搜索下拉列表
2014/04/15 Javascript
关于jQuery判断元素是否存在的问题示例探讨
2014/07/21 Javascript
node.js中的events.EventEmitter.listenerCount方法使用说明
2014/12/08 Javascript
jQuery使用之处理页面元素用法实例
2015/01/19 Javascript
js jquery获取当前元素的兄弟级 上一个 下一个元素
2015/09/01 Javascript
jquery事件的ready()方法使用详解
2015/11/11 Javascript
详解JS获取HTML DOM元素的8种方法
2017/06/17 Javascript
jQuery 禁止表单用户名、密码自动填充功能
2017/10/30 jQuery
vue实现类似淘宝商品评价页面星级评价及上传多张图片功能
2018/10/29 Javascript
Mpvue中使用Vant Weapp组件库的方法步骤
2019/05/16 Javascript
[54:54]Newbee vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
用python实现的去除win下文本文件头部BOM的代码
2013/02/10 Python
Python numpy生成矩阵、串联矩阵代码分享
2017/12/04 Python
详解python中docx库的安装过程
2019/11/08 Python
Selenium基于PIL实现拼接滚动截图
2020/04/10 Python
利用Python实现学生信息管理系统的完整实例
2020/12/30 Python
css3 flex布局 justify-content:space-between 最后一行左对齐
2020/01/02 HTML / CSS
TheFork葡萄牙:欧洲领先的在线餐厅预订平台
2019/05/27 全球购物
中专生毕业自我鉴定
2013/11/01 职场文书
体育教育专业毕业生自荐信
2013/11/15 职场文书
初中科学教学反思
2014/01/21 职场文书
12岁生日演讲稿
2014/05/14 职场文书
汽车车尾标语大全
2015/08/11 职场文书
演讲开头怎么书写?
2019/08/06 职场文书
教你怎么用Python selenium操作浏览器对象的基础API
2021/06/23 Python