2011-04-21 38 views
12

我遇到了一個問題,使用jquery公開插件以及Masked Input插件。 問題是它們都佔用了導致衝突的函數$.mask。但我重要需要這兩個插件一起工作。我會在其中一箇中重命名爲$.mask ......比如說,$.msk,但在這種情況下,我總是需要記住它,如果我想升級到新版本,我將重新命名。Jquery插件佔用相同的函數名稱 - >衝突

尋找更好的解決方案,以便如何應對jQuery插件之間的這種衝突。

+1

你可以問插件作者重新命名的功能?這會對你,他們和社區有所幫助。 – SlavaGu 2011-04-29 01:25:42

+0

我會盡力去做。當我閱讀關於創建jQuery插件的教程時,有人說開發者應該儘量避免使用名稱來命名插件,這可能會被其他插件開發人員採用。 HTTP://docs.jquery。com /插件/創作#命名空間 – Nemoden 2011-04-29 01:50:52

+0

@SlavaGu我沒有迴應 – Nemoden 2011-05-09 12:34:08

回答

3

我想我同意畝的答案。另外一個可能是使用jQuery.sub()

由於大多數插件在構建過程中都使用jQuery全局,所以在加載其中一個插件之前,您應該能夠別名jQuery。然後,你可以重新別名,無論你選擇什麼。

<script src="http://cdn.jquerytools.org/1.2.5/full/jquery.tools.min.js?foo"></script> 
<script type="text/javascript"> 
var jQuery = $.sub(); 
</script> 
<script src="jquery.maskedinput.js" type="text/javascript"></script> 
<script type="text/javascript"> 
var $$$ = jQuery; 
jQuery = $; 
</script> 

唯一可能的優勢,這種方法是,它可能會從改變另一個插件可能做出jQuery方法隔離一個插件。這有點複雜,但是我可以想到的是改變插件的唯一選擇。

+3

當您升級到jQuery v1.8時,需要記住的一件事是'jQuery.sub'在jQuery v1.7中已被棄用,並且在v1.8中不會提供。 – 2012-10-24 12:08:39

13

我認爲你可以在需要記住某些事情的解決方案之間作出選擇,問題是你想記住多少次。

如果您重命名其中一個,那麼您必須記得修補任何升級。我認爲這不是什麼大不了的事情,它總是在軟件開發中發生。

另一種方法是拉入其中一個插件,然後立即加載一個名稱空間修補程序,例如,jQuery.fn.masked_input = jQuery.fn.mask;,然後可以在此之後加載公開插件。只要重命名的插件沒有在任何地方引用自己的名稱,這種方法就可以工作。而且,您必須記住插件的特定加載順序。這種事情也一直在軟件開發中出現。

+0

謝謝你的迴應。對不起,我不能接受你的回答,但至少應該得到滿意答覆。我擔心你是對的 - 我無論如何都不得不回想起下次我想更新它時接觸這個插件的一些想法。 – Nemoden 2011-04-26 07:48:09

-1

好的。我現在正在回答我的問題。

我考慮過畝太短的方法,但它不太合適。我的同事提供了以下內容:

我們創建的jQuery的新實例,像這樣:

var $$$ = $.extend(true, function(selector, context) { 
    return new $$$.fn.init(selector, context); 
}, $); 
$$$.fn = $$$.prototype = jQuery.prototype; 

,我們在上面創建的插件$功能關閉(因爲$使用插件內):

(function($) { 
... plugin code goes here ... 
$.fn.extend({ 
     myplugin: function(maybe_some_options) { 
... 
})($$$); 

現在我們可以同時撥打$$$(<selector>).myplugin({ do : 'great job', and : 'be happy' });$(<selector>).myplugin()

到目前爲止,我們對這種方法沒有任何問題,而且我也沒有看到它會破裂的原因,所以我們決定採取這個決定。

+7

這會工作,但現在你的客戶在內存中有兩個jQuery副本,你必須記住(所有的時間)哪個版本的jQuery用於哪個插件。您正在讓客戶在內存中付款,而不是按照簡單的升級程序和測試。 – 2011-04-26 16:16:25

+1

最好不要覆蓋init()方法,而是使用sub()會更好。 – TonyQ 2012-04-14 18:02:36