多個(gè)jQuery版本共存的處理方案
如何在一個(gè)頁(yè)面上讓多個(gè)jQuery共存呢?比如jquery-1.5和jquery-1.11。
你可能會(huì)問(wèn),為什么需要在一個(gè)頁(yè)面上讓多個(gè)jQuery共存?直接引用最新版本的jQuery不行嗎?
答案是,不行。因?yàn)楝F(xiàn)實(shí)生活是非常殘酷的。舉個(gè)栗子:
現(xiàn)有網(wǎng)站已經(jīng)引用了jQuery 1.5以及相關(guān)插件。如果直接將jQuery升級(jí)到最新版,這些插件就不工作了,除非你能把這些插件全部升級(jí),或者等各個(gè)插件的作者發(fā)布支持最新版jQuery的版本。
現(xiàn)在,如果我們要基于jQuery開(kāi)發(fā)新的插件或者寫JavaScript代碼,用新版本會(huì)比較省時(shí)省力。
但舊版本又絕對(duì)不能扔掉,怎么辦?
方法是通過(guò)jQuery的noConflict()來(lái)讓多版本共存。
當(dāng)我們導(dǎo)入jQuery時(shí),jQuery僅向window這個(gè)全局空間注入兩個(gè)變量:
window.$ = window.jQuery = { jQuery object };
同時(shí),jQuery內(nèi)部保留舊的window.$和window.jQuery對(duì)象的引用。當(dāng)我們調(diào)用:
var $jq = $.noConflict();
window.$被恢復(fù),但window.jQuery仍是jQuery。
當(dāng)我們調(diào)用:
var $jq = $.noConflict(true);
window.$和window.jQuery都被恢復(fù)了,一切看起來(lái)就像jQuery從未被導(dǎo)入過(guò)一樣,只不過(guò)可以通過(guò)變量$jq來(lái)使用jQuery。
所以,讓新舊版本共存的jQuery可以這樣實(shí)現(xiàn):
<script src="jquery-1.5.js"></script>
<script src="jquery-1.11.js"></script>
<script>
// 現(xiàn)在window.$和window.jQuery是1.11版本:
console.log($().jquery); // => '1.11.0'
var $jq = jQuery.noConflict(true);
// 現(xiàn)在window.$和window.jQuery被恢復(fù)成1.5版本:
console.log($().jquery); // => '1.5.0'
// 可以通過(guò)$jq訪問(wèn)1.11版本的jQuery了
</script>
<script src="myscript.js"></script>
在myscript.js中,用$jq就可以訪問(wèn)1.11版本的jQuery了。
至此,問(wèn)題解決。
但是,引入兩個(gè)版本的jQuery后,頁(yè)面被搞得亂七八糟。如果有人看不懂代碼,把var $jq = jQuery.noConflict(true);刪掉了怎么辦?或者,把導(dǎo)入jQuery的兩行互換了位置,最后就得不到正確的jQuery版本。
最好的辦法是不改動(dòng)頁(yè)面,直接引用我們編寫的新的js文件:
<script src="jquery-1.5.js"></script>
<script src="myscript.js"></script>
這樣一來(lái),我們就在myscript.js內(nèi)部引用最新版jQuery,而頁(yè)面無(wú)論有沒(méi)有jQuery,有哪個(gè)版本的jQuery,我們都不關(guān)心。
開(kāi)始編寫新的更好的解決方案。首先,把myscript.js的主體確定下來(lái):
// myscript.js
(function () {
// BEGIN
// TODO: javascript code here...
// END
})();
用匿名函數(shù)是個(gè)好習(xí)慣,不污染全局變量,同時(shí)杜絕外部代碼訪問(wèn)。
下一步是直接把jQuery 1.11的代碼嵌進(jìn)去:
// 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
})();
嵌入的當(dāng)然是壓縮后的代碼,一共3行,然后加一句:
var $ = jQuery.noConflict(true);
注意到$是一個(gè)局部變量,在后面的代碼中,可以隨時(shí)引用這個(gè)$,跟頁(yè)面上其他版本的jQuery全局變量$不是一個(gè)對(duì)象。
最后一步工作就是檢查jQuery的協(xié)議是否允許我們把jQuery源碼直接嵌入我們自己的JavaScript代碼。
以上所述就是本文的全部?jī)?nèi)容了,希望大家能夠喜歡。
相關(guān)文章
JQuery給select添加/刪除節(jié)點(diǎn)的實(shí)現(xiàn)代碼
下面小編就為大家?guī)?lái)一篇JQuery給select添加/刪除節(jié)點(diǎn)的實(shí)現(xiàn)代碼。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考2016-04-04
jQuery基于cookie實(shí)現(xiàn)的購(gòu)物車實(shí)例分析
這篇文章主要介紹了jQuery基于cookie實(shí)現(xiàn)購(gòu)物車的方法,結(jié)合實(shí)例形式簡(jiǎn)單分析了jQuery基于cookie實(shí)現(xiàn)針對(duì)商品信息的購(gòu)物車存儲(chǔ)功能,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-12-12
jQuery實(shí)現(xiàn)彈出窗口中切換登錄與注冊(cè)表單
本文給大家推薦的是一款jQuery實(shí)現(xiàn)彈出窗口中切換登錄與注冊(cè)表單的特效。適用瀏覽器:IE8+、FireFox、Chrome、Safari、Opera。十分的方便實(shí)用,有需要的小伙伴可以參考下。2015-06-06
jQuery EasyUI Pagination實(shí)現(xiàn)分頁(yè)的常用方法
這篇文章主要為大家詳細(xì)介紹了jQuery EasyUI Pagination實(shí)現(xiàn)分頁(yè)的常用方法,感興趣的朋友可以參考一下2016-05-05
jquery實(shí)現(xiàn)簡(jiǎn)單的swiper輪播預(yù)覽原圖
這篇文章主要為大家詳細(xì)介紹了jquery實(shí)現(xiàn)簡(jiǎn)單的swiper輪播預(yù)覽原圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02
jQuery中的insertBefore(),insertAfter(),after(),before()區(qū)別介紹
這篇文章主要介紹了jQuery中的insertBefore(),insertAfter(),after(),before()區(qū)別介紹的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-09-09
jQuery實(shí)現(xiàn)動(dòng)態(tài)添加節(jié)點(diǎn)與遍歷節(jié)點(diǎn)功能示例
這篇文章主要介紹了jQuery實(shí)現(xiàn)動(dòng)態(tài)添加節(jié)點(diǎn)與遍歷節(jié)點(diǎn)功能,結(jié)合實(shí)例形式分析了jQuery針對(duì)頁(yè)面元素節(jié)點(diǎn)元素的動(dòng)態(tài)添加與遍歷相關(guān)操作技巧,需要的朋友可以參考下2017-11-11
基于jQuery實(shí)現(xiàn)淡入淡出效果輪播圖
這篇文章主要為大家詳細(xì)介紹了基于jQuery淡入淡出效果輪播圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-08-08

