2011-03-16 85 views
0

我正在開發一個ASP.NET服務器控件,它使用jQuery作爲一些客戶端邏輯。我已經將jQuery文件作爲資源嵌入到控件中。與ASP.NET服務器控件的jQuery版本衝突解決方案

我不想限制使用控件的應用程序到那個特定版本的jQuery,我想繼續使用我嵌入的jQuery版本。

我知道noconflict方法,但我看到的問題是,我無法控制頁面上腳本標記的順序。

如果用戶的jQuery版本包含在我之前,那麼在我調用noconflict之前我最終會覆蓋它。

請幫忙

回答

5

你可以用noConflict(true)做到這一點:

var myJQuery = jQuery.noConflict(true); 

true參數告訴jQuery來釋放jQuery符號除了$符號。只需將它添加到您嵌入控件中的jQuery.js文件的末尾即可。

jQuery腳本對於衝突很聰明。它所做的第一件事就是抓住$jQuery的當前值,並將它們鬆開,以便稍後恢復它們。因此,如果您的腳本首先被加載,$jQuery都不會被定義,並且新的可以擁有它們。如果腳本第二次加載,則恢復以前的$jQuery

讓我們假設你正在使用最新版本(V1.5.1),但頁面筆者使用的是較舊的1.4.4。實際上,由套結對1.5.1文件的末尾var jq151 = jQuery.noConflict(true);,你這樣做是:

<script src='jquery-1.5.1.min.js'></script> 
<script>var jq151 = jQuery.noConflict(true);</script> 

...除了它會全部在一個腳本標籤。所以兩種可能性:

1)他們先走:

<script src='jquery-1.4.4.min.js'></script> 
<script src='jquery-1.5.1.min.js'></script> 
<script>var jq151 = jQuery.noConflict(true);</script> 

Live example

2)你先走:

<script src='jquery-1.5.1.min.js'></script> 
<script>var jq151 = jQuery.noConflict(true);</script> 
<script src='jquery-1.4.4.min.js'></script> 

Live example

無論哪種方式,都jQuery$結束了點球ng 1.4.4版本,jq151最終指向1.5.1版本。


也許有點偏離主題,但對於任何人認爲這有點神奇,它實際上很容易。 :-)下面是一個腳本,將重新定義foo,但恢復以前的定義,如果你問它:

// The script 
(function() { 
    var globalObject = this, // Or just use `window` on browsers 
     oldfoo, 
     ourfoo; 

    oldfoo = globalObject.foo; 
    ourfoo = globalObject.foo = { 
     version: "new", 
     restorePrevious: restorePrevious 
    }; 

    function restorePrevious() { 
     globalObject.foo = oldfoo; 
     return ourfoo; 
    } 
})(); 

Example with foo defined before the above

Example with foo defined after the above(如果你想知道爲什麼這個作品儘管var foo後被腳本,here's some reading對窮人讀了,誤解var


關於插件:您問以下關於插件。插件註冊自己被分配的功能,性能上jQuery.fn和(在某些情況下)jQuery,像這樣:

jQuery.fn.makeFoo = function() { 
}; 

通過上述,您可以在jQuery的情況下訪問makeFoo功能(例如,$('foo').makeFoo();)。一個寫得很好插件將確保它通過採用這種結構既noConflict()noConflict(true)起到很好:

(function($) { 
    $.fn.makeFoo = function() { 
     $(this).addClass("foo"); 
    }; 
})(jQuery); 

...還是一個喜歡它。 (通過以上,我們最好從未使用jQuery指函數體內jQuery的。如果我們想,我們可以在頂部加入var jQuery = $;。)

定義一個匿名函數,並立即調用它,傳入jQuery的當前全局值。它接收到作爲$變元,並且因此在該函數內符號$總是是它自己傳入的jQuery實例。它可以自由使用$,因爲它知道它引用了它所註冊的jQuery版本。

只有寫得很好的插件可能會假設jQuery將始終是相同的(例如,只能與noConflict()很好地播放,而不能與noConflict(true)播放)。不過,您可以修復這些問題。如果碰上一個,使得它的一個副本,並把

(function($) { 
    var jQuery = $; 
頂部

...和

})(jQuery); 

...在底部。 99%的時間,這將使它的行爲。

如果你想在你的嵌入式jQuery實例中使用插件,你最好的辦法是將它們包含在你的自定義文件中。因此,該文件的內容變成:

  • jQuery的腳本
  • (插件腳本)
  • (插件腳本)
  • ...
  • var jq151 = jQuery.noConflict(true);
+0

我不認爲它恢復了之前可能已經是「$」的價值,因爲OP似乎希望 – mattsven 2011-03-16 06:02:09

+0

@ motionman95:這完全是*它做了什麼,請參閱鏈接的文檔以獲取詳細信息。 – 2011-03-16 06:03:28

+0

@Crowder啊我明白了。 – mattsven 2011-03-16 06:05:55

0

下面是一個很好的解決方案:不要使用jQuery。至少 - 不是一開始。使用javascript等待所有腳本已經加載,存儲「$」的值,然後通過腳本標記注入jQuery,並恢復以前的「$」值。

+0

這是不僅僅是'$',它也是'jQuery'。幸運的是,jQuery本身可以完成你的建議(在分配新值之前存儲舊值)。 – 2011-03-16 06:08:16