欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

多个jQuery版本共存的处理方案

程序员文章站 2022-03-05 15:18:24
如何在一个页面上让多个jquery共存呢?比如jquery-1.5和jquery-1.11。 你可能会问,为什么需要在一个页面上让多个jquery共存?直接引用最新版本的jque...

如何在一个页面上让多个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代码。

以上所述就是本文的全部内容了,希望大家能够喜欢。