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实现表格中相同单元格合并示例代码
Jun 26 Javascript
JavaScript 模拟类机制及私有变量的方法及思路
Jul 10 Javascript
再谈Jquery Ajax方法传递到action(补充)
May 12 Javascript
BootStrap智能表单demo示例详解
Jun 13 Javascript
Boostrap基础教程之JavaScript插件篇
Sep 08 Javascript
jQuery中过滤器的基本用法示例
Oct 11 jQuery
vue 指定组件缓存实例详解
Apr 01 Javascript
vue 刷新之后 嵌套路由不变 重新渲染页面的方法
Sep 13 Javascript
vue 的点击事件获取当前点击的元素方法
Sep 15 Javascript
Vue表单绑定的实例代码(单选按钮,选择框(单选时,多选时,用 v-for 渲染的动态选项)
May 13 Javascript
解决vue安装less报错Failed to compile with 1 errors的问题
Oct 22 Javascript
36个正则表达式(开发效率提高80%)
Nov 17 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
第十五节--Zend引擎的发展
2006/11/16 PHP
PHP执行linux系统命令的常用函数使用说明
2010/04/27 PHP
php使用curl模拟登录后采集页面的例子
2013/11/04 PHP
ThinkPHP之foreach标签使用概述
2014/06/30 PHP
在Laravel框架里实现发送邮件实例(邮箱验证)
2016/05/20 PHP
PHP实现时间比较和时间差计算的方法示例
2017/07/24 PHP
PHP+mysql实现的三级联动菜单功能示例
2019/02/15 PHP
PHP基于ip2long实现IP转换整形
2020/12/11 PHP
不安全的常用的js写法
2009/09/15 Javascript
javascript下arguments,caller,callee,call,apply示例及理解
2009/12/24 Javascript
时间戳转换为时间 年月日时间的JS函数
2013/08/19 Javascript
结合JQ1.9通过js正则判断各种浏览器版本的方法
2013/12/30 Javascript
Javascript点击其他任意地方隐藏关闭DIV实例
2016/06/21 Javascript
js控制div层的叠加简单方法
2016/10/15 Javascript
Javascript之面向对象--封装
2016/12/02 Javascript
JavaScript实现的选择排序算法实例分析
2017/04/14 Javascript
vue使用stompjs实现mqtt消息推送通知
2017/06/22 Javascript
React中的refs的使用教程
2018/02/13 Javascript
vue translate peoject实现在线翻译功能【新手必看】
2018/06/07 Javascript
jquery实现的简单轮播图功能【适合新手】
2018/08/17 jQuery
vue.js 实现a标签href里添加参数
2019/11/12 Javascript
浅谈vuex为什么不建议在action中修改state
2020/02/02 Javascript
如何在django里上传csv文件并进行入库处理的方法
2019/01/02 Python
在Python 不同级目录之间模块的调用方法
2019/01/19 Python
利用Python实现最小二乘法与梯度下降算法
2021/02/21 Python
html5+CSS3+JS实现七夕言情功能代码
2017/08/28 HTML / CSS
万宝龙英国官网:Montblanc手表、书写工具、皮革和珠宝
2018/10/16 全球购物
注塑工厂厂长岗位职责
2013/12/02 职场文书
教师职业道德事迹材料
2014/08/18 职场文书
2014年大学教师工作总结
2014/12/02 职场文书
2014年小学安全工作总结
2014/12/04 职场文书
少先队入队仪式主持词
2015/07/04 职场文书
情况说明书怎么写
2015/10/08 职场文书
《西门豹》教学反思
2016/02/23 职场文书
三好学生评选事迹材料(2016精选版)
2016/02/25 职场文书
Python 中面向接口编程
2022/05/20 Python