jquery插件沖突(jquery.noconflict)解決方法分享
許多的 JS 框架類庫都選擇使用$符號作為函數(shù)或變量名,jQuery是其中最為典型的一個。在 jQuery 中,$ 符號只是 window.jQuery 對象的一個引用,因此即使 $ 被刪除,window.jQuery 依然是保證整個類庫完整性的堅強后盾。jQuery 的 API 設(shè)計充分考慮了多框架之間的引用沖突,我們可以使用 jQuery.noConflict 方法來輕松實現(xiàn)控制權(quán)的移交。
jQuery.noConflict 方法包含一個可選的布爾參數(shù)[1],用以決定移交 $ 引用的同時是否移交 jQuery 對象本身:
jQuery.noConflict([removeAll])
缺省情況下,執(zhí)行 noConflict 會將變量 $ 的控制權(quán)移交給第一個產(chǎn)生 $ 的庫;當 removeAll 設(shè)置為 true 時,執(zhí)行 noConflict 則會將 $ 和 jQuery 對象本身的控制權(quán)全部移交給第一個產(chǎn)生他們的庫。
例如在 KISSY 和 jQuery 混用,并且慣用 $ = KISSY 來簡化 API 操作的時候,就能夠通過這個方法解決命名沖突的問題。
那么這個機制是如何實現(xiàn)的呢?閱讀 jQuery 源碼開頭[2],首先做的一件事情是這樣的:
// Map over jQuery in case of overwrite
_jQuery = window.jQuery,
// Map over the $ in case of overwrite
_$ = window.$,
容易理解的是,jQuery 通過兩個私有變量映射了 window 環(huán)境下的 jQuery 和 $ 兩個對象,以防止變量被強行覆蓋。一旦 noConflict 方法被調(diào)用,則通過 _jQuery, _$, jQuery, $ 四者之間的差異,來決定控制權(quán)的移交方式,具體的代碼如下:
noConflict: function( deep ) {
if ( window.$ === jQuery ) {
window.$ = _$;
}
if ( deep && window.jQuery === jQuery ) {
window.jQuery = _jQuery;
}
return jQuery;
}
再來看上面所說的參數(shù)設(shè)定問題,如果 deep 沒有設(shè)置,_$ 覆蓋 window.$,此時 jQuery 別名 $ 失效,但 jQuery 本身完好無損。如果有其他類庫或代碼重新定義了 $ 變量,它的控制權(quán)就完全交接出去了。反之如果 deep 設(shè)置為 true 的話,_jQuery 覆蓋 window.jQuery,此時 $ 和 jQuery 都將失效。
這種操作的好處是,不管是框架混用還是 jQuery 多版本共存這種高度沖突的執(zhí)行環(huán)境,由于 noConflict 方法提供的移交機制,以及本身返回未被覆蓋的 jQuery 對象,完全能夠通過變量映射的方式解決沖突。
但無法避免的事實是可能導(dǎo)致的插件失效等問題,當然通過簡單修改上下文參數(shù)即可恢復(fù) $ 別名:
var query = jQuery.noConflict(true);
(function ($) {
// 插件或其他形式的代碼,也可以將參數(shù)設(shè)為 jQuery
})(query);
下面的示例一樣是解決這個問題的
jQuery自誕生以來,版本越來越多,而且jQuery官網(wǎng)的新版本還在不斷的更新和發(fā)布中,但是我們在以前的項目中就已經(jīng)使用了舊版本的jQuery,比如已經(jīng)出現(xiàn)的:1.3.X、1.4.X、1.5.X、1.6.2等等。
由于項目的需要,必然也需要不斷的使用較新版的jQuery,但對于原來就已經(jīng)存在并已經(jīng)采用了的舊jQuery版本,我們?nèi)绾巫尪鄠€不同的jQuery版本在同一個頁面并存而不沖突呢?
其實,利用jQuery.noConflict()特性,我們不僅可以讓jQuery與其他的JS庫并存,比如Prototype。也可以與jQuery本身的其他不同版本并存而不沖突。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>在同一個頁面中加載多個不同的jQuery版本</title>
<!-- 從谷歌服務(wù)器加載jQuery最新版本 -->
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.js"></script>
<script type="text/javascript">
var jQuery_New = $.noConflict(true);
</script>
<!-- 加載jQuery1.6.2版本 -->
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>
<script type="text/javascript">
var jQuery_1_6_2 = $.noConflict(true);
</script>
<!-- 加載jQuery1.5.2版本 -->
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js"></script>
<script type="text/javascript">
var jQuery_1_5_2 = $.noConflict(true);
</script>
<!-- 加載jQuery1.4.2版本 -->
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<script type="text/javascript">
var jQuery_1_4_2 = $.noConflict(true);
</script>
<!-- 加載jQuery1.3.2版本 -->
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
<script type="text/javascript">
var jQuery_1_3_2 = $.noConflict(true);
</script>
<script type="text/javascript">
alert(jQuery_New.fn.jquery);
alert(jQuery_1_6_2.fn.jquery);
alert(jQuery_1_5_2.fn.jquery);
alert(jQuery_1_4_2.fn.jquery);
alert(jQuery_1_3_2.fn.jquery);
jQuery_New(function($){$('<p>我是最新的'+$.fn.jquery+'版本添加進來的。</p>').appendTo('body');});
jQuery_1_6_2(function($){$('<p>我是'+$.fn.jquery+'版本添加進來的。</p>').appendTo('body');});
jQuery_1_5_2(function($){$('<p>我是'+$.fn.jquery+'版本添加進來的。</p>').appendTo('body');});
jQuery_1_4_2(function($){$('<p>我是'+$.fn.jquery+'版本添加進來的。</p>').appendTo('body');});
jQuery_1_3_2(function($){$('<p>我是'+$.fn.jquery+'版本添加進來的。</p>').appendTo('body');});
</script>
</head>
<body>
在同一個頁面中加載多個不同的jQuery版本
<br>
</body>
</html>
相關(guān)文章
jquery用get實現(xiàn)ajax在ie里面刷新不進入后臺解決方法
jquery用get實現(xiàn)ajax在ie里面刷新不進入后臺的情況想必大家都有遇到過吧,下面與大家分享下具體的解決方法,希望對大家解決問題有所幫助2013-08-08寫得不錯的jquery table鼠標經(jīng)過變色代碼
鼠標經(jīng)過table變色的效果,想必大家都有遇到過吧,其實實現(xiàn)并不難,在本文為大家詳細介紹下jquery是如何實現(xiàn)的,感興趣的朋友可以參看下2013-09-09淺談jQuery中對象遍歷.eq().first().last().slice()方法
本文給大家分析了jQuery中的對象遍歷.eq().first().last().slice()方法的使用,以及他們之間的區(qū)別,jQuery源碼中的使用。2014-11-11jQuery EasyUI API 中文文檔 - TimeSpinner時間微調(diào)器
jQuery EasyUI API 中文文檔 - TimeSpinner時間微調(diào)器介紹,需要的朋友可以參考下。2011-10-10jquery ready函數(shù)、css函數(shù)及text()使用示例
想必大家對jquery的ready函數(shù)、css函數(shù)、text()并不陌生吧,其實很好理解的,接下來有個不錯的示例,如果你對此理解還是很模糊可以參考下2013-09-09