Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 393|回复: 0

jQuery多库共存问题解决方法

[复制链接]
  • TA的每日心情
    奋斗
    4 天前
  • 签到天数: 802 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726006
    发表于 2021-6-3 04:06:37 | 显示全部楼层 |阅读模式

    一、问题概述:

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

     

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-11-15 10:48 , Processed in 0.056992 second(s), 28 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表