jQuery多库共存问题解决方法

一、问题概述:

1、随着jQuery的流行,采用jQuery和$符为命名空间的js库越来越多,当然jQuery的$符也是参照的Prototype库的,所以当多个库同时以$符或者jQuery为命名空间时,那么此时,就会产生冲突。

2、由于jQuery的更新速度过快,所以插件更不上,导致不同版本的jQuery对插件支持的不一样,而刚好我们此时需要用一个高版本的jQuery进行开发,我们用的z-tree则是低版本的jQuery,所以在这种场景下,则会产生$和jQuery命名空间冲突的问题

3、这里jQuery解决多库共存的问题的绝决方案只用于单文件js类库框架,如果是多文件就不行了像EXT这种

 

二、解决方法

1、通过jQuery自带的noConflict函数将$或者jQuery映射回给之前使用过$和jQuery对象的js类库

简介:jQuery.noConflict()的具体实现

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<script>jQuery={};//模拟jQuery对象//将$和jQuery两个对象(命名空间)存入到临时变量中去,应为这两个变量可能会和其他库的变量冲突var _$=window.$,_jQuery=window.jQuery;//上面定义的_$和_jQuery的变量值可能会存在三种情况//第一种当jQuery文件位于最顶端时,那么里面存储的就是js全局变量的默认值//第二种当jQuery文件位于其他js文件之下,且前面的库库有使用到window.$和window.jQuery中的任意一个,
//那么当调用下面的noConflict方法之后,jQuery就会将对应的window.$和window.jQuery控制权返还给之前使用到他们的js库
//实际交还$对象和jQuery对象的方法 jQuery.noConflict=function(deep){//交还$对象的控制权//因为jQuery会做window.$=window.jQuery=jQuery这个操作,//将window.$和window.jQuery对象都托管给jQuery对象,所以当//加载完jQuery文件之后,执行jQuery.noConflict()如果window.$//对象已经脱管给了jQuery对象的话,那么就通过将原来的//window.$的值覆盖现在window.$的形式,完成$对象控制权的交//换, 所以覆盖之后的$对象的值就是在jQuery之前使用到$对象的js//库中定义的值,而我们也不能使用$符来使用选择器,只能通过jQuery对象if(window.$===jQuery){window.$=_$;//将原先缓存的window.$(之前加载完成的js库的$对象)覆盖在执行jQuery文件之后重新定义的jQuery自带的$对象 }//交换jQuery对象的控制权//jQuery对象不能轻易的交还控制权,所以这里加了一个deep参数,只有当这个参数为true时,才会交还if(deep && window.jQuery===jQuery){window.jQuery=_jQuery;//将原先缓存的window.jQuery(之前加载完成的js库的jQuery对象)覆盖在执行jQuery文件之后重新定义的jQuery自带的jQuery对象 }
return jQuery;//返回jQuery对象,这样的话我们就可以给jQuery对象重新定义一个个性化的名字}
</script> </body> </html>

(1)通过jQuery.noConflict()交还$和jQuery对象的控制权,解决命名控件冲突的问题

当jQuery文件第一个加载时,调用jQuery.noConflict()交换$的控制权

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><script src="../common/jquery-1.9.1.min.js"></script></head>
<body>
<script>console.log(window.$);//打印function (e,t){return new b.fn.init(e,t,r)} jQuery中定义的$对象
    jQuery.noConflict();console.log(window.$);//打印出undefined
</script>
</body>
</html>

 

当jQuery文件在其他js库加载完之后加载,且这些库已经使用了$对象

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><script src="../common/prototype.js"></script><script src="../common/jquery-1.9.1.min.js"></script></head>
<body>
<script>console.log(window.$);//打印出:function (e,t){return new b.fn.init(e,t,r)} jQuery中定义的$对象
    jQuery.noConflict();console.log(window.$);//打印出prototype中定义的$对象
</script>
</body>
</html>

 

(2)通过jQuery.noConflict()来给jQuery对象重新命名的方式解决冲突问题

这实际上也是交换$对象给前面的js类库后,通过返回的jQuery对象自定义的给jQuery对象命名的方式,解决的方式其实和上面的是一样的,但是区别是我们可以定义一个个性化的名字(前提是不要和前面的对象冲突)

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><script src="../common/jquery-1.9.1.min.js"></script>
</head>
<body>
<script>var zc=jQuery.noConflict();alert(zc("body").length);//输出:1
</script>
</body>
</html>

 

(3)听过jQuery.noConflict()方法返还$对象的控制权,通过匿名执行函数(闭包)的方式重新恢复对$对象的使用,只不过,$对象只在闭包范围内有效

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><script src="../common/jquery-1.9.1.min.js"></script>
</head>
<body>
<script>jQuery.noConflict();//交还$对象的控制权给前面使用过$对象的js库
    (function($){alert($("body").length);//输出:1;
    })(jQuery)//将jQuery对象作为实参传递给形参$,这样$还是代表jQuery对象
</script>
</body>
</html>

 

(4)通过jQuery.noConflict()同时去除$对象和jQuery对象的控制权

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><script src="../common/jquery-1.9.1.min.js"></script>
</head>
<body>
<script>jQuery.noConflict(true);alert($);//输出:undefined
    alert(jQuery);//输出:undefined
</script>
</body>
</html>

 

 

(5)下面是终极的解决方案,使用这个方案你可以把jQuery集成到你自己定义的js类库中区,同时,去除$和jQuery对象的控制,也就是说,$和jQuery不再适用,而把jQuery对象的所有的属性和方法,都转移到你的对象下面

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><script src="../common/jquery-1.9.1.min.js"></script>
</head>
<body>
<script>var zc={};//自定义的对象
    zc.query=jQuery.noConflict(true);alert(zc.query("body").length);//输出:1
    alert(jQuery);//输出:undefined
    alert($);//输出:undefined
</script>
</body>
</html>

通过上面的输出发现:此时$和jQuery对象均无法使用,而自定义的zc.query怎可以使用jQuery对象所有的属性和方法

 

转载于:https://www.cnblogs.com/GreenLeaves/p/6379001.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/572754.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java开发技术有什么意义,零基础学Java开发技术有哪些优势和好处?

零基础学Java开发技术有哪些优势和好处&#xff1f;Java开发技术有下列优势&#xff1a;Java编程语言简单、面向对象集中于对象及其接口、分布式处理TCP/IP协议、鲁棒性、安全性、体系结构中立性、可移植性、解释执行、高性能、多线程以及动态性等。零基础学Java开发技术的优势…

[TC SRM 685 div1 lev1] MultiplicationTable2

转载&#xff1a; https://www.linkedin.com/pulse/topcoder-685-multiplicationtable2-yingwu-zhu Note: 生成封闭集合方式。 ProblemFox Ciel is creating a new binary operation.The operation will be denoted $ and it will be defined on the finite set S {0, 1, 2, .…

php树菜单转化为一维菜单,php树型菜单 - iturtle的个人空间 - OSCHINA - 中文开源技术交流社区...

通过处理array,添加level,is_leaf属性实现 树型菜单公共类通过处理array,添加level,is_leaf属性实现 树型菜单/*树形分类添加节点属性*$data, 要处理的节点数组*$pid,父类ID*$prefix, 字段前缀 如chh_pid*$tree array()**/function getTree($data, $pid,$prefix,$tree) {for…

C#-WebForm-★★★JQuery知识——基础知识、选择器、事件★★★

JQuery 与 JS 之间的转换 将JQuery转换为JS —— get(0)  例如&#xff1a;alert( $("#d1").get(0).offsetwidth ); 将JS 转换为JQuery —— $(" ")  例如&#xff1a;$("#d1").click(function(){}); 1、什么是JQuery&#xff1f;   它就是…

Java编号姓名元宝数密码,通过my Eclipse控制台向数据库(SQL2008)中查找、删除、插入信息...

通过my Eclipse控制台向数据库(SQL2008)中查找、删除、插入信息如果编译程序有什么错误还望大家多多指正代码执行所需数据库、架包及java源文件已上传至文件 文件名 SQl_JDBC.zip用my Eclipse控制台操作数据库之前(SQL 2008)之前 应先引入一个架包(sqljdbc4.jar) 在架包导入之后…

matlab 空矩阵耗时,性能 – 更快的方式通过空矩阵乘法初始化数组? (Matlab)

这很奇怪&#xff0c;我看到f更快&#xff0c;而g比你看到的慢。但是他们对我来说都是一样的。也许不同版本的MATLAB&#xff1f;>> g () zeros(1000, 0) * zeros(0, 1000);>> f () zeros(1000)f ()zeros(1000)>> timeit(f)ans 8.5019e-04>> timeit(…

事件对象及其属性

$(function(){$(input).bind(click,function(e){alert(e); //获取对象//event对象的属性alert(e.type);alert(e.target);alert(e.currentTarget);//得到监听元素的DOM&#xff0c;target是点的那个的DOM});$(input).bind(mouseover,function(e){alert(e.relatedTarget);});$(in…

百度网盘php文件怎么打开,如何通过网页版百度网盘下载大文件

最近老张需要在百度网盘下载一个较大的文件&#xff0c;结果他要我必须下载客户端才行&#xff0c;此背景下&#xff0c;在网站找了各种办法&#xff0c;什么模拟手机&#xff0c;F12查看下载链接都不行&#xff0c;最后找到了可行的办法。步骤如下&#xff1a;一&#xff1a;如…

matlab对信号加噪代码,Matlab给信号加噪声

在信号处理中经常需要把噪声叠加到信号上去&#xff0c;在叠加噪声时往往需要满足一定的信噪比&#xff0c;这样产生二个问题&#xff0c;其一噪声是否按指定的信噪比叠加&#xff0c;其二怎么样检验带噪信号中信噪比满足指定的信噪比。在MATLAB中可以用randn产生均值为0方差为…

洛谷 1057——台阶问题(递推与递归二分)

题目描述 有N级的台阶&#xff0c;你一开始在底部&#xff0c;每次可以向上迈最多K级台阶&#xff08;最少1级&#xff09;&#xff0c;问到达第N级台阶有多少种不同方式。 输入输出格式 输入格式&#xff1a; 输入文件的仅包含两个正整数N&#xff0c;K。 输出格式&#xff1…

在matlab中ungetfile后,11条Matlab实用小技巧

2011-02-25 15:361.在用循环画很多图时&#xff0c;为了减少对内存的占用&#xff0c;可以设置图像不显示&#xff0c;直接保存起来。其实也很简单&#xff0c;就是在plot等语句前加上一句&#xff1a;figure(visible,off)。这样画图时就不显示了&#xff01;2.记得很久以前就有…

ngix 创建新的网站

1. 进入ngix 的目录的conf 目录 的 vhosts 2. 复制一份新的v2.edc.com.conf 3. server_name : v2.edc.com root : /ali/...../目录 4. 重启nginx 服务 │ /etc/init.d/nginx start|stop|restart │ │ …

pkcs1转pkcs8 php,openssl RSA密钥格式PKCS1和PKCS8相互转换

openssl 生成pkcs1格式的私钥&#xff0c;密钥长度2048位, (PKCS1)openssl genrsa -out private.pkcs1.pem 2048PKCS1私钥转换为PKCS8openssl pkcs8 -topk8 -inform PEM -in private.pkcs1.pem -outform pem -nocrypt -out private.pkcs8.pem逆过程&#xff1a;PKCS8格式私钥再…

php上传同一张图片,两种php实现图片上传的方法_PHP

图片上传在项目中经常用到&#xff0c;几乎没有任何一个项目可以脱离图片或者是文件上传。本篇我在这向大家介绍两种常规的上传方式。(注&#xff1a;在这里我们仅仅是对功能的实现&#xff0c;不去做过多的前端的样式)一、利用form表单上传此种方式是最原始的上传方式&#xf…

用C语言实现中文到unicode码的转换

转自: http://blog.csdn.net/qq_21792169/article/details/50379275 源文件用不同的编码方式编写,会导致执行结果不一样 由于本人喜欢用Notepad编辑器&#xff0c;该编辑器的好处是小巧灵活&#xff0c;但是有几个地方做的不足&#xff0c;但是我都能够很好的采取相应的措施来…

java位运算求幂,程序员必学:快速幂算法

前阵子&#xff0c;有小伙伴在我B站的算法教程底下留言小伙伴们有任何疑问或者希望我解说任何内容&#xff0c;都可以在我的小我私家B站或民众号(xmg_mj)留言哦&#xff0c;我会尽我最大能力、只管抽时间去写文章\录视频来回应人人。关于快速幂实在快速幂相关的问题&#xff0c…

java过滤器

过滤器 1、Filter工作原理&#xff08;执行流程&#xff09; 当客户端发出Web资源的请求时&#xff0c;Web服务器根据应用程序配置文件设置的过滤规则进行检查&#xff0c;若客户请求满足过滤规则&#xff0c;则对客户请求&#xff0f;响应进行拦截&#xff0c;对请求头…

memory php 变量,php入门-变量

打印一串字符。echo PHP学到家&#xff0c;走到哪儿都不怕&#xff01;;?>输出236的计算结果echo 236;?>.连接符echo "Good,"."morning!";?>注释//echo "欢迎同学们&#xff01;";echo 12345;?>什么是变量$var "学PHP&quo…

假设检验

假设检验分参数假设和非参数假设。 假设 先假设原假设H0&#xff0c;对应的反面叫做备择假设H1。SAS一般沿用的规则是NEYMAN和PEARSON提出的&#xff1a;在控制犯第一类错误的原则下&#xff0c;是犯第二类错误的概率尽量小&#xff08;即&#xff0c;原假设受到保护&#xff0…

jeesite在eclipse中部署

1&#xff1a;下载下来最新版本的jeesite&#xff0c;首先要在本地安装好maven运行环境 2&#xff1a;运行 bin/eclipse.bat 生成工程文件并下载jar依赖包 如果需要修改默认项目名&#xff0c;请打开pom.xml修改第7行artifactId&#xff0c;然后再执行eclipse.bat文件 3&…