多个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 不只是脚本
May 30 Javascript
Add Formatted Data to a Spreadsheet
Jun 12 Javascript
表单提交前触发函数返回true表单才会提交
Mar 11 Javascript
DOM基础教程之模型中的模型节点
Jan 19 Javascript
AngularJS入门教程之Helloworld示例
Dec 25 Javascript
JS如何判断浏览器类型和详细区分IE各版本浏览器
Mar 04 Javascript
详解react服务端渲染(同构)的方法
Sep 21 Javascript
利用JS判断客户端类型你应该知道的四种方法
Dec 22 Javascript
Angular5中调用第三方js插件的方法
Feb 26 Javascript
解决vue+webpack打包路径的问题
Mar 06 Javascript
js实现带箭头的进度流程
Mar 26 Javascript
在vue中封装方法以及多处引用该方法详解
Aug 14 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/03/27 PHP
php中获得视频时间总长度的另一种方法
2011/09/15 PHP
Prototype1.5 rc2版指南最后一篇之Position
2007/01/10 Javascript
javascript实现动态CSS换肤技术的脚本
2007/06/29 Javascript
JavaScript入门学习书籍推荐
2008/06/12 Javascript
JavaScript入门教程(12) js对象化编程
2009/01/31 Javascript
js+css使DIV始终居于屏幕中间 左下 左上 右上 右下的代码集合
2011/03/10 Javascript
基于JQuery模仿苹果桌面的Dock效果(初级版)
2012/10/15 Javascript
几种延迟加载JS代码的方法加快网页的访问速度
2013/10/12 Javascript
jquery cookie的用法总结
2013/11/18 Javascript
Javascript中各种trim的实现详细解析
2013/12/10 Javascript
jquery datatable后台封装数据示例代码
2014/08/07 Javascript
Bootstrap零基础入门教程(二)
2016/07/18 Javascript
修改Jquery Dialog 位置的实现方法
2016/08/26 Javascript
JavaScript实现自动切换图片代码
2016/10/11 Javascript
ExtJS 4.2 Grid组件单元格合并的方法
2016/10/12 Javascript
jQuery基于xml格式数据实现模糊查询及分页功能的方法
2016/12/25 Javascript
学好js,这些js函数概念一定要知道【推荐】
2017/01/19 Javascript
jquery实现折叠菜单效果【推荐】
2017/03/08 Javascript
JS 设置Cookie 有效期 检测cookie
2017/06/15 Javascript
vue ssr 指南详读
2018/06/29 Javascript
Vue入门学习笔记【基本概念、对象、过滤器、指令等】
2019/04/13 Javascript
轻松解决JavaScript定时器越走越快的问题
2019/05/13 Javascript
jquery实现直播视频弹幕效果
2020/02/25 jQuery
微信小程序返回上一级页面的实现代码
2020/06/19 Javascript
日常整理python执行系统命令的常见方法(全)
2015/10/22 Python
python对DICOM图像的读取方法详解
2017/07/17 Python
python实现上传文件到linux指定目录的方法
2020/01/03 Python
使用Python实现牛顿法求极值
2020/02/10 Python
用Python爬取LOL所有的英雄信息以及英雄皮肤的示例代码
2020/07/13 Python
css3中的calc函数浅析
2018/07/10 HTML / CSS
美国顶级奢侈茶:Mighty Leaf Tea(美泰茶)
2016/11/26 全球购物
高一生物教学反思
2014/01/17 职场文书
天猫某品牌专卖店运营计划书
2014/03/21 职场文书
统计专业自荐书
2014/07/06 职场文书
Python基础之元类详解
2021/04/29 Python