多个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 相关文章推荐
用jquery中插件dialog实现弹框效果实例代码
Nov 15 Javascript
JS对象转换为Jquery对象实现代码
Dec 29 Javascript
jQuery实现复选框全选/取消全选/反选及获得选择的值
Jun 12 Javascript
js实现文本框选中的方法
May 26 Javascript
原生js实现下拉框功能(支持键盘事件)
Jan 13 Javascript
JavaScript使用readAsDataUrl方法预览图片
May 10 Javascript
bootstrap-table实现服务器分页的示例 (spring 后台)
Sep 01 Javascript
JS使用贪心算法解决找零问题示例
Nov 27 Javascript
浅谈gulp创建完整的项目流程
Dec 20 Javascript
django使用channels2.x实现实时通讯
Nov 28 Javascript
使用ESLint禁止项目导入特定模块的方法步骤
Mar 04 Javascript
JavaScript如何判断对象有某属性
Jul 03 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
咖啡豆的最常见发酵处理方法,详细了解一下
2021/03/03 冲泡冲煮
php根据isbn书号查询amazon网站上的图书信息的示例
2014/02/13 PHP
PHP实现过滤掉非汉字字符只保留中文字符
2015/06/04 PHP
PHP实现路由映射到指定控制器
2016/08/13 PHP
详解PHP处理密码的几种方式
2016/11/30 PHP
php多进程并发编程防止出现僵尸进程的方法分析
2020/02/28 PHP
js实现运行代码需要刷新的解决方法
2007/08/18 Javascript
JavaScript 事件参考手册
2008/12/24 Javascript
JQuery 应用 JQuery.groupTable.js
2010/12/15 Javascript
php对mongodb的扩展(初识如故)
2012/11/11 Javascript
JavaScript中的连字符详解
2013/11/28 Javascript
Javascript中的默认参数详解
2014/10/22 Javascript
不同js异步函数同步的实现方法
2016/05/28 Javascript
微信小程序 标签传入数据
2017/05/08 Javascript
JavaScript之浏览器对象_动力节点Java学院整理
2017/07/03 Javascript
表格展示利器 Bootstrap Table实例代码
2017/09/06 Javascript
基于vue2实现左滑删除功能
2017/11/28 Javascript
JavaScript设计模式之单例模式简单实例教程
2018/07/02 Javascript
使用Vue做一个简单的todo应用的三种方式的示例代码
2018/10/20 Javascript
用Python写王者荣耀刷金币脚本
2017/12/21 Python
WxPython建立批量录入框窗口
2019/02/27 Python
python连接、操作mongodb数据库的方法实例详解
2019/09/11 Python
pytorch 实现删除tensor中的指定行列
2020/01/13 Python
利用keras使用神经网络预测销量操作
2020/07/07 Python
Django中ORM的基本使用教程
2020/12/22 Python
css3实现针线缝合效果(图解步骤)
2013/02/04 HTML / CSS
Bose法国官网:购买耳机、扬声器、家庭影院、专业音响
2017/12/21 全球购物
蒙蒂塞罗商店:Monticello Shop
2018/11/25 全球购物
介绍Ibatis的核心类
2013/11/18 面试题
创业者是否需要商业计划书?
2014/02/07 职场文书
广播节目策划方案
2014/05/23 职场文书
区政府领导班子个人对照检查材料
2014/09/25 职场文书
安全保证书格式
2015/02/28 职场文书
学术研讨会主持词
2015/07/04 职场文书
PHP连接MSSQL数据库案例,PHPWAMP多个PHP版本连接SQL Server数据库
2021/04/16 PHP
laravel ajax curd 搜索登录判断功能的实现
2021/04/17 PHP