1. 程式人生 > >同一頁面jQuery多個版本或和其他js庫衝突方法

同一頁面jQuery多個版本或和其他js庫衝突方法

jQuery多個版本或和其他js庫衝突主要是常用的$符號的問題,這個問題 jquery早早就有給我們預留處理方法了,下面一起來看看解決辦法。

1.同一頁面jQuery多個版本或衝突解決方法

<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" />
    <title>jQuery測試頁-111cn.net</title>
</head>
<body>
    <!-- 引入 jquery 1.8.0 -->
    <script type="text/javascript" src="http://code.jquery.com/jquery-1.8.0.min.js"></script>
    <script type="text/javascript">
        var $180 = $;
    </script>
    <!-- 引入 jquery 1.9.0 -->
    <script type="text/javascript" src="http://code.jquery.com/jquery-1.9.0.min.js"></script>
    <script type="text/javascript">
        var $190 = $;
    </script>
    <!-- 引入 jquery 2.0.0 -->
    <script type="text/javascript" src="http://code.jquery.com/jquery-2.0.0.min.js"></script>
    <script type="text/javascript">
        var $200 = $;
    </script>
    <script type="text/javascript">
        console.log($180.fn.jquery);
        console.log($190.fn.jquery);
        console.log($200.fn.jquery);
    </script>
</body>
</html>
結果如下:

1.8.0

1.9.0

2.0.0

2.同一頁面jQuery和其他js庫衝突解決方法

①.jQuery在其他js庫前

<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" />
    <title>jQuery測試頁-111cn.net</title>
</head>
<body>
    <!-- 引入 jquery 1.8.0 -->
    <script type="text/javascript" src="http://code.jquery.com/jquery-1.8.0.min.js"></script>
    <script type="text/javascript">
        var $180 = $;
        console.log($.fn.jquery);
    </script>
    <!-- 引入 其他庫-->
    <script type="text/javascript">
        $ = {
            fn:{
                jquery:"111cn.net"
            }
        };
    </script>
    <script type="text/javascript">        
        console.log($.fn.jquery);
        console.log($180.fn.jquery);
    </script>
</body>
</html>

結果如下:

1.8.0

mzwu.com

1.8.0

②.jQuery在其他js庫後

<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" />
    <title>jQuery測試頁-111cn.net</title>
</head>
<body>
    <!-- 引入 其他庫-->
    <script type="text/javascript">
        $ = {
            fn:{
                jquery:"111cn.net"
            }
        };
    </script>
    <!-- 引入 jquery 1.8.0 -->
    <script type="text/javascript" src="http://code.jquery.com/jquery-1.8.0.min.js"></script>
    <script type="text/javascript">    
        console.log($.fn.jquery);    
        var $180 = $.noConflict();
        console.log($.fn.jquery);
        console.log($180.fn.jquery);
    </script>
</body>
</html>

結果如下:

1.8.0

mzwu.com

1.8.0

再補充一下方法

方案1: 
引入noConflict(),將$替換為其他符號

var $j = jQuery.noConflict(); 
$j(document).ready(function(){ 
$j("#btn1").click(function(){ 
alert("Text: " + $j("#test").text()); 
}); 
});
缺點:引入了這段程式碼後,不僅是當前的js檔案,該html引用的所有js中,如果有用到jquery中的$,都得用$j來代替之前的$

方案2: 

ready函式是jquery的入口函式,可以 
將$(document).ready(function(){ 
替換成 
jQuery( document ).ready(function( $){} 
缺點:只對ready巢狀內的程式碼有效,對巢狀外的程式碼是無效的。如果你所有的邏輯,都在寫ready函式中,那沒問題。但我們一般都會在ready函式之外寫一些子函式,然後ready函式再去呼叫這些函式。這個方案對這些函式是無效的,因此這套方案有侷限性。

方案3(推薦,特別是開發js外掛時):

給js內容包上一個函式

jQuery(function($){ 
//你的js程式碼放在這裡(例如第二個方案提到的ready函式和子函式) 
//如果是js檔案,其實就是在檔案頭部和尾部各加一行程式碼 
}
或者
(function($) { 
//你的js程式碼 
})(jQuery);

這個方法,沒有上面兩個方案的缺點,只會影響到被包在jQuery(function($){}中的程式碼。 不會影響到其他js程式碼,這一點很重要。試想一下,假如你寫了一

個js公共元件,該元件需要用到jquery,為了提高魯棒性,需考慮$符號衝突問題。如果使用方案1,那麼別人在使用時,還得遵守你的約定,把自己js程式碼

中的$改成$,而如果使用方案3,既能避免$衝突對該元件的影響,又無需要求使用公共元件的人修改自己的程式碼。