DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> JavaScript入門知識 >> jQuery入門知識 >> JQuery特效代碼 >> jQuery中noConflict()用法實例教程分析
jQuery中noConflict()用法實例教程分析
編輯:JQuery特效代碼     

本文實例講述了jQuery中noConflict()用法。分享給大家供大家參考。具體分析如下:

jQuery默認使用"$"操作符,$ 符號只是 window.jQuery 對象的一個引用,jQuery.noConflict() ,這個函數將變量$的控制權讓渡給第一個實現它的那個庫。這有助於確保jQuery不會與其他庫的$對象發生沖突。在運行這個函數後,就只能使用jQuery變量訪問jQuery對象。例如,在要用到$("div p")的地方,就必須換成jQuery("div p")。

一、"$"操作符

1、jQuery默認使用"$"操作符,prototype等其他框架也是是使用"$",於是,如果jQuery在其他庫之後引入,那麼jQuery將獲得"$"使用權。這樣的情況也很容易理解,畢竟JS是從上到下流式執行的。

2、如果在其他使用"$"的庫之前引入jQuery,那麼jQuery將不會占用"$"。

提示:在其他 JavaScript 庫為其函數使用 $ 時,該方法很有用。

我們在jquery中獲取變量都會使用到$,但是還有很多插件都是可以使用$這個符號了,如果我們同時要引用就會導致出現問題了,jquery為了防止這種事情發生就引入了noconflict()

二、jQuery.noConflict的定義
 
jQuery.noConflict 方法包含一個可選的布爾參數,用以決定移交 $ 引用的同時是否移交 jQuery 對象本身:

jQuery.noConflict([removeAll])

函數的說明:

缺省情況下,執行 noConflict 會將變量 $ 的控制權移交給第一個產生 $ 的庫;當 removeAll 設置為 true 時,執行 noConflict 則會將 $ 和 jQuery 對象本身的控制權全部移交給第一個產生他們的庫。
 
三、jQuery.noConflict源碼分析
 
jQuery 源碼開頭,首先做的一件事情是這樣的:

// Map over jQuery in case of overwrite
_jQuery = window.jQuery,
// Map over the $ in case of overwrite
_$ = window.$,

容易理解的是,jQuery 通過兩個私有變量映射了 window 環境下的 jQuery 和 $ 兩個對象,以防止變量被強行覆蓋。一旦 noConflict 方法被調用,則通過 _jQuery, _$, jQuery, $ 四者之間的差異,來決定控制權的移交方式,具體的代碼如下:

noConflict: function( deep ) {
 if ( window.$ === jQuery ) {
 window.$ = _$;
 }
 if ( deep && window.jQuery === jQuery ) {
 window.jQuery = _jQuery;
 }
 return jQuery;
}

再來看上面所說的參數設定問題,如果 deep 沒有設置,_$ 覆蓋 window.$,此時 jQuery 別名 $ 失效,但 jQuery 本身完好無損。如果有其他類庫或代碼重新定義了 $ 變量,它的控制權就完全交接出去了。反之如果 deep 設置為 true 的話,_jQuery 覆蓋 window.jQuery,此時 $ 和 jQuery 都將失效。
這種操作的好處是,不管是框架混用還是 jQuery 多版本共存這種高度沖突的執行環境,由於 noConflict 方法提供的移交機制,以及本身返回未被覆蓋的 jQuery 對象,完全能夠通過變量映射的方式解決沖突。

四、jQuery.noConflict實例
 
1、將 $ 引用的對象映射回原始的對象:

jQuery.noConflict();
jQuery("div p").hide(); // 使用 jQuery
$("content").style.display = "none"; // 使用其他庫的 $() 

2、恢復使用別名 $,然後創建並執行一個函數,在這個函數的作用域中仍然將 $ 作為 jQuery 的別名來使用。在這個函數中,原來的 $ 對象是無效的。這個函數對於大多數不依賴於其他庫的插件都十分有效:

jQuery.noConflict();
(function($) { 
 $(function() {
  // 使用 $ 作為 jQuery 別名的代碼
 });
})(jQuery);
... // 其他用 $ 作為別名的庫的代碼

3、可以將 jQuery.noConflict() 與簡寫的 ready 結合,使代碼更緊湊:

jQuery.noConflict()(function(){
  // 使用 jQuery 的代碼
});
... // 其他庫使用 $ 做別名的代碼

4、創建一個新的別名用以在接下來的庫中使用 jQuery 對象:

var j = jQuery.noConflict();
j("div p").hide();  // 基於 jQuery 的代碼
$("content").style.display = "none";// 基於其他庫的 $() 代碼

5、完全將 jQuery 移到一個新的命名空間:

var dom = {};
dom.query = jQuery.noConflict(true);
//結果:
dom.query("div p").hide();  // 新 jQuery 的代碼
$("content").style.display = "none";  // 另一個庫 $() 的代碼
jQuery("div > p").hide();  // 另一個版本 jQuery 的代碼

希望本文所述對大家的jQuery程序設計有所幫助。

XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved