使用jquery时候,曾经遇到两个问题:

1.一个页面里,使用了很多基于jquery的前端ui库,但是各个库之间对jquery的依赖的版本不一样,有的依赖jquery1.4,jquery2.0用不了;有的依赖jquery2.0,jquery1.4用不了。这下就麻烦了,如果先在项目里引入jquery1.4,然后初始化我们的控件,再引入jquery2.0,之前用jquery1.4初始化的控件就全用不了了,能不能在一个页面里同时引用两个jquery,不同的控件用不同的jquery呢?

2.一个页面里,想同时使用了两个ui库,比如easyui和jqueryui,但是两个ui库冲突了,主要因为他们控件定义的名字是一样的。比如一个创建了jQuery.fn.a,另一个ui库也创建了一个jQuery.fn.a,后一个就会把前一个覆盖掉,那有没有可以解决的方法呢?

其实两个问题都是可以解决的。首先我们开发jq插件都时候,都喜欢使用“(function($){})(jQuery);”这样的一段代码,将我们真正的代码包起来,这样的做法主要有两个目的:

1.是为因为js的作用域是函数级的,只有使用函数,才能使得一些局部变量不会“污染”全局作用域或者上层作用域。

2.就是为了更好地兼容jq不同的版本,因为通过参数传递,window上的jQuery变成了别名$,而这个$与window上的$并不是一个东西,即便以后window上的$发送了变化,这个域里的$还是最初传进来的对象。

那么我们可以从这里看出,只要在引入第二个jq前,将第一个jq起个别名,就可以继续使用之前引入的jq了。

如:var $1_4 = $;

<script src="//cdn.bootcss.com/jquery/1.4.0/jquery.js"></script>
<!-- 基于1.4的插件初始化 -->
<script>
var $1_4 = $
</script>
<script src="//cdn.bootcss.com/jquery/2.0.0/jquery.js"></script>
<!-- 基于2.0的插件初始化 -->

这样使用1.4的插件使用$1_4,使用2.0的插件时候使用$,当然在引入2.0后,就没办法再引入基于1.4jq的插件了。

如果自己使用$1_4不是很习惯,我们可以类比$插件的定义来一个“(function($){})(jQuery);”

(function($){
  //使用1.4版本的插件,这里的$就是$1_4
  $("#id")...
})($1_4);

当前,如果还是想让$和jQuery的版本变回1.4,有没有解决办法呢?

当然有了,最蠢的办法就是继续类似命名$1_4这样的方式换名字罢了,但是有没有更优雅的方式呢?

有,这才说到noConflict方法,事实上jquery在覆盖window的原有$和jQuery对象前,做了一个副本_$和_jQuery保存在自己的域中,当如果用户想要让jquery让出$和jQuery的值,将其还原为原来的版本时,可以使用noConflict方法。如:

<script src="//cdn.bootcss.com/jquery/1.4.0/jquery.js"></script>
<script>
console.log($.fn.jquery);
</script>
<script src="//cdn.bootcss.com/jquery/2.0.0/jquery.js"></script>
<script>
console.log($.fn.jquery);
//这里true和false的区别是,如果给true,不仅$要还原,jquery也要还原
$.noConflict(false);
console.log($.fn.jquery);
</script>

输出为:

1.4
2.0
1.4

这样执行noConflict后,$的版本还原为1.4了。事实上noConflict的返回值就是当前的jQuery对象,之前的“var $1_4 = $”也可以使用“var $1_4 = $.noConflict()”代替。

然后是第二个问题,两个同名的插件冲突,如何解决?

其实所有插件都是定义jQuery.fn或者jQuery上,jQuery也是一个js对象。所谓的jq插件,其实就是对jquery的命名空间扩展,如果之前已经定义了这个命名空间,再次定义肯定会覆盖之前那个。这里我想到了一个最笨的方法,就是同事引入两个jQuery对象,将同名插件分别定义在不同的jQuery对象上。至于怎么才能同事引入两个jQuery对象呢?答案很简单,参考jquery版本冲突的解决方案,你都可以同时使用jq1.4和jq2.0了,还不能同时引入两个jq吗?

jquery兼容实验的更多相关文章

  1. jquery 兼容的滚轮事件

    // jquery 兼容的滚轮事件 $(document).on("mousewheel DOMMouseScroll", function (e) { ? : -)) || // ...

  2. jQuery兼容浏览器IE8方法

    在维护公司网站的时候,发现在IE8下jquery会报对象不支持此属性或方法.缺少对象的错误:  在其他浏览器就可以正常运行,当前使用的jquery版本是3.1.1,查资料发现jquery从2.0开始不 ...

  3. JQuery兼容IE6问题汇总(不断更新)

    兼容IE6真是苦逼的差事,无奈中... 逗号的问题:IE6中要去掉最后的逗号 var o={ id:1, Name:"abc", //这里的逗号一定要去掉 } HTML的结构,由于 ...

  4. JQuery 兼容所有浏览器的复制到剪切板功能

    灵机一动想的点子,应该不难理解 <textarea onmousedown='selectAll(this);'>11111</textarea> function selec ...

  5. 兼容IE与firefox火狐的回车事件(js与jquery)

    javascript 兼容IE与firefox火狐的回车事件 复制代码代码如下: <script language="javascript"> function key ...

  6. jQuery学习之路(1)-选择器

    ▓▓▓▓▓▓ 大致介绍 终于开始了我的jQuery学习之路!感觉不能再拖了,要边学习原生JavaScript边学习jQuery jQuery是什么? jQuery是一个快速.简洁的JavaScript ...

  7. Jquery制作--美化下拉框

    平常我们用的原生select下拉框,大部分样式没办法修改,导致在不同的浏览器里面会跟设计图的风格大相径庭.所以为了能让它美化起来,就用JQ模拟了一个下拉框,可以随意定义样式.原生的下拉框也保留在div ...

  8. Jquery制作--循环滚动列表

    自己模仿JQ插件的写法写了一个循环滚动列表插件,支持自定义上.下.左.右四个方向,支持平滑滚动或者间断滚动两种方式,都是通过参数设置.JQ里面有些重复的地方,暂时没想到更好的方法去精简.不过效果还是可 ...

  9. jQuery与Zepto的异同

    一,同: Zepto最初是为移动端开发的库,是jQuery的轻量级替代品,因为它的API和jQuery相似,而文件更小.Zepto最大的优势是它的文件大小,只有8k多,是目前功能完备的库中最小的一个, ...

随机推荐

  1. Android 圆形图片加白边加阴影

    /** * 将图片准转为圆形 * * @param bitmap * @return */ public static Bitmap getRoundedCornerBitmap(String pat ...

  2. 多线程相关------临界区CriticalSection

    多线程一直是短板,整理相关知识方便查询 临界区(Critical Section) 临界区是一段供线程独占式访问的代码.在任意时刻,若有一个线程正在访问该代码段,如果其他所有试图访问的线程都将被挂起, ...

  3. Coping with the TCP TIME-WAIT state on busy Linux servers

    Coping with the TCP TIME-WAIT state on busy Linux servers 文章源自于:https://vincent.bernat.im/en/blog/20 ...

  4. 禁用nested loop join里的spool

    禁用nested loop join里的spool 转载自: https://blogs.msdn.microsoft.com/psssql/2015/12/15/spool-operator-and ...

  5. 借助 Lucene.Net 构建站内搜索引擎(上)

    前言:最近翻开了之前老杨(杨中科)的Lucene.Net站内搜索项目的教学视频,于是作为老杨脑残粉的我又跟着复习了一遍,学习途中做了一些笔记也就成了接下来您看到的这篇博文,仅仅是我的个人笔记,大神请呵 ...

  6. Fd.Service 轻量级WebApi框架

    News December 06 2014: Version 1.0.0.8Add Register Route Configuration iis 7 Integrated Mode: <sy ...

  7. adb server is out of date. killing...

    1.查看adb端口号 adb nodaemon server 打印:cannot bind 'tcp:5037' 2.查看端口被哪个进程占用 netstat -ano | findstr " ...

  8. MySQL数据库数据存放位置修改

    MySQL数据库数据存放位置修改 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品.MySQL 最流行的关系型数据库管理系统,在 WEB 应用方 ...

  9. T型及Fly_by拓扑之应用总结

    前面的文章有分别介绍过T型拓扑及Fly_by拓扑结构,这两种拓扑结构应用最多的应该是在DDR3里面,说到这里,小编又想开始聊聊DDR3的设计了,我想很多人都比较有兴趣. 因为DDR3的设计还是比较复杂 ...

  10. 浅谈微信小程序对于创业者,意味着什么?

    尽管这个话题,有点儿烂大街,然而作为开发者兼创业人,兹以为很有必要为自己梳理一番. 多年前,当萌生创业的念头时,我是这样在脑海里绘制这幅蓝图的: 我需要一个域名,一个服务器,并且备了案. 我需要至少一 ...