多个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 js cookie的存储,获取和删除
Dec 29 Javascript
javascript面向对象的方式实现的弹出层效果代码
Jan 28 Javascript
为jquery的ajaxfileupload增加附加参数的方法
Mar 04 Javascript
javascript学习笔记之函数定义
Jun 25 Javascript
理解 JavaScript Scoping &amp; Hoisting(二)
Nov 18 Javascript
JavaScript中instanceof运算符的使用示例
Jun 08 Javascript
bootstrap-datetimepicker实现只显示到日期的方法
Nov 25 Javascript
使用微信内嵌H5网页解决JS倒计时失效问题
Jan 13 Javascript
VUE element-ui 写个复用Table组件的示例代码
Nov 18 Javascript
vue同步父子组件和异步父子组件的生命周期顺序问题
Oct 07 Javascript
vue项目页面嵌入代码块vue-prism-editor的实现
Oct 30 Javascript
使用JS实现鼠标放上图片进行放大离开实现缩小功能
Jan 27 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
生成sessionid和随机密码的例子
2006/10/09 PHP
第六章 php目录与文件操作
2011/12/30 PHP
laravel5表单唯一验证的实例代码
2019/09/30 PHP
Laravel实现搜索的时候分页并携带参数
2019/10/15 PHP
Prototype PeriodicalExecuter对象 学习
2009/07/19 Javascript
JavaScript中的原型链prototype介绍
2014/12/30 Javascript
JavaScript调用浏览器打印功能实例分析
2015/07/17 Javascript
jquery判断复选框是否选中进行答题提示特效
2015/12/10 Javascript
JSON字符串和对象相互转换实例分析
2016/06/16 Javascript
用jQuery实现优酷首页轮播图
2017/01/09 Javascript
js获取文件里面的所有文件名(实例)
2017/10/17 Javascript
JS实现的雪花飘落特效示例
2019/12/03 Javascript
Javascript数组及类数组相关原理详解
2020/10/29 Javascript
[01:27]2014DOTA2展望TI 剑指西雅图IG战队专访
2014/06/30 DOTA
Python continue语句用法实例
2014/03/11 Python
基础的十进制按位运算总结与在Python中的计算示例
2016/06/28 Python
Ubuntu下创建虚拟独立的Python环境全过程
2017/02/10 Python
转换科学计数法的数值字符串为decimal类型的方法
2018/07/16 Python
python实现ID3决策树算法
2018/08/29 Python
在python3中pyqt5和mayavi不兼容问题的解决方法
2019/01/08 Python
python networkx 根据图的权重画图实现
2019/07/10 Python
python实现微信自动回复机器人功能
2019/07/11 Python
Python批量处理csv并保存过程解析
2020/05/16 Python
HTML5 video 事件应用示例
2014/09/11 HTML / CSS
.net面试题
2016/09/17 面试题
大学生学习自我评价
2014/01/13 职场文书
医科大学毕业生自荐信
2014/02/03 职场文书
致垒球运动员加油稿
2014/02/16 职场文书
信息与计算科学专业推荐信
2014/02/23 职场文书
求职者怎样写自荐信
2014/04/13 职场文书
2014年“四风”问题个人整改措施
2014/09/17 职场文书
教师党员个人自我剖析材料
2014/09/29 职场文书
2014年会计人员工作总结
2014/12/10 职场文书
考试作弊检讨
2015/01/27 职场文书
2015年感恩母亲节活动方案
2015/05/04 职场文书
2015年新农村建设指导员工作总结
2015/07/24 职场文书