多个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 相关文章推荐
JavaScript 编程引入命名空间的方法
Jun 29 Javascript
JS backgroundImage控制
May 19 Javascript
js报错 Object doesn't support this property or method的原因分析
Mar 31 Javascript
js控制分页打印、打印分页示例
Feb 08 Javascript
Javascript WebSocket使用实例介绍(简明入门教程)
Apr 16 Javascript
Javascript中的arguments与重载介绍
Mar 15 Javascript
javascript返回顶部的按钮实现方法
Jan 09 Javascript
Vue.js中extend选项和delimiters选项的比较
Jul 17 Javascript
JScript实现表格的简单操作
Aug 15 Javascript
Vue v-model组件封装(类似弹窗组件)
Jan 08 Javascript
微信小程序实现拨打电话功能的示例代码
Jun 28 Javascript
vue实现顶部菜单栏
Nov 08 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的日期与时间函数技巧
2008/04/24 PHP
PHP中for循环与foreach的区别
2017/03/06 PHP
javascript innerHTML使用分析
2010/12/03 Javascript
防止文件缓存的js代码
2013/01/10 Javascript
javascript弹出拖动窗口
2015/08/11 Javascript
jquery实现的Banner广告收缩效果代码
2015/09/02 Javascript
让DIV的滚动条自动滚动到最底部的3种方法(推荐)
2016/09/24 Javascript
JavaScript使用简单正则表达式的数据验证功能示例
2017/01/13 Javascript
Router解决跨模块下的页面跳转示例
2018/01/11 Javascript
聊聊JS动画库 Velocity.js的使用
2018/03/13 Javascript
mocha的时序规则讲解
2019/02/16 Javascript
微信小程序学习笔记之获取位置信息操作图文详解
2019/03/29 Javascript
js实现带搜索功能的下拉框
2020/01/11 Javascript
vue使用video插件vue-video-player详解
2020/10/23 Javascript
python re正则表达式模块(Regular Expression)
2014/07/16 Python
Python实现发送QQ邮件的封装
2017/07/14 Python
python3安装pip3(install pip3 for python 3.x)
2018/04/03 Python
tensorflow更改变量的值实例
2018/07/30 Python
Python实现将通信达.day文件读取为DataFrame
2018/12/22 Python
python实现一个简单的udp通信的示例代码
2019/02/01 Python
django框架model orM使用字典作为参数,保存数据的方法分析
2019/06/24 Python
利用Python绘制Jazz网络图的例子
2019/11/21 Python
python对数组进行排序,并输出排序后对应的索引值方式
2020/02/28 Python
Python3 socket即时通讯脚本实现代码实例(threading多线程)
2020/06/01 Python
老生常谈CSS中的长度单位
2016/06/27 HTML / CSS
localStorage、sessionStorage使用总结
2017/11/17 HTML / CSS
Linux的文件类型
2012/03/07 面试题
女大学生毕业找工作的自我评价
2013/10/03 职场文书
培训主管的职业生涯规划
2014/03/06 职场文书
财务总监管理岗位职责
2014/03/08 职场文书
村干部群众路线教育活动对照检查材料
2014/10/01 职场文书
2015年国庆节活动总结
2015/03/23 职场文书
2015年保险公司工作总结
2015/04/24 职场文书
Python 多线程之threading 模块的使用
2021/04/14 Python
python套接字socket通信
2022/04/01 Python
Go语言 详解net的tcp服务
2022/04/14 Golang