noConflict主要用于避免jQuery和$與其他庫沖突。
1. 先來看一下他的用法
主要有兩種情況,一種是先引入了jQuery庫,另一種是後引入jQuery庫,無論哪種情況,隻要調用了$.noConflict()方法,均可以很好的處理全局變量名沖突的情況,其原理是将jQuery對象指派給别的變量,進而讓出$和jQuery這兩個變量名。
1.先引入jQuery,即$和jQuery有可能在後面被修改,這時你可以發揮紳士風度,有預見性的主動将這兩個變量名讓出,如下所示:
var iQuery = $.noConflict();
console.log(iQuery("div").html()); //正确輸出
$ = 123; //不會影響jQuery的使用,因為現在我們用的是 “iQuery”
2.在jQuery被引入之前已經有别的庫占用了$或jQuery,這種情況下jQuery的引入便覆寫了了這兩個變量,為了讓先前的庫仍可以使用$或jQuery變量,你指令jQuery讓出這兩個變量,即調用$.noConflict()方法。此時jQuery做了兩件事,一是将jQuery對象指派給新的變量,二是将$或jQuery變量重新指派為之前被覆寫的庫。該情況如下:
<script src="lib1.js"></script>
<script src="./jquery2.0.3.js"></script>
<script>
var iQuery = $.noConflict();
</script>
2. 我們來看一下jQuery中的實作,代碼非常簡單
// Map over jQuery in case of overwrite
_jQuery = window.jQuery,
// Map over the $ in case of overwrite
_$ = window.$,
這段代碼是在jQuery剛開始的地方,主要應對第二種情況,即$或jQuery已經被占用的情況,jQuery将他們緩存,如果使用者決定使用noConflict()方法讓出這兩個變量,則将緩存的内容還原到全局變量中。
noConflict: function( deep ) {
if ( window.$ === jQuery ) {
window.$ = _$;
}
if ( deep && window.jQuery === jQuery ) {
window.jQuery = _jQuery;
}
return jQuery;
},
可以看到如果調用noConflict方法是使用true參數,則将jQuery變量也讓出,否則隻讓出$。不管怎樣最會會将jQuery對象傳回。