本篇文章主要是對JQuery的$和其它JS發生沖突的快速解決方法進行了介紹,需要的朋友可以過來參考下,希望對大家有所幫助
眾所周知,jQuery是目前最流行的JS封裝包,簡化了很多復雜的JS程序,JQuery將瀏覽器DOM樹定義為$,通過$來獲取各個子節點。
然后,JS插件并非只有JQuery,還有prototype.js 等其它比較好的插件。它們也使用$。所以有時候同時使用這個兩個JS插件的時候,就會出現$的使用權沖突問題。現在我們來看看如何解決這個沖突問題。請看下文:
我們都知道JQuery有一個函數,jquery.noConflict() 它的作用是講$的控制權轉讓出去。然后我們可以通過jQuery代替$來獲取dom節點。
第一種情況:先加載Prototype.js,再加載jQuery.js
jQuery noConflict() 方法會釋放會 $ 標識符的控制,這樣其他腳本就可以使用它了。
使用jQuery.noConflict();主要作用是在任何時候,只要在jQuery加載后就可以調用,將$符號的使用權返回給其它的js庫,jQuery在創建它自己的名字空間時就將其它庫的$保存在自己的一個變量當中。
第二種情況:先加載jQuery.js,再加載Prototype.js
按照這樣的順序加載,就不存在其它js庫的$符號被jQuery占用的問題。
舉例:
</br>
方法一:
通過全名替代簡寫的方式來使用 jQuery
< script type = "text/javascript" >
jQuery.noConflict(); //將變量$的控制權讓渡給prototype.js
jQuery(function() { //使用jQuery
jQuery("p").click(function() {
alert(jQuery(this).text());
});
});
$("pp").style.display = 'none'; //使用prototype
< /script>/
</br>
方法二:
可以創建自己的簡寫,通過noConflict()函數來定義一個快捷方式用來獲取dom節點
< script type = "text/javascript" >
var $j = jQuery.noConflict(); //自定義一個比較短快捷方式
$j(function() { //使用jQuery
$j("p").click(function() {
alert($j(this).text());
});
});
$("pp").style.display = 'none'; //使用prototype
< /script>/
缺點:引入了這段代碼后,不僅是當前的js文件,該html引用的所有js中,如果有用到jquery中的$,都得用$j來代替之前的$
</br>
方法三:
如果你的 jQuery 代碼塊使用 $ 簡寫,并且您不愿意改變這個快捷方式,那么您可以把 $ 符號作為變量傳遞給 ready 方法。這樣就可以在函數內使用 $ 符號了 - 而在函數外,依舊不得不使用 "jQuery":
< script type = "text/javascript" >
jQuery.noConflict(); //將變量$的控制權讓渡給prototype.js
//方法3-1
jQuery(document).ready(function($) {
$("p").click(function() { //繼續使用 $ 方法
alert($(this).text());
});
});
//方法3-2
jQuery(function($) { //使用jQuery
$("p").click(function() { //繼續使用 $ 方法
alert($(this).text());
});
});
$("pp").style.display = 'none'; //使用prototype
< /script>
方法3-1?缺點:只對ready嵌套內的代碼有效,對嵌套外的代碼是無效的。如果你所有的邏輯,都在寫ready函數中,那沒問題。但我們一般都會在ready函數之外寫一些子函數,然后ready函數再去調用這些函數。這個方案對這些函數是無效的,因此這套方案有局限性。
</br>
方法四:
使用語句塊
< script type = "text/javascript" >
jQuery.noConflict(); //將變量$的控制權讓渡給prototype.js
(function($) { //定義匿名函數并設置形參為$
$(function() { //匿名函數內部的$均為jQuery
$("p").click(function() { //繼續使用 $ 方法
alert($(this).text());
});
});
})(jQuery); //執行匿名函數且傳遞實參jQuery
$("pp").style.display = 'none'; //使用prototype
< /script>
這種使用語句塊的方法非常有用,在我們自己寫jquery插件時,應該都使用這種寫法,因為我們不知道具體工作過程中是如何順序引入各種js庫的,而這種語句塊的寫法卻能屏蔽沖突。
</br>
推薦方法三(3-2),方法四,特別是開發js插件時:
這兩個方法,沒有上面兩個方法的缺點,只會影響到被包在jQuery(function($){}中的代碼。 不會影響到其他js代碼,這一點很重要。試想一下,假如你寫了一個js公共組件,該組件需要用到jquery,為了提高魯棒性,需考慮$符號沖突問題。如果使用方案二,那么別人在使用時,還得遵守你的約定,把自己js代碼中的$改成$j,而如果使用方案三(3-2),方案四,既能避免$沖突對該組件的影響,又無需要求使用公共組件的人修改自己的代碼。
</br>
注意:
1.引用javascript類庫時,把jQuery引用放在最后面,可以避免沖突。
2.特別要注意jQuery()代替$()時,jQuery是區分大小寫的,因為javascript本身就是區分大小寫的。
整理來源:http://www.jb51.net/article/46152.htm
????? http://www.jb51.net/article/90293.htm
??????http://www.jb51.net/article/47028.htm