多个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 相关文章推荐
JS实现打开本地文件或文件夹
Mar 09 Javascript
JS定时刷新页面及跳转页面的方法
Jul 04 Javascript
JQuery使用$.ajax和checkbox实现下次不在通知功能
Apr 16 Javascript
3种js实现string的substring方法
Nov 09 Javascript
实例讲解javascript注册事件处理函数
Jan 09 Javascript
分享网页检测摇一摇实例代码
Jan 14 Javascript
JavaScript实现iframe自动高度调整和不同主域名跨域
Feb 27 Javascript
js实现多图左右切换功能
Aug 04 Javascript
VUE兄弟组件传值操作实例分析
Oct 26 Javascript
在vue中实现echarts随窗体变化
Jul 27 Javascript
vue使用openlayers实现移动点动画
Sep 24 Javascript
基于openlayers实现角度测量功能
Sep 28 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
PHP脚本的10个技巧(3)
2006/10/09 PHP
php连接与操作PostgreSQL数据库的方法
2014/12/25 PHP
php给每个段落添加空格的方法
2015/03/20 PHP
一份老外写的XMLHttpRequest代码多浏览器支持兼容性
2007/01/11 Javascript
用prototype实现的简单小巧的多级联动菜单
2007/03/24 Javascript
js获取IFRAME当前的URL的方法
2013/11/13 Javascript
node.js中的fs.realpathSync方法使用说明
2014/12/16 Javascript
JavaScript从数组中删除指定值元素的方法
2015/03/18 Javascript
基于WebUploader的文件上传js插件
2016/08/19 Javascript
JS使用cookie实现只出现一次的广告代码效果
2017/04/22 Javascript
手写简单的jQuery雪花飘落效果实例
2018/04/22 jQuery
使用vue-cli创建项目的图文教程(新手入门篇)
2018/05/02 Javascript
JS 音频可视化插件Wavesurfer.js的使用教程
2018/10/31 Javascript
layui使用templet格式化表格数据的方法
2019/09/16 Javascript
简单了解JavaScript sort方法
2019/11/25 Javascript
使用js实现单链解决前端队列问题的方法
2020/02/03 Javascript
使用AutoJs实现微信抢红包的代码
2020/12/31 Javascript
[45:25]完美世界DOTA2联赛循环赛 PXG vs IO 第一场 11.06
2020/11/09 DOTA
编写Python脚本批量下载DesktopNexus壁纸的教程
2015/05/06 Python
Python中使用装饰器时需要注意的一些问题
2015/05/11 Python
virtualenv实现多个版本Python共存
2017/08/21 Python
python用类实现文章敏感词的过滤方法示例
2019/10/27 Python
Python求正态分布曲线下面积实例
2019/11/20 Python
Python字符串格式化f-string多种功能实现
2020/05/07 Python
python接入支付宝的实例操作
2020/07/20 Python
微软英国官方网站:Microsoft英国
2016/10/15 全球购物
介绍一下内联、左联、右联
2013/12/31 面试题
统计专业自荐书
2014/07/06 职场文书
代收款委托书范本
2014/10/01 职场文书
房屋租赁委托书范本
2014/10/04 职场文书
2014购房个人委托书范本
2014/10/12 职场文书
2015小学教师年度工作总结
2015/05/12 职场文书
大学学习委员竞选稿
2015/11/20 职场文书
【DOTA2】总决赛血虐~ XTREME GAMING vs MAGMA - OGA DOTA PIT 2022 CN
2022/04/02 DOTA
pytest实现多进程与多线程运行超好用的插件
2022/07/15 Python
js基于div丝滑实现贝塞尔曲线
2022/09/23 Javascript