2010-07-03 91 views
2

我在一些CMS擴展中使用jQuery和一些非常常見的jQuery插件(包括jQueryUI和jQueryTools以及許多其他擴展),這些擴展在許多情況下被許多人使用。我總是會遇到問題,即我的擴展程序的插件與另一個擴展程序在同一CMS頁面上添加的插件之間存在衝突。有時候另一個擴展會加載jQuery插件的早期版本,並且會殺死我的實例。避免在jQuery和jQuery擴展中發生衝突!

我想「重命名」或「換行」(插入具有唯一名稱的單個插件)所有我的擴展使用的插件,因此即使存在其他實例,我的實例也不會受到任何影響同一頁面上的相同插件。

將所有插件包裝到一個插件中將是理想的解決方案,如果可能的話 - 而不是重命名。

任何建議,這甚至可能嗎?

非常感謝, 諾曼。

+0

實際上你應該只使用一個jQuery實例,大多數插件都應該使用.. jQuery 1.3.2。如果您使用其他插件(如mootools),則可以在兼容模式下運行jQuery - 請參閱http://docs.jquery.com/Using_jQuery_with_Other_Libraries – Marko 2010-07-04 00:06:27

回答

3

您可以在匿名函數包裝插件和使用jQuery的特定版本調用它們。

例子:

<script src="jquery-1.3.js"></script> 
<script> 
    $jq13 = jQuery.noConflict(true); 
</script> 

<script src="jquery-1.4.js"></script> 
<script> 
    $jq14 = jQuery.noConflict(true); 
</script> 

<script> 
    (function($){ 
    // All references to $ in this block will refer to $jq14 
    // Put plugins inline here 
    })($jq14); 
</script> 

寫得很好的插件,就已經被寫成這樣,所以你可以改變的最後一行來設置它應該使用jQuery對象。

或者您可以在調用每個插件之前更改window.jquery。像這樣:

<script src="jquery-1.3.js"></script> 
<script> 
    $jq13 = jQuery.noConflict(true); 
</script> 

<script src="jquery-1.4.js"></script> 
<script> 
    $jq14 = jQuery.noConflict(true); 
</script> 

<script> 
    window.jQuery = $jq14; 
</script> 
<script src="some_plugin.js"></script> 

<script> 
    window.jQuery = $jq13; 
</script> 
<script src="some_other_plugin.js"></script> 

稍不雅觀,但它應該工作。

0

也許在這裏你可以找到答案?

Two jQuery versions on the same page

+0

是的......它並不是真的只關於jQuery庫的衝突...如何如果所有插件都可以封裝在一個獨特的父插件中,然後可以通過在實際插件之前添加父插件的名稱來調用它們,那麼插件...將會很棒。 ......或者即使可以將插件分配給唯一變量以避免衝突。 – Norman 2010-07-04 00:31:07