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 相关文章推荐
javascript读取xml
Nov 04 Javascript
Jquery仿淘宝京东多条件筛选可自行结合ajax加载示例
Aug 28 Javascript
使用jQueryMobile实现滑动翻页效果的方法
Feb 04 Javascript
学习Bootstrap组件之下拉菜单
Jul 28 Javascript
jQuery 选择器(61种)整理总结
Sep 26 Javascript
简单实现IONIC购物车功能
Jan 10 Javascript
JS实现的走迷宫小游戏完整实例
Jul 19 Javascript
JS中使用cavas截图网页并解决跨域及模糊问题
Nov 13 Javascript
JS/HTML5游戏常用算法之碰撞检测 包围盒检测算法详解【圆形情况】
Dec 13 Javascript
浅谈ECMAScript 中的Array类型
Jun 10 Javascript
JS自定义右键菜单实现代码解析
Jul 16 Javascript
vue调用微信JSDK 扫一扫,相册等需要注意的事项
Jan 03 Vue.js
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数组函数序列之end() - 移动数组内部指针到最后一个元素,并返回该元素的值
2011/10/31 PHP
php画图实例
2014/11/05 PHP
PHP的Yii框架使用中的一些错误解决方法与建议
2015/08/21 PHP
php常量详细解析
2015/10/27 PHP
Yii2验证器(Validator)用法分析
2016/07/23 PHP
在textarea中显示html页面的javascript代码
2007/04/20 Javascript
在网页中使用document.write时遭遇的奇怪问题
2010/08/24 Javascript
推荐40款强大的 jQuery 导航插件和教程(上篇)
2012/09/14 Javascript
js中继承的几种用法总结(apply,call,prototype)
2013/12/26 Javascript
用Jquery选择器计算table中的某一列某一行的合计
2014/08/13 Javascript
几句话带你理解JS中的this、闭包、原型链
2016/09/26 Javascript
使用vue.js实现联动效果的示例代码
2017/01/10 Javascript
JS动态生成年份和月份实例代码
2017/02/04 Javascript
解决iview打包时UglifyJs报错的问题
2018/03/07 Javascript
vue中实现图片和文件上传的示例代码
2018/03/16 Javascript
vue项目中应用ueditor自定义上传按钮功能
2018/04/27 Javascript
json字符串传到前台input的方法
2018/08/06 Javascript
vue商城中商品“筛选器”功能的实现代码
2020/07/01 Javascript
[03:42]2014DOTA2西雅图国际邀请赛 Navi战队巡礼
2014/07/07 DOTA
[42:52]IG vs VGJ.T 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
在Python程序中操作MySQL的基本方法
2015/07/29 Python
Python编写电话薄实现增删改查功能
2016/05/07 Python
快速了解python leveldb
2018/01/18 Python
Redis使用watch完成秒杀抢购功能的代码
2018/05/07 Python
Flask框架使用DBUtils模块连接数据库操作示例
2018/07/20 Python
django-allauth入门学习和使用详解
2019/07/03 Python
Python之——生成动态路由轨迹图的实例
2019/11/22 Python
python的launcher用法知识点总结
2020/08/07 Python
python Matplotlib数据可视化(2):详解三大容器对象与常用设置
2020/09/30 Python
车贷收入证明范本
2014/01/09 职场文书
《列夫托尔斯泰》教学反思
2014/02/10 职场文书
秋季运动会广播稿(30篇)
2014/09/13 职场文书
职业生涯规划书怎么写?
2014/09/14 职场文书
2016年员工年度考核评语
2015/12/02 职场文书
volatile保证可见性及重排序方法
2022/08/05 Java/Android
Zabbix6通过ODBC方式监控Oracle 19C的详细过程
2022/09/23 Servers