在jQuery中使用$而避免跟其它库产生冲突的方法


Posted in Javascript onAugust 13, 2015

在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 设置为 no-conflict 模式后,可以给$设置个别名:

<script src="prototype.js"></script>
<script src="jquery.js"></script>
<script>var $j = jQuery.noConflict();</script>

如果还想继续是用 jQuery 的$,需要将代码包含在一个自执行的函数内,这也是一些 jQuery 插件作者的通用做法,因为这些作者并不知道项目中是否引用了其它库:

<script src="prototype.js"></script>
<script src="jquery.js"></script>
<script>
jQuery.noConflict();

(function($) {
  // 这里依然可以继续使用 jQuery 的 $
})(jQuery);
</script>

二.自定义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>

代码

<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库的,而这种语句块的写法却能屏蔽冲突。

Javascript 相关文章推荐
基于jquery的网站幻灯片切换效果焦点图代码
Sep 15 Javascript
通过js为元素添加多项样式,浏览器全兼容写法
Aug 30 Javascript
js获取json元素数量的方法
Jan 27 Javascript
jquery 构造函数在表单提交过程中修改数据
May 25 Javascript
js+canvas简单绘制圆圈的方法
Jan 28 Javascript
AngularJS入门教程之表格实例详解
Jul 27 Javascript
js实现楼层导航功能
Feb 23 Javascript
JavaScript数据结构之单链表和循环链表
Nov 28 Javascript
vue 组件的封装之基于axios的ajax请求方法
Aug 11 Javascript
vue富文本框(插入文本、图片、视频)的使用及问题小结
Aug 17 Javascript
vue 插件的方法代码详解
Jun 06 Javascript
JS继承最简单的理解方式
Mar 31 Javascript
再JavaScript的jQuery库中编写动画效果的指南
Aug 13 #Javascript
js实现仿网易点击弹出提示同时背景变暗效果
Aug 13 #Javascript
JavaScript生成SQL查询表单的方法
Aug 13 #Javascript
对于jQuery性能的一些优化建议
Aug 13 #Javascript
使用控制台破解百小度一个月只准改一次名字
Aug 13 #Javascript
js实现文本框宽度自适应文本宽度的方法
Aug 13 #Javascript
理解和运用JavaScript的闭包机制
Aug 13 #Javascript
You might like
php中++i 与 i++ 的区别
2012/08/08 PHP
PHP中余数、取余的妙用
2015/06/29 PHP
Laravel模型间关系设置分表的方法示例
2018/04/21 PHP
JavaScript写的一个自定义弹出式对话框代码
2010/01/17 Javascript
网页图片延时加载的js代码
2010/04/22 Javascript
JSON语法五大要素图文介绍
2012/12/04 Javascript
javascript中的事件代理初探
2014/03/08 Javascript
JS生成随机字符串的多种方法
2014/06/10 Javascript
原生javascript实现图片滚动、延时加载功能
2015/01/12 Javascript
jQuery 1.9.1源码分析系列(十五)之动画处理
2015/12/03 Javascript
AngularJS Ajax详解及示例代码
2016/08/17 Javascript
JS中常用的正则表达式
2016/09/29 Javascript
微信小程序下拉刷新界面的实现
2017/09/28 Javascript
JS实现的base64加密解密操作示例
2018/04/18 Javascript
小程序云开发部署攻略(图文教程)
2018/10/30 Javascript
bootstrap实现嵌套模态框的实例代码
2020/01/10 Javascript
在vue中实现禁止回退上一步,路由不存历史记录
2020/07/22 Javascript
vue 虚拟DOM的原理
2020/10/03 Javascript
基于ant design日期控件使用_仅月份的操作
2020/10/27 Javascript
Scrapy-redis爬虫分布式爬取的分析和实现
2017/02/07 Python
python和shell获取文本内容的方法
2018/06/05 Python
pytorch中的embedding词向量的使用方法
2019/08/18 Python
python爬取本站电子书信息并入库的实现代码
2020/01/20 Python
全网最全python库selenium自动化使用详细教程
2021/01/12 Python
CSS3制作hover下划线动画
2017/03/27 HTML / CSS
英国音乐设备和乐器商店:Gear4music
2017/10/16 全球购物
世界上最大的在线汽车租赁预订平台:Rentalcars.com(支持中文)
2018/10/12 全球购物
服装公司总经理岗位职责
2013/11/30 职场文书
21岁生日感言
2014/02/27 职场文书
土地转让协议书
2014/04/15 职场文书
学生检讨书怎么写
2015/05/07 职场文书
企业培训简报范文
2015/07/20 职场文书
SQL Server数据定义——模式与基本表操作
2021/04/05 SQL Server
PyTorch梯度裁剪避免训练loss nan的操作
2021/05/24 Python
QT与javascript交互数据的实现
2021/05/26 Javascript
Python初识逻辑与if语句及用法大全
2021/08/07 Python