我正在開發一個ASP.NET服務器控件,它使用jQuery作爲一些客戶端邏輯。我已經將jQuery文件作爲資源嵌入到控件中。與ASP.NET服務器控件的jQuery版本衝突解決方案
我不想限制使用控件的應用程序到那個特定版本的jQuery,我想繼續使用我嵌入的jQuery版本。
我知道noconflict方法,但我看到的問題是,我無法控制頁面上腳本標記的順序。
如果用戶的jQuery版本包含在我之前,那麼在我調用noconflict之前我最終會覆蓋它。
請幫忙
我正在開發一個ASP.NET服務器控件,它使用jQuery作爲一些客戶端邏輯。我已經將jQuery文件作爲資源嵌入到控件中。與ASP.NET服務器控件的jQuery版本衝突解決方案
我不想限制使用控件的應用程序到那個特定版本的jQuery,我想繼續使用我嵌入的jQuery版本。
我知道noconflict方法,但我看到的問題是,我無法控制頁面上腳本標記的順序。
如果用戶的jQuery版本包含在我之前,那麼在我調用noconflict之前我最終會覆蓋它。
請幫忙
你可以用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>
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>
無論哪種方式,都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實例中使用插件,你最好的辦法是將它們包含在的你的自定義文件中。因此,該文件的內容變成:
var jq151 = jQuery.noConflict(true);
下面是一個很好的解決方案:不要使用jQuery。至少 - 不是一開始。使用javascript等待所有腳本已經加載,存儲「$」的值,然後通過腳本標記注入jQuery,並恢復以前的「$」值。
這是不僅僅是'$',它也是'jQuery'。幸運的是,jQuery本身可以完成你的建議(在分配新值之前存儲舊值)。 – 2011-03-16 06:08:16
我不認爲它恢復了之前可能已經是「$」的價值,因爲OP似乎希望 – mattsven 2011-03-16 06:02:09
@ motionman95:這完全是*它做了什麼,請參閱鏈接的文檔以獲取詳細信息。 – 2011-03-16 06:03:28
@Crowder啊我明白了。 – mattsven 2011-03-16 06:05:55