JQuery的$命名冲突详细解析


Posted in Javascript onDecember 28, 2013

在Jquery中,$是JQuery的别名,所有使用$的地方也都可以使用JQuery来替换,如$('#msg')等同于JQuery('#msg')的写法。然而,当我们引入多个js库后,在另外一个js库中也定义了$符号的话,那么我们在使用$符号时就发生了冲突。下面以引入两个库文件jquery.js和prototype.js为例来进行说明。

第一种情况:jquery.js在prototype.js之后进行引入,如:
<script src="prototype.js" type="text/javascript"/>
<script src="jquery.js" type="text/javascript"/>

在这种情况下,我们在自己的js代码中如下写的话:

$('#msg').hide();

$永远代表的是jquery中定义的$符号,也可以写成JQuery('#msg').hide();如果想要使用prototype.js中定义的$,我们在后面再介绍。

第二种情况:jquery.js在prototype.js之前进行引入,如:
<script src="jquery.js" type="text/javascript"/>
<script src="prototype.js" type="text/javascript"/>

在这种情况下,我们在自己的js代码中如下写的话:

$('#msg').hide();

$此时代表的prototype.js中定义的$符号,如果我们想要调用jquery.js中的工厂选择函数功能的话,只能用全称写法JQuery('#msg').hide().

下面先介绍在第一种引入js库文件顺序的情况下,如何正确的使用不同的js库中定义的$符号。

一.使用JQuery.noConflict()
该方法的作用就是让Jquery放弃对$的所有权,将$的控制权交还给prototype.js,因为jquery.js是后引入的,所以最后拥有$控制权的是jquery。它的返回值是JQuery。当在代码中调用了该 方法以后,我们就不可以使用$来调用jquery的方法了,此时$就代表在prototype.js库中定义的$了。如下:

JQuery.noConflict();

//此处不可以再写成$('#msg').hide(),此时的$代表prototype.js中定义的$符号。
JQuey('#msg').hide();

自此以后$就代表prototype.js中定义的$,jquery.js中的$无法再使用,只能使用jquery.js中$的全称JQuery了。

二.自定义JQuery的别名
如果觉得第一种方法中使用了JQuery.noConflict()方法以后,只能使用JQuery全称比较麻烦的话,我们还可以为JQuery重定义别名。如下:

var $j=JQuery.noConflict();
$j('#msg').hide();//此处$j就代表JQuery
自此以后$就代表prototype.js中定义的$,jquey.js中的$无法再使用,只能使用$j来作为jquey.js中JQuery的别名了。

三.使用语句块,在语句块中仍然使用jquery.js中定义的$,如下:
JQuery.noConflict();
JQuery(document).ready(function($){
$('#msg').hide();//此时在整个ready事件的方法中使用的$都是jquery.js中定义的$.
});

或者使用如下语句块:

(function($){
.....
$('#msg').hide();//此时在这个语句块中使用的都是jquery.js中定义的$.
})(JQuery)

如果在第二种引入js库文件顺序的情况下,如何使用jquery.js中的$,我们还是可以使用上面介绍的语句块的方法,如:

<script src="jquery.js" type="text/javascript"/> 
<script src="prototype.js" type="text/javascript"/> 
<script type="text/javascript"> 
(function($){ 
..... 
$('#msg').hide();//此时在这个语句块中使用的都是jquery.js中定义的$. 
})(JQuery) 
</script>

这种使用语句块的方法非常有用,在我们自己写jquery插件时,应该都使用这种写法,因为我们不知道具体工作过程中是如何顺序引入各种js库的,而这种语句块的写法却能屏蔽冲突。

(function($){})(jQuery)

1 首先(function(){})()这种写法 是创建了一个匿名的方法并立即执行(function(){})这个是匿名方法后面的括号就是立即调用了这个方法)。
这样做可以创建一个作用域以保证内部变量与外部变量不发生冲突,比如$ jQuery 等jquery内部定义的变量。

2 (function($){})(jQuery) 这个写法主要的作用还是保证jquery不与其他类库或变量有冲突 首先是要保证jQuery这个变量名与外部没有冲突(jquery内部$与jQuery是同一个东西 有两个名字的原因就是怕$与其他变量名有冲突二jQuery与其他变量冲突的几率非常小)并传入匿名对象,匿名对象给参数起名叫做$(其实和jquery内部是一样的) 然后你就可以自由的在(function($){})(jQuery)里写你的插件而不需要考虑与外界变量是否存在冲突

Javascript 相关文章推荐
jquery异步调用页面后台方法&amp;#8207;(asp.net)
Mar 01 Javascript
js实现键盘控制DIV移动的方法
Jan 10 Javascript
js创建对象的方式总结
Jan 10 Javascript
javascript实现按回车键切换焦点
Feb 09 Javascript
jQuery使用append在html元素后同时添加多项内容的方法
Mar 26 Javascript
JavaScript基础知识点归纳(推荐)
Jul 09 Javascript
jqGrid翻页时数据选中丢失问题的解决办法
Feb 13 Javascript
Angular利用内容投射向组件输入ngForOf模板的方法
Mar 05 Javascript
vue 输入电话号码自动按3-4-4分割功能的实现代码
Apr 30 Javascript
jQuery实现朋友圈查看图片
Sep 11 jQuery
解决vue2中使用elementUi打包报错的问题
Sep 22 Javascript
JS封装cavans多种滤镜组件
Feb 15 Javascript
js中call与apply的用法小结
Dec 28 #Javascript
SinaEditor使用方法详解
Dec 28 #Javascript
Jqgrid表格随窗口大小改变而改变的简单实例
Dec 28 #Javascript
jqGrid随窗口大小变化自适应大小的示例代码
Dec 28 #Javascript
jQuery对Select的操作大集合(收藏)
Dec 28 #Javascript
Jqgrid设置全选(选择)及获取选择行的值示例代码
Dec 28 #Javascript
jquery改变tr背景色的示例代码
Dec 28 #Javascript
You might like
php printf输出格式使用说明
2010/12/05 PHP
ThinkPHP上使用多说评论插件的方法
2014/10/31 PHP
基于php实现随机合并数组并排序(原排序)
2015/11/26 PHP
Laravel中validation验证 返回中文提示 全局设置的方法
2019/09/29 PHP
PHP使用PhpSpreadsheet操作Excel实例详解
2020/03/26 PHP
JS维吉尼亚密码算法实现代码
2010/11/09 Javascript
分别用marquee和div+js实现首尾相连循环滚动效果,仅3行代码
2011/09/21 Javascript
40个有创意的jQuery图片、内容滑动及弹出插件收藏集之一
2011/12/31 Javascript
jQuery 选择器项目实例分析及实现代码
2012/12/28 Javascript
基于bootstrap3和jquery的分页插件
2015/07/31 Javascript
AngularJS中的包含详细介绍及实现示例
2016/07/28 Javascript
Bootstrap Search Suggest使用例子
2016/12/21 Javascript
js仿淘宝评价评分功能
2017/02/28 Javascript
H5手机端多文件上传预览插件
2017/04/21 Javascript
基于jQuery中ajax的相关方法汇总(必看篇)
2017/11/08 jQuery
Node.js readline模块与util模块的使用
2018/03/01 Javascript
利用vscode调试编译后的js代码详解
2018/05/14 Javascript
详解如何快速配置webpack多入口脚手架
2018/12/28 Javascript
element-ui树形控件后台返回的数据+生成组织树的工具类
2020/03/05 Javascript
vue项目配置同一局域网可使用ip访问的操作
2020/10/23 Javascript
[01:53]2016完美“圣”典风云人物:Maybe专访
2016/12/05 DOTA
[02:42]完美大师赛主赛事淘汰赛第三日观众采访
2017/11/25 DOTA
python制作简单五子棋游戏
2019/06/18 Python
wxpython自定义下拉列表框过程图解
2020/02/14 Python
解决python图像处理图像赋值后变为白色的问题
2020/06/04 Python
Scrapy基于scrapy_redis实现分布式爬虫部署的示例
2020/09/29 Python
canvas 阴影和图形变换的示例代码
2018/01/02 HTML / CSS
Footshop法国:购买运动鞋
2020/01/19 全球购物
物业品质提升方案
2014/06/08 职场文书
群众路线教师自我剖析材料
2014/09/29 职场文书
2014年中学生检讨书大全
2014/10/09 职场文书
护士2014年终工作总结
2014/11/11 职场文书
中国式结婚:司仪主持词(范文)
2019/07/25 职场文书
委托开发合同书(标准版)
2019/08/07 职场文书
MySQL令人大跌眼镜的隐式转换
2021/08/23 MySQL
Django框架中视图的用法
2022/06/10 Python