多个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 相关文章推荐
Ubuntu 11.10 安装Node.js的方法
Nov 30 Javascript
javascript使用正则表达式检测IP地址
Dec 03 Javascript
异步JavaScript编程中的Promise使用方法
Jul 28 Javascript
js获取及判断键盘按键的方法
Dec 01 Javascript
JS实现的倒计时效果实例(2则实例)
Dec 23 Javascript
jQuery+canvas实现简单的球体斜抛及颜色动态变换效果
Jan 28 Javascript
Javascript单例模式的介绍和实例
Oct 08 Javascript
使用UrlConnection实现后台模拟http请求的简单实例
Jan 04 Javascript
js实现简单的二级联动效果
Mar 09 Javascript
jQuery插件实现非常实用的tab栏切换功能【案例】
Feb 18 jQuery
Vue使用Proxy监听所有接口状态的方法实现
Jun 07 Javascript
TypeScript实用技巧 Nominal Typing名义类型详解
Sep 23 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
日本十大最佳动漫,全都是二次元的神级作品
2019/10/05 日漫
PHP4 与 MySQL 数据库操作函数详解
2006/12/06 PHP
php whois查询API制作方法
2011/06/23 PHP
PHP使用strtotime计算两个给定日期之间天数的方法
2015/03/18 PHP
通过PHP设置BugFree获取邮箱通知
2019/04/25 PHP
ext监听事件方法[初级篇]
2008/04/27 Javascript
javascript结合html5 canvas实现(可调画笔颜色/粗细/橡皮)的涂鸦板
2013/04/27 Javascript
js控制frameSet示例
2013/09/10 Javascript
比较不错的JS/JQuery显示或隐藏文本的方法
2014/02/13 Javascript
JavaScript基础知识学习笔记
2014/12/02 Javascript
js实现键盘Enter键提交表单的方法
2015/05/27 Javascript
jquery实现美观的导航菜单鼠标提示特效代码
2015/09/06 Javascript
JS实现网页游戏中滑块响应鼠标点击移动效果
2015/10/19 Javascript
JavaScript中循环遍历Array与Map的方法小结
2016/03/12 Javascript
Angular 2.x学习教程之结构指令详解
2017/05/25 Javascript
Vue keep-alive实践总结(推荐)
2017/08/31 Javascript
小程序云开发如何实现图片上传及发表文字
2019/05/17 Javascript
vue实现扫码功能
2020/01/17 Javascript
angular组件间传值测试的方法详解
2020/05/07 Javascript
跟老齐学Python之从if开始语句的征程
2014/09/14 Python
使用Python的Twisted框架编写非阻塞程序的代码示例
2016/05/25 Python
Python制作钉钉加密/解密工具
2016/12/07 Python
Django开发中的日志输出的方法
2018/07/02 Python
Python中pyecharts安装及安装失败的解决方法
2020/02/18 Python
Python安装OpenCV的示例代码
2020/03/05 Python
linux面试题参考答案(7)
2014/07/24 面试题
一套软件开发工程师笔试题
2015/05/18 面试题
Hibernate持久层技术
2013/12/16 面试题
QA工程师岗位职责
2013/11/20 职场文书
关于抽烟的检讨书
2014/02/25 职场文书
2014年幼儿园国庆主题活动方案
2014/09/16 职场文书
办公室主任个人对照检查材料思想汇报
2014/10/11 职场文书
父亲节寄语大全
2015/02/27 职场文书
教你解决往mysql数据库中存入汉字报错的方法
2021/05/06 MySQL
python基于tkinter实现gif录屏功能
2021/05/19 Python
浅谈react useEffect闭包的坑
2021/06/08 Javascript