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对象所有的属性和方法

时间: 2024-10-12 16:28:51

jQuery多库共存问题解决方法的相关文章

jQuery 跨域访问问题解决方法

浏览器端跨域访问一直是个问题, 多数研发人员对待js的态度都是好了伤疤忘了疼,所以病发的时候,时不时地都要疼上一疼.记得很久以前使用iframe 加script domain 声明,yahoo js util 的方式解决二级域名跨域访问的问题. 时间过得好快,又被拉回js战场时, 跨域问题这个伤疤又开疼了. 好在,有jquery帮忙,跨域问题似乎没那么难缠了.这次也借此机会对跨域问题来给刨根问底,结合实际的开发项目,查阅了相关资料,算是解决了跨域问题..有必要记下来备忘. 跨域的安全限制都是指浏

222 jQuery 多库共存

? 实际开发中,很多项目连续开发十多年,jQuery版本不断更新,最初的 jQuery 版本无法满足需求,这时就需要保证在旧有版本正常运行的情况下,新的功能使用新的jQuery版本实现,这种情况被称为,jQuery 多库共存. 语法 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport&qu

jQuery 跨域访问问题解决方法(转)

转自:http://www.jb51.net/article/21213.htm 浏览器端跨域访问一直是个问题, 多数研发人员对待js的态度都是好了伤疤忘了疼,所以病发的时候,时不时地都要疼上一疼.记得很久以前使用iframe 加script domain 声明,yahoo js util 的方式解决二级域名跨域访问的问题. 时间过得好快,又被拉回js战场时, 跨域问题这个伤疤又开疼了. 好在,有jquery帮忙,跨域问题似乎没那么难缠了.这次也借此机会对跨域问题来给刨根问底,结合实际的开发项目

jQuery多库共存处理$.noConflict()

如果我们需要同时使用jQuery和其他JavaScript库,我们可以使用 $.noConflict()把$的控制权交给其他库.旧引用的$ 被保存在jQuery的初始化; noConflict() 简单的恢复它们.    通过类似swap交换的概念,先把之前的存在的命名空间给缓存起来,通过对比当前的命名空间达到交换的目的,首先,我们先判断下当前的的$空间是不是被jQuery接管了,如果是则让出控制权给之前的_$引用的库,如果传入deep为true的话等于是把jQuery的控制权也让出去了.   

jQuery与其他JS库共存

* 事件 * jQuery与其他JS库共存 * 调用jQuery.noConflict()方法 * 表示jQuery将"$"符号的使用权交出 * 通过两种方式将"$"找回 * 第一种 jQuery(function($){// 函数域 // function中定义形参"$" $("ul>li"); }); * 第二种 (function($){// 函数域 $("ul>li"); })(jQue

jQuery插件扩展与多库共存

查看扩展写法 1.工具类扩展 2.对象方法扩展 /* 扩展jQuery的工具方法 : $.extend(object) min(a, b) : 返回较小的值 max(c, d) : 返回较大的值 leftTrim() : 去掉字符串左边的空格 rightTrim() : 去掉字符串右边的空格 */ //正则 /* ^ 匹配字符串开始 \s 匹配空格 + 匹配一次或者多次 $ 匹配字符串的末尾 */ //扩展$ $.extend({ min: function (a, b) { return (a

jQuery跨域问题解决方法

跨域访问时web前端开发者经常遇到的问题,那么什么是跨域呢? 跨域的慨念: 只要协议,域名,端口任何一个不同,都被当作是不同的域.例如在A网站中,我们希望通过AJAX获得B网站中特定的内容,此时A网站和B位置不在同一个域,那么就出现了跨域访问问题.可以理解为两个域名之间不能跨国域名来发送请求或是请求数据,否则就是不安全的. 解决跨域访问的方法: 1.代理: 2.在服务器端设置相应的响应头: 3.JSONP. 接下来,我详细的介绍一下jQuery中的JSONP是如何解决跨域访问的. JSONP(J

Prototype与jQuery冲突|兼容性问题解决方法

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf

jquery.easyui.tabs 中的首个tabs被最后tabs覆盖的问题解决方法

这是由于tabs对href重载的的问题导致,因此我们需要将href更改为其它自定义的属性即可避免此问题的发生. 解决方法如下: 第一步页面端: 循环体开始 <li> <div><a target="tagFrame" href="@n.Url" ><span class="icon icon-sys"> </span>@n.Title</a></div> <