首页 web前端 js教程 关于jQuery库冲突怎么办

关于jQuery库冲突怎么办

Jan 11, 2018 pm 02:08 PM
jquery 冲突 怎么办

在使用jQuery开发的时候,可能还会使用到其他的JS库,比如Prototype,但多库共存时可能会发生冲突,本文主要给大家介绍了关于jQuery库冲突的完美解决办法,需要的朋友可以参考借鉴,下面来一起看看吧。

我的思路就是如果让我来设计,那我就用一个默认值$,不传参数,那就用$,最后就挂载在window.$上,传参数就用传入名字,比如传入jq,那我就挂载在window.jq上。

var myControl="jq";
(function(name){
 var $=name ||"$"; //name存在$的值就是name的值,不存在或为null,$的值为字符串"$"
 console.log($);
 window[$]=function(){
 alert("123");
 }
})(myControl)
window[myControl]();
登录后复制

事实上这肯定不是jquery解决冲突的办法了。那就看看jQuery怎么解决冲突吧。

jQuery多个版本或和其他js库冲突主要是常用的$符号的冲突。

一、冲突的解决

1、同一页面jQuery多个版本冲突解决方法

<body>
<!-- 引入1.6.4版的jq -->
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.js"></script>
<script> var jq164 = jQuery.noConflict(true); </script>
<!-- 引入1.4.2版的jq -->
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.js"></script>
<script> var jq142 = jQuery.noConflict(true); </script>

<script>
(function($){
 //此时的$是jQuery-1.6.4
 $('#');
})(jq164);
</script>
 
<script>
jq142(function($){
 //此时的$是jQuery-1.4.2
 $('#');
});
</script>
 
</body>
登录后复制

2、jQuery库在其他库之后导入

jQuery noConflict() 方法会释放会 $ 标识符的控制,这样其他脚本就可以使用它了。

1、可以通过jQuery全名替代简写的方式来使用 jQuery

在其他库和jQuery库都加载完毕后,可以在任何时候调用jQuery.noConflict()函数来将变量$的控制权移交给其他JavaSript库。然后就可以在程序里将jQuery()函数作为jQuery对象的制造工厂。

<script src="prototype.js" type="text/javascript"></script>
<script src="jquery.js" type="text/javascript"></script>

<p id="pp">test---prototype</p>
<p>test---jQuery</p>

<script type="text/javascript">
jQuery.noConflict();  //将变量$的控制权让渡给prototype.js,全名可以不调用。
jQuery(function(){   //使用jQuery
 jQuery("p").click(function(){
 alert( jQuery(this).text() );
 });
});
//此处不可以再写成$,此时的$代表prototype.js中定义的$符号。

$("pp").style.display = 'none'; //使用prototype
</script>
登录后复制

2、自定义一个快捷方式

noConflict() 可返回对 jQuery 的引用,可以把它存入自定义名称,例如jq,$J变量,以供稍后使用。

这样可以确保jQuery不会与其他库冲突,同时又使用自定义一个快捷方式。

<script type="text/javascript">
var $j = jQuery.noConflict(); //自定义一个比较短快捷方式
$j(function(){   //使用jQuery
 $j("p").click(function(){
 alert( $j(this).text() );
 });
});

$("pp").style.display = 'none'; //使用prototype
</script>
登录后复制

3、在不冲突的情况下仍然用$

如果想在jQuery 代码块使用 $ 简写,不愿意改变这个快捷方式,可以把 $ 符号作为变量传递给 ready 方法。这样就可以在函数内使用 $ 符号了 , 而在函数外,依旧不得不使用 "jQuery"。

<script type="text/javascript">
jQuery.noConflict(); //将变量$的控制权让渡给prototype.js
jQuery(document).ready(function($){
 $("p").click(function(){ //继续使用 $ 方法
 alert( $(this).text() );
 });
});
//或者如下
jQuery(function($){   //使用jQuery
 $("p").click(function(){ //继续使用 $ 方法
 alert( $(this).text() );
 });
});
</script>
登录后复制

或者使用IEF语句块,这应该是最理想的方式,因为可以通过改变最少的代码来实现全面的兼容性。

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

<script type="text/javascript">
jQuery.noConflict();  //将变量$的控制权让渡给prototype.js
(function($){   //定义匿名函数并设置形参为$
 $(function(){   //匿名函数内部的$均为jQuery
 $("p").click(function(){ //继续使用 $ 方法
  alert($(this).text());
 });
 });
})(jQuery);    //执行匿名函数且传递实参jQuery

$("pp").style.display = 'none'; //使用prototype
</script>
登录后复制

3、jQuery库在其他库之前导入

jQuery库在其他库之前导入,$的归属权默认归后面的JavaScript库所有。那么可以直接使用"jQuery"来做一些jQuery的工作。

同时,可以使用$()方法作为其他库的快捷方式。这里无须调用jQuery.noConflict()函数。

<!-- 引入 jQuery -->
<script src="../../scripts/jquery.js" type="text/javascript"></script>
<!-- 引入 prototype -->
<script src="lib/prototype.js" type="text/javascript"></script>

<body>
<p id="pp">Test-prototype(将被隐藏)</p>
<p >Test-jQuery(将被绑定单击事件)</p>

<script type="text/javascript">
jQuery(function(){ //直接使用 jQuery ,没有必要调用"jQuery.noConflict()"函数。
 jQuery("p").click(function(){  
  alert( jQuery(this).text() );
 });
});

$("pp").style.display = 'none'; //使用prototype
</script>
</body>
登录后复制

二、原理

1、源码

源码:看一下源码里怎么做到的

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;
  }
});
登录后复制

在jQuery加载的时候,通过事先声明的_jQuery变量获取到当前window.jQuery,通过_$获取到当前window.$。

通过jQuery.extend()把noConflict挂载到jQuery下面。所以我们在调用的时候都是jQuery.noConflict()这样调。

在调用noConflict()时做了2个判断,

第一个if,把$的控制权交出去。

第二个if,在noConflict()传参的时候把,jQuery的控制权交出去。

最后noConflict()返回jQuery对象,用哪个参数接收,哪个参数将拥有jQuery的控制权。

2、 验证

//冲突 
 var $ = 123; //假设其他库中$为123
 $(
   function () {
    console.log($); //报错Uncaught TypeError: $ is not a function
   }
 );
登录后复制

解决冲突

//解决冲突
 var jq = $.noConflict();
 var $ = 123;
 jq(function () {
  alert($); //123
 });
登录后复制

释放$控制权例子

<script>
 var $ = 123; // window.$是123,存储在私有的_$上。

</script>
<script src="https://code.jquery.com/jquery-2.2.4.js"></script>
<body>
<p>aaa</p>
<script>
 var jq = $.noConflict();//当window.$===jQuery的时候,把_$赋给了window.$。
 jq(function () {
  alert($); //123
 });
</script>
登录后复制

释放jQuery控制权例子

参数deep的作用:deep用来放弃jQuery对外的接口。

 如下,noConflict()不写参数,弹出jQuery为构造函数。

<script>
 var $ = 123;
 var jQuery=456;
</script>
<script src="https://code.jquery.com/jquery-2.0.3.js"></script>
<body>
<p>aaa</p>
<script>
 var jq = $.noConflict();
 jq(function () {
  alert(jQuery); //构造函数
 });
</script>
登录后复制


如果写个参数true,会弹出456。

<script>
 var $ = 123;
 var jQuery=456;
</script>
<script src="https://code.jquery.com/jquery-2.0.3.js"></script>
<body>
<p>aaa</p>
<script>
 var jq = $.noConflict(true); //写了true或者参数的时候,deep为真window.jQuery===jQuery为真,所以进入if条件。把456赋值给window.jQuery
 jq(function () {
  alert(jQuery); //456
 });
</script>
登录后复制

相关推荐:

使用jquery.noConflict()解决jquery库与其他库冲突的问题

如何编写一个js/jQuery库(心得总结)

jQuery库与其他JS库冲突的解决办法_jquery

以上是关于jQuery库冲突怎么办的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

欧意钱包助记词忘记了怎么办?还能找回吗? 欧意钱包助记词忘记了怎么办?还能找回吗? Jul 19, 2024 pm 12:13 PM

在Web3世界中,虽然自由但充满危险,为此欧易钱包安全的第一步就是保护私钥和助记词。私钥都知道其重要性,今天强调助记词。助记词可以理解为私钥的另一种展现形式,拥有了助记词相当于拥有了私钥并控制了钱包资产。也以为其存在感低于私钥,会出现用户忘记欧易钱包助记词。那么欧意钱包助记词忘记了怎么办?究竟欧意钱包助记词忘记了还能找回吗?使用户需要关注的问题。通常来说助记词忘记了无法找回,但尽量联系相关客服人员帮忙。下面小编为大家详细说说。欧意钱包助记词忘记了怎么办?欧易钱包助记词忘记了建议尝试回忆,或者联系

解决宽带已连接却上不了网的问题(排除故障) 解决宽带已连接却上不了网的问题(排除故障) May 05, 2024 pm 06:01 PM

互联网已经成为人们生活中不可或缺的一部分,在如今的信息时代。但是上不了网、有时候我们会遇到一些烦恼,然而,比如宽带已经连接好了。并采取相应的解决措施,我们需要逐步排查问题,以恢复网络连接,这种情况下。确认设备连接状态:手机等设备是否已正确认接到宽带网络、检查电脑,确保无线网络或者有线网络连接正常。2.重启宽带设备:以重置设备并重新建立连接、待数分钟后重新开启、尝试关闭宽带路由器或者调制解调器。3.检查宽带账号和密码:避免因为账号或密码错误导致无法上网,确保输入的宽带账号和密码正确无误。4.检查D

电视出现雪花怎么办(解决电视雪花问题的实用方法) 电视出现雪花怎么办(解决电视雪花问题的实用方法) Jun 01, 2024 pm 09:44 PM

在我们日常生活中,电视作为重要的娱乐设备,经常会出现雪花现象,影响我们观看体验。本文将为大家介绍解决电视雪花问题的实用方法,帮助大家更好地享受电视节目。1.雪花问题的原因分析电视出现雪花一般是由于信号干扰、天线问题或电视信号源等原因引起的。2.检查天线连接是否松动首先检查电视机与天线之间的连接是否牢固,如有松动应重新插好。3.选择合适的天线确保天线的位置和方向正确,选择一款性能良好的天线可以改善信号接收质量。4.调整天线方向通过旋转或调整天线角度的方式,找到最佳的信号接收方向。5.使用室内天线信

jQuery中如何使用PUT请求方式? jQuery中如何使用PUT请求方式? Feb 28, 2024 pm 03:12 PM

jQuery中如何使用PUT请求方式?在jQuery中,发送PUT请求的方法与发送其他类型的请求类似,但需要注意一些细节和参数设置。PUT请求通常用于更新资源,例如更新数据库中的数据或更新服务器上的文件。以下是在jQuery中使用PUT请求方式的具体代码示例。首先,确保引入了jQuery库文件,然后可以通过以下方式发送PUT请求:$.ajax({u

解决电视播放时出现沙沙声的方法(消除电视沙沙声) 解决电视播放时出现沙沙声的方法(消除电视沙沙声) Jul 21, 2024 pm 03:29 PM

随着科技的进步和人们对高清画质的要求增加,电视已经成为家庭娱乐中不可或缺的一部分。然而,有时在观看电视时,可能会听到令人烦躁的沙沙声,这不仅影响了观影的体验,还可能导致电视故障。本文将介绍一些解决电视播放时出现沙沙声的方法,让您享受到更高质量的观影体验。一:检查音频线缆连接是否松动如果电视播放时出现沙沙声,首先要检查音频线缆是否连接牢固。确保音频线缆的两端都插入到正确的接口,并检查是否有松动或接触不良的情况。二:调整电视音量和音频设备的设置适当调整电视音量和音频设备的设置,有助于消除沙沙声。尝试

jQuery小技巧:快速修改页面所有a标签的文本 jQuery小技巧:快速修改页面所有a标签的文本 Feb 28, 2024 pm 09:06 PM

标题:jQuery小技巧:快速修改页面所有a标签的文本在网页开发中,我们经常需要对页面中的元素进行修改和操作。在使用jQuery时,有时候需要一次性修改页面中所有a标签的文本内容,这样可以节省时间和精力。下面将介绍如何使用jQuery快速修改页面所有a标签的文本,同时给出具体的代码示例。首先,我们需要引入jQuery库文件,确保在页面中引入了以下代码:&lt

使用jQuery修改所有a标签的文本内容 使用jQuery修改所有a标签的文本内容 Feb 28, 2024 pm 05:42 PM

标题:使用jQuery修改所有a标签的文本内容jQuery是一款流行的JavaScript库,被广泛用于处理DOM操作。在网页开发中,经常会遇到需要修改页面上链接标签(a标签)的文本内容的需求。本文将介绍如何使用jQuery来实现这个目标,并提供具体的代码示例。首先,我们需要在页面中引入jQuery库。在HTML文件中添加以下代码:

电脑没有蓝牙,如何解决(快速添加蓝牙功能的方法和注意事项) 电脑没有蓝牙,如何解决(快速添加蓝牙功能的方法和注意事项) Jun 29, 2024 pm 06:57 PM

在现代社会中,蓝牙已经成为我们日常生活中不可或缺的一项技术。然而,对于一些老旧的电脑来说,它们可能没有内置蓝牙功能。如果你的电脑没有蓝牙,又想使用蓝牙设备怎么办呢?本文将向大家介绍几种快速添加蓝牙功能的方法和注意事项。1.使用蓝牙适配器-蓝牙适配器是一种外接设备,可以通过USB接口连接到电脑上。-购买一个兼容的蓝牙适配器,并按照说明书安装驱动程序。-将蓝牙适配器插入电脑的USB接口,并等待系统自动安装驱动程序。2.检查驱动程序1. 检查电脑是否有蓝牙设备打开设备管理器,查看是否有蓝牙设备。如果没

See all articles