多个jQuery版本共存的处理方案


Posted in Javascript onMarch 17, 2015

如何在一个页面上让多个jQuery共存呢?比如jquery-1.5和jquery-1.11。

你可能会问,为什么需要在一个页面上让多个jQuery共存?直接引用最新版本的jQuery不行吗?

答案是,不行。因为现实生活是非常残酷的。举个栗子:

现有网站已经引用了jQuery 1.5以及相关插件。如果直接将jQuery升级到最新版,这些插件就不工作了,除非你能把这些插件全部升级,或者等各个插件的作者发布支持最新版jQuery的版本。

现在,如果我们要基于jQuery开发新的插件或者写JavaScript代码,用新版本会比较省时省力。

但旧版本又绝对不能扔掉,怎么办?

方法是通过jQuery的noConflict()来让多版本共存。

当我们导入jQuery时,jQuery仅向window这个全局空间注入两个变量:

   window.$ = window.jQuery = { jQuery object };

同时,jQuery内部保留旧的window.$和window.jQuery对象的引用。当我们调用:

   var $jq = $.noConflict();

window.$被恢复,但window.jQuery仍是jQuery。

当我们调用:

   var $jq = $.noConflict(true);

window.$和window.jQuery都被恢复了,一切看起来就像jQuery从未被导入过一样,只不过可以通过变量$jq来使用jQuery。

所以,让新旧版本共存的jQuery可以这样实现:

   <script src="jquery-1.5.js"></script>

   <script src="jquery-1.11.js"></script>

   <script>

      // 现在window.$和window.jQuery是1.11版本:

      console.log($().jquery); // => '1.11.0'

      var $jq = jQuery.noConflict(true);

      // 现在window.$和window.jQuery被恢复成1.5版本:

      console.log($().jquery); // => '1.5.0'

      // 可以通过$jq访问1.11版本的jQuery了

   </script>

   <script src="myscript.js"></script>

在myscript.js中,用$jq就可以访问1.11版本的jQuery了。

至此,问题解决。

但是,引入两个版本的jQuery后,页面被搞得乱七八糟。如果有人看不懂代码,把var $jq = jQuery.noConflict(true);删掉了怎么办?或者,把导入jQuery的两行互换了位置,最后就得不到正确的jQuery版本。

最好的办法是不改动页面,直接引用我们编写的新的js文件:

   <script src="jquery-1.5.js"></script>

   <script src="myscript.js"></script>

这样一来,我们就在myscript.js内部引用最新版jQuery,而页面无论有没有jQuery,有哪个版本的jQuery,我们都不关心。

开始编写新的更好的解决方案。首先,把myscript.js的主体确定下来:

   // myscript.js

   (function () {

      // BEGIN

      // TODO: javascript code here...

      // END

   })();

用匿名函数是个好习惯,不污染全局变量,同时杜绝外部代码访问。

下一步是直接把jQuery 1.11的代码嵌进去:

   // myscript.js

   (function () {

      // BEGIN

      /*! jQuery v1.11.1 */

      !function(a,b){"object"==typeof module&&"object"==typeof module.exports?...

      if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=...

      },cur:function(){var a=Zb.propHooks[this.prop];return a&&a.get?a.get(thi...

      var $ = jQuery.noConflict(true);

      // TODO: javascript code here...

      // END

   })();

嵌入的当然是压缩后的代码,一共3行,然后加一句:

   var $ = jQuery.noConflict(true);

注意到$是一个局部变量,在后面的代码中,可以随时引用这个$,跟页面上其他版本的jQuery全局变量$不是一个对象。

最后一步工作就是检查jQuery的协议是否允许我们把jQuery源码直接嵌入我们自己的JavaScript代码。

以上所述就是本文的全部内容了,希望大家能够喜欢。

Javascript 相关文章推荐
url参数中有+、空格、=、%、&amp;、#等特殊符号的问题解决
May 15 Javascript
web网页按比例显示图片实现原理及js代码
Aug 09 Javascript
js select option对象小结
Dec 20 Javascript
js模拟C#中List的简单实例
Mar 06 Javascript
jquery easyui 结合jsp简单展现table数据示例
Apr 18 Javascript
理解javascript定时器中的setTimeout与setInterval
Feb 23 Javascript
浅析JavaScriptSerializer类的序列化与反序列化
Nov 22 Javascript
bootstrap是什么_动力节点Java学院整理
Jul 14 Javascript
JavaScript表单即时验证 验证不成功不能提交
Aug 31 Javascript
js 提取某()特殊字符串长度的实例
Dec 06 Javascript
详细分析vue表单数据的绑定
Jul 20 Javascript
Nuxt 项目性能优化调研分析
Nov 07 Javascript
jquery通过closest选择器修改上级元素的方法
Mar 17 #Javascript
jQuery判断元素上是否绑定了指定事件的方法
Mar 17 #Javascript
jQuery验证元素是否为空的两种常用方法
Mar 17 #Javascript
jQuery在ul中显示某个li索引号的方法
Mar 17 #Javascript
jQuery支持动态参数将函数绑定到事件上的方法
Mar 17 #Javascript
jQuery实现预加载图片的方法
Mar 17 #Javascript
jQuery检测鼠标左键和右键点击的方法
Mar 17 #Javascript
You might like
长波知识介绍
2021/03/01 无线电
php中http与https跨域共享session的解决方法
2014/12/20 PHP
浅谈Laravel模板实体转义带来的坑
2019/10/22 PHP
PHP实现文件上传与下载
2020/08/28 PHP
jquery 的 $(&quot;#id&quot;).html() 无内容的解决方法
2010/06/07 Javascript
使用js获取地址栏中传递的值
2013/07/02 Javascript
Javascript浅谈之this
2013/12/17 Javascript
jQuery判断复选框是否勾选的原理及示例
2014/05/21 Javascript
Javascript基础教程之break和continue语句
2015/01/18 Javascript
关于js里的this关键字的理解
2015/08/17 Javascript
jquery实现可自动收缩的TAB网页选项卡代码
2015/09/06 Javascript
JS 实现可停顿的垂直滚动实例代码
2016/11/23 Javascript
JS实现搜索框文字可删除功能
2016/12/28 Javascript
对称加密与非对称加密优缺点详解
2017/02/06 Javascript
微信小程序checkbox组件使用详解
2018/01/31 Javascript
JavaScript生成指定范围的时间列表
2018/03/19 Javascript
ES6中let 和 const 的新特性
2018/09/03 Javascript
小程序实现展开/收起的效果示例
2018/09/22 Javascript
jQuery中实现text()的方法
2019/04/04 jQuery
Vue 理解之白话 getter/setter详解
2019/04/16 Javascript
python实现dict版图遍历示例
2014/02/19 Python
深度定制Python的Flask框架开发环境的一些技巧总结
2016/07/12 Python
python的pdb调试命令的命令整理及实例
2017/07/12 Python
Python3 单行多行万能正则匹配方法
2019/01/07 Python
tensorflow/core/platform/cpu_feature_guard.cc:140] Your CPU supports instructions that this T
2020/06/22 Python
Python-openpyxl表格读取写入的案例详解
2020/11/02 Python
Python3.9最新版下载与安装图文教程详解(Windows系统为例)
2020/11/28 Python
python 基于opencv 实现一个鼠标绘图小程序
2020/12/11 Python
python 高阶函数简单介绍
2021/02/19 Python
CSS3 实现footer 固定在底部(无论页面多高始终在底部)
2019/10/15 HTML / CSS
购买200个世界上最好的内衣品牌:Bare Necessities
2017/02/11 全球购物
优秀学生干部主要事迹材料
2015/11/04 职场文书
2016幼儿园新学期寄语
2015/12/03 职场文书
图解排序算法之希尔排序Java实现
2021/06/26 Java/Android
用Python编写简单的gRPC服务的详细过程
2021/07/04 Python
centos8安装MongoDB的详细过程
2021/10/24 MongoDB