IT技术博客大学习 共学习 共进步

如何在一个页面上让多个jQuery版本共存

廖雪峰的官方网站 2015-01-23 23:49:54 累计浏览 4,268 次
本机暂存

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

建议继续学习

  1. JQuery实现Excel表格呈现 (累计阅读 48,255)
  2. 分享一个JQUERY颜色选择插件 (累计阅读 14,143)
  3. jQuery插件---轻量级的弹出窗口wBox. (累计阅读 10,691)
  4. 10个强大的Ajax jQuery文件上传程序 (累计阅读 8,799)
  5. jQuery性能优化指南 (累计阅读 8,717)
  6. jQuery的data()方法 (累计阅读 8,571)
  7. jQuery Color Animations颜色动画插件 (累计阅读 8,415)
  8. 精于图片处理的10款jQuery插件 (累计阅读 7,318)
  9. 配合jquery实现异步加载页面元素 (累计阅读 6,352)
  10. jQuery中getJSON跨域原理详解 (累计阅读 6,307)