多个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 相关文章推荐
键盘 keycode的值 javascript时触发事件时很有用的要素
Nov 02 Javascript
详解PHP中pathinfo()函数导致的安全问题
Jan 05 Javascript
谈谈Vue.js——vue-resource全攻略
Jan 16 Javascript
webpack打包后直接访问页面图片路径错误的解决方法
Jun 17 Javascript
JavaScript变量声明var,let.const及区别浅析
Apr 23 Javascript
vue 2.8.2版本配置刚进入时候的默认页面方法
Sep 21 Javascript
微信小程序如何实现全局重新加载
Jun 05 Javascript
vue实现在线学生录入系统
May 30 Javascript
Node.js中出现未捕获异常的处理方法
Jun 29 Javascript
微信小程序连续签到7天积分获得功能的示例代码
Aug 20 Javascript
全局安装 Vue cli3 和 继续使用 Vue-cli2.x操作
Sep 08 Javascript
Vue项目打包编译优化方案
Sep 16 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
关于时间计算的结总
2006/12/06 PHP
PHP ignore_user_abort函数详细介绍和使用实例
2014/07/15 PHP
PHP中$GLOBALS['HTTP_RAW_POST_DATA']和$_POST的区别分析
2017/07/03 PHP
基于laravel-admin 后台 列表标签背景的使用方法
2019/10/03 PHP
PHP使用PDO实现mysql防注入功能详解
2019/12/20 PHP
php使用Swoole实现毫秒级定时任务的方法
2020/09/04 PHP
你所要知道JS(DHTML)中的一些技巧
2007/01/09 Javascript
不用MOUSEMOVE也能滑动啊
2007/05/23 Javascript
JavaScript 捕获窗口关闭事件
2009/07/26 Javascript
Javascript 判断客户端浏览器类型代码
2010/03/01 Javascript
简介JavaScript中的setHours()方法的使用
2015/06/11 Javascript
浅谈js里面的InttoStr和StrtoInt
2016/06/14 Javascript
AnjularJS中$scope和$rootScope的区别小结
2016/09/18 Javascript
jquery+ajax实现省市区三级联动效果简单示例
2017/01/04 Javascript
微信小程序promsie.all和promise顺序执行
2017/10/27 Javascript
讲解vue-router之什么是动态路由
2018/05/28 Javascript
vue实现带过渡效果的下拉菜单功能
2020/02/19 Javascript
JS实现无限轮播无倒退效果
2020/09/21 Javascript
微信小程序tab左右滑动切换功能的实现代码
2021/02/08 Javascript
[01:33]一分钟玩转DOTA2第三弹:DOTA2&DotA快捷操作大对比
2014/06/04 DOTA
[54:41]2018DOTA2亚洲邀请赛3月30日 小组赛B组 VGJ.T VS paiN
2018/03/31 DOTA
Python 字符串大小写转换的简单实例
2017/01/21 Python
Ubuntu+python将nii图像保存成png格式
2019/07/18 Python
django多个APP的urls设置方法(views重复问题解决)
2019/07/19 Python
解决Django中checkbox复选框的传值问题
2020/03/31 Python
html5 的a标签 Href 拨电话的写法
2013/11/04 HTML / CSS
HTML5 CSS3打造相册效果附源码下载
2014/06/16 HTML / CSS
美国学校校服,儿童和婴儿服装:Cookie’s Kids
2016/10/14 全球购物
意大利咖啡、浓缩咖啡和浓缩咖啡机:illy caffe
2019/03/20 全球购物
个人评价范文分享
2014/01/11 职场文书
促销活动方案模板
2014/02/24 职场文书
黄河绝恋观后感
2015/06/08 职场文书
CocosCreator如何实现划过的位置显示纹理
2021/04/14 Javascript
浅谈JS的原型和原型链
2021/06/04 Javascript
MySQL 时间类型的选择
2021/06/05 MySQL
Python实战之大鱼吃小鱼游戏的实现
2022/04/01 Python