2010-05-14 95 views
11

注意:我知道類似的問題已被要求herehere,但我正在尋找關於如何完成這項工作或完全避免它的很好理由的額外說明。是否可以在同一頁面上使用2個jQuery版本?

我在已經使用舊版本jQuery庫(1.1.3.1)的現有網站中添加了功能。我一直在針對最新版本的jQuery庫(1.4.2)編寫我的附加功能。我只使用新版本的jQuery測試了該網站,並且它破壞了功能,所以現在我正在考慮在同一頁上使用這兩個版本。這怎麼可能?

我需要在我的代碼中做什麼來指定我使用的是一個版本的jQuery而不是另一個?例如,我會在頁面的標題中放入兩個版本的jQuery的<script>標籤,但是我需要做些什麼以確保在調用代碼中知道我調用了某個版本的庫或另一個版本?

也許是這樣的:

//Put some code here to specify a variable that will be using the newer 
//version of jquery: 
var $NEW = jQuery.theNewestVersion(); 

//Now when I use $NEW, I'll know it's the newest version and won't 
//conflict with the older version. 
$NEW('#personName').text('Ben'); 

//And when I use the original $ in code, or simply 'jquery', I'll know 
//it's the older version. 
$('#personName').doSomethingWithTheOlderVersion(); 

UPDATE:讀一些答案後,我開始懷疑,如果它甚至是一個好主意,試圖在所有玩這個遊戲...

回答

7

可能?是的,以同樣的方式可以運行jQuery和另一個同時使用名稱$的框架。包含jQuery的一個副本,並使用noConflict將其分配給一個新名稱,然後對另一個副本執行相同操作。

一個好主意?真的是沒有,就像在同一時間運行jQuery和另一個框架不是一個好主意,只有更多。 jQuery是一個影響深遠的入侵式框架。如果jQuery的兩個實例開始突變相同的元素(以及1.4之前的jQuery版本對它們所觸及的元素是非常混雜的),那麼它們很可能會互相混淆,從而產生不可預測的,時序敏感和不可分離的副作用。

如果可能,更新所有在最新的jQuery下運行的代碼是更好的途徑。這真的不應該是難; jQuery開發人員並沒有破壞過多的代碼應該永遠依賴於擺在首位。

+0

我同意更新現有的代碼是一個更好的主意。然而,至少據我所知,jQuery比許多其他庫沒有侵入性(例如,我沒有在其他庫中看到「noConflict」)。 – 2010-05-14 20:49:02

+0

jQuery向其「接觸到的所有元素」添加了expando屬性, ,這是所有具有附加「數據」的元素(比如事件處理程序),並且在1.4之前它甚至會檢查附加數據的所有元素(它們可以很容易地成爲大部分文檔 - 非常有創意!)。如果另一個框架或版本複製,刪除或更改這些屬性,jQuery將處於不一致的狀態。 – bobince 2010-05-15 10:13:32

+0

我同意你的前提,這可能不是一個好主意。不過,我被卡住了,因爲升級站點以使用1.4.2根本不是一種選擇。哦動態語言的樂趣... – 2010-05-15 15:23:36

24

您可以使用jQuery noConflict方法來實現此目的。

<script type="text/javascript" src="jquery-1.1.3.js"></script> 
<script type="text/javascript" src="jquery-1.4.2.js"></script> 
<script type="text/javascript"> 
    //Here, $ refers to the most recent jquery script loaded, which is version 1.4.2. 
    $.noConflict(); 

    //Here, jQuery refers to 1.4.2 and $ refers to 1.1.3 
    //You can setup an alias like so: 
    var $NEW = jQuery; 

    //Now, you can use old jQuery with $ and new jQuery with $NEW. 
</script> 
+0

感謝您的代碼。假設我在調用'$ .noConflict()'時總是調用我的'

1

由於EndangeredMassa的解決方案的延伸,我提出以下修改:

<script type="text/javascript" src="jquery-1.1.3.js"></script> 
<script type="text/javascript" src="jquery-1.4.2.js"></script> 
<script type="text/javascript"> 
    //Here, $ refers to the most recent jquery script loaded, which is version 1.4.2. 
    $.noConflict(); 

    //Here, jQuery refers to 1.4.2 and $ refers to 1.1.3 
    //You can setup an alias like so: 
    var $NEW = jQuery; 

    // jQuery needs to refer to 1.1.3 again and not to 1.4.2 
    var jQuery = $; 

    //Now, you can use old jQuery with $ and new jQuery with $NEW. 
</script> 
相關問題