多个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中的集合及效率
Jan 08 Javascript
jquery 查找select ,并触发事件的实现代码
Mar 30 Javascript
jquery实现checkbox全选全不选的简单实例
Dec 31 Javascript
浅析javascript中的事件代理
Nov 06 Javascript
前端学习笔记style,currentStyle,getComputedStyle的用法与区别
May 28 Javascript
JavaScrpt的面向对象全面解析
May 09 Javascript
Node.js中使用mongoose操作mongodb数据库的方法
Sep 12 Javascript
Vue的移动端多图上传插件vue-easy-uploader的示例代码
Nov 27 Javascript
element-ui中select组件绑定值改变,触发change事件方法
Aug 24 Javascript
关于node-bindings无法在Electron中使用的解决办法
Dec 18 Javascript
小程序Request的另类用法详解
Aug 09 Javascript
详细介绍解决vue和jsp结合的方法
Feb 06 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
3
2006/10/09 PHP
PHP代码实现表单数据验证类
2015/07/28 PHP
php正则匹配文章中的远程图片地址并下载图片至本地
2015/09/29 PHP
PHP设计模式之数据访问对象模式(DAO)原理与用法实例分析
2019/12/12 PHP
基于Bootstrap的后台管理面板 Bootstrap Metro Dashboard
2016/06/17 Javascript
Javascript动画效果(1)
2016/10/11 Javascript
angularjs ocLazyLoad分步加载js文件实例
2017/01/17 Javascript
javascript 显示全局变量与隐式全局变量的区别
2017/02/09 Javascript
jQuery文字轮播特效
2017/02/12 Javascript
JavaScript之json_动力节点Java学院整理
2017/06/29 Javascript
浅谈vuepress 踩坑记
2018/04/18 Javascript
vue vantUI实现文件(图片、文档、视频、音频)上传(多文件)
2019/10/15 Javascript
vue 解决数组赋值无法渲染在页面的问题
2019/10/28 Javascript
通过实例解析js可枚举属性与不可枚举属性
2020/12/02 Javascript
three.js如何实现3D动态文字效果
2021/03/03 Javascript
[14:20]刀塔大凶女神互压各路奇葩屌丝
2014/05/16 DOTA
跟老齐学Python之有容乃大的list(2)
2014/09/15 Python
Python操作Word批量生成文章的方法
2015/07/28 Python
Python进阶篇之字典操作总结
2016/11/16 Python
python监控进程脚本
2018/04/12 Python
对python sklearn one-hot编码详解
2018/07/10 Python
python3+PyQt5 自定义窗口部件--使用窗口部件样式表的方法
2019/06/26 Python
对python中的float除法和整除法的实例详解
2019/07/20 Python
如果Session Bean得Remove方法一直都不被调用会怎么样
2012/07/14 面试题
若通过ObjectOutputStream向一个文件中多次以追加方式写入object,为什么用ObjectInputStream读取这些object时会产生StreamCorruptedException?
2016/10/17 面试题
考试不及格的检讨书
2014/01/22 职场文书
进步之星获奖感言
2014/02/22 职场文书
小学家长评语大全
2014/04/16 职场文书
幼儿园大班家长评语
2014/04/17 职场文书
毕业生找工作求职信
2014/08/05 职场文书
教师节活动总结
2014/08/29 职场文书
2014镇副书记群众路线专题民主生活会思想汇报
2014/09/23 职场文书
财务会计实训报告
2014/11/05 职场文书
2015年计生协会工作总结
2015/04/24 职场文书
放飞理想主题班会
2015/08/14 职场文书
Win11远程连接不上怎么办?Win11远程桌面用不了的解决方法
2022/08/05 数码科技