jQuery版本衝突問題解決與分析

jQuery版本衝突問題解決與分析

最近在寫項目的時候,在網上搜索了一個時間選擇器的插件,想要添加到原先的項目中,但是在調試的過程中,卻出現時間選擇器若是能使用,則我的其他比如導航欄的特效就不能使用,若導航欄能夠使用,則時間選擇器就無法使用了,兩者出現了衝突。

出現這樣的問題,思路

由於是特效即腳本實現的,所以判斷是腳本的問題,所以,直接註釋掉原先中腳本文件代碼,很塊就發現是兩個jQuery文件的引用出現了衝突,下面列出來
    <script src="..//bootstrap-3.3.5-dist/bower_components/jquery/dist/jquery.min.js"></script>
該jQuery用來實現導航欄的特效。
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
該jQuery用來實現時間選擇器特效。

然後,請教度娘,發現網上一大片說,jQuery版本衝突的問題,說用noConflict()方法來解決。。然後就沒有然後,沒一個說的清的,完全不知道該怎麼搞。
還是乖乖去W3school上看一下jQuery的介紹,發現$是jQuery的縮寫(jQuery uses the $ sign as a shortcut for jQuery.
看了幾個實例,再看下w3school上對於noConflict()的方法解釋,都是些啥啊。還是沒有看懂。


直接進入測試吧,大家在細細體會,大家多使用該方式來測試代碼!

測試一:

試驗有兩個jQuery文件,這兩個文件都能使用$.("p").hide();   和$.("p").show()
<html>
<head>
<script type="text/javascript" src="/jquery/jquery.js"></script>
<script src="/jquery/jquery-1.11.1.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){
$("#button1).click(function(){
$("p").hide);
});
});
</script>
<script type="text/javascript">
$(document).ready(function(){
$("#button2).click(function(){
$("p").show);
});
});
</script>
</head>
<body>
<h2>This is a heading</h2>
<p>This is a paragraph.</p>
<p>This is another paragraph.</p>
<button type="button" id='button1'>Click me1</button><br>
<button type"button" id="button2"> click me2 </button>
</body>
</html> 

先猜測結果,從代碼可以看出,版本問題依舊會存在的,其實該代碼存在的問題就是我們項目中存在的問題,瀏覽器無法區分$ 表示的是那種jQuery。(代碼中有兩個jQuery文件)

上面測試結果,點擊click me1 ,上面文字消失,點擊click me2 ,文字並沒有像代碼寫的一樣出現。

現在我們將代碼進行修改進行第二個測試。

測試二:

我們將第一個JS塊中的$使用noConflict()方法。
<script type="text/javascript">
var jq1=$.noConflict();
jq1(document).ready(function(){
jq1("#button1").click(function(){
jq1("p").hide();
});
});
</script>
在這裏我們使用jq1作爲新的jQuery簡稱,進行一個區分,讓第一個button1使用第一個jQuery。

結果是,點擊click me1 ,上面文字消失,點擊click me2 ,文字出現。(正確結果)
但是,這裏要考慮一個文件順序問題,在第一個<script>腳本1</script>代碼是使用的第一個jQuery文件,這個沒什麼爭議;但是第二個<script>腳本2</script>塊,使用的是第一個還是二個jQuery文件。
所以測試三,直接將第二個jQuery文件刪除。

測試三:

將第二個jQuery文件刪除,再運行
<del><script src="/jquery/jquery-1.11.1.min.js"></script></del>

測試結果,點擊點擊click me1 ,上面文字消失,點擊click me2 ,文字沒有出現,
則通過測試二/三,可以說明在第一個<script>腳本1</script>代碼是使用的第一個jQuery文件,第二個<script>腳本2</script>代碼塊使用第二個jQuery文件。

到這裏,其實問題解決了,但是還要測試一些東西。

測試四:

將兩個<script>腳本1 2</script>塊合併,猜想,這樣的話是不是將只會使用唯一的Jquery文件。
測試結果:點擊click me1 ,上面文字消失,點擊click me2 ,文字出現(正確結果)

對比測試五

將第二個jQuery文件刪除
測試結果,點擊click me1 ,上面文字消失,點擊click me2 ,文字沒有出現。

則通過測試四/五,說明jQuery文件的選擇並不和JS代碼塊的分合有關係,關係只是順序關係。

最後兩個測試(由三個JS腳本來測試)

先由$來引用jQuery,再由noConflict()來定義另一個引用,
之後的jQuery可以隨意使用各個引用,來調用不同的版本的文件內容。
<html>
<head>
<script src="/jquery/jquery-1.11.1.min.js"></script>
<script type="text/javascript" src="/jquery/jquery.js"></script>
<script type="text/javascript">
$(document).ready(function(){
$("#button1").click(function(){
$("p").hide();
});
});
var jq1=$.noConflict();
jq1(document).ready(function(){
jq1("#button2").click(function(){
jq1("p").show();
});
});
$(document).ready(function(){
$("#button3").click(function(){
$("p").hide();
});
});
</script>
</head>
<body>
<h2>This is a heading</h2>
<p>This is a paragraph.</p>
<p>This is another paragraph.</p>
<button type="button" id='button1'>Click me1</button><br>
<button type"button" id="button2"> click me2 </button><br>
<button type"button" id="button3"> click me3 </button>
</body>
</html> 
在上述代碼中,
jq1 爲第二個jQuery的簡稱,再使用時,將所有的$換成jq1就OK了
$     爲第一個jQuery的簡稱,哪裏需要用第一個jQuery就使用 $ 

<html>
<head>

<script src="/jquery/jquery-1.11.1.min.js"></script>
<script type="text/javascript" src="/jquery/jquery.js"></script>
<script type="text/javascript">
var jq1=$.noConflict();
jq1(document).ready(function(){
jq1("#button1").click(function(){
jq1("p").hide();
});
});
$(document).ready(function(){
$("#button2").click(function(){
$("p").show();
});
});
jq1(document).ready(function(){
jq1("#button3").click(function(){
jq1("p").hide();
});
});
</script>
</head>
在上述代碼中,
$     爲第二個jQuery的簡稱,哪裏需要用第二個jQuery就使用 $ 
jq1 爲第一個jQuery的簡稱,再使用時,將所有的$換成jq1就OK了

總結:

(一般需要給新增的jQuery,創建一個新的變量來代替 $ ,這樣原先的代碼都不需要修改 )
在存有多種jQuery版本的頁面中,如果要正確使用各個版本,就使用var gjq=$.noConflict();爲各個版本創建新定義個jQuery引用變量,其實就是創建新的 $ 的代號(簡稱shortcut)。
在此代碼之後,使用原先的jQuery文件的時候,就使用 $ ,(因爲在這之前,原先的 $ 存在的環境爲正常唯一jQuery環境,而noConflict方法改變是新的jQuery的簡稱,所以原先的腳本使用 $ 就可以調用)。
請注意,將新添加的jQuery順序與定義 $ 簡稱的順序保持一致!!!!(否則,系統認爲的 $ 簡稱與jQuery版本的對應關係與編碼者不一致,這簡直太糟糕了!!!)










發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章