讓我給我一些問題的背景。我有一個JavaScript小部件。該小部件包含來自我的網站的jQuery副本。此小部件放置在第三方網站上。小部件解析JSON供稿並將內容注入DOM。很簡單的東西。我可以重置jQuery全局對象的名稱嗎?
如果第三方頁面已經引用了jQuery並依賴於jQuery插件,則可能會出現衝突。尤其是當第三方網站引用不同版本的jQuery時。 $ .noConflict()很有用,但是插件的存在使得它不可靠。從$.noConflict() documentation:
如果有必要,我們可以通過一個參數傳遞true作爲 的方法騰出 jQuery的名稱爲好。這是 很少需要,如果我們必須做 本(例如,如果我們需要使用jQuery的 庫 多個版本在同一頁面上),我們需要 考慮到大多數插件依靠 的jQuery變量 的存在,並且在此 的情況下可能無法正確運行。
爲了解決這個問題,我的想法是重置jQuery全局對象的名稱。在jQuery的源的底部,有這些行:
// Expose jQuery to the global object
window.jQuery = window.$ = jQuery;
我可以重構行:
// Expose jQuery to the global object
window.myjQuery = jQuery;
我已經刪除了速記$變量,我已經改變了jQuery myjQuery。現在我的代碼看起來像這樣:
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>myjQuery</title>
<script type="text/javascript" src="myjquery-1.4.js" />
<script type="text/javascript">
// .ready() can alias the jQuery object
// I can pass $ and write code as normal
myjQuery(document).ready(function($) {
$('p').css('color', 'red');
});
// Fails
jQuery(document).ready(function($) {
$('p').css('color', 'blue');
})
// Fails
$(document).ready(function() {
$('p').css('color', 'green');
})
</script>
</head>
<body>
<p>myjQuery changed my color to red.</p>
</body>
</html>
這是個好主意嗎?我不知道圖書館的內部可以肯定地說。我知道這個庫基本上是一個閉包,所以我猜這種方法是可以的。思考?
編輯:我接受了Doug的回答,因爲他提供的代碼幾乎與$ .noConflict()文檔頁面上的示例相同。我沒有注意到它。這裏是例子:
// Completely move jQuery to a new namespace in another object.
var dom = {};
dom.query = jQuery.noConflict(true);
// Do something with the new jQuery
dom.query("div p").hide();
// Do something with another library's $()
$("content").style.display = 'none';
// Do something with another version of jQuery
jQuery("div > p").hide();
發表了一篇文章,說如果他們需要的話就可以了;像這個解決方案更好。 – Matchu 2010-02-06 01:45:12
Doug,感謝您的解釋和例子! – simeonwillbanks 2010-02-06 02:21:53
@simeonwillbanks樂意幫忙!我只注意到一件事。您的腳本標記使用了空標記語法:'',如果我沒有記錯,那麼會在某些瀏覽器中導致問題。只需使用:''代替。祝你好運與你的部件! – 2010-02-06 02:27:50