2010-12-14 53 views
4

我正在致力於一個網站全球化項目,該項目涉及(我們的供應商)要求我們的客戶在其家庭/原始網站上插入腳本標籤。腳本標記是幫助我們的客戶走向全球所必需的,部分解決方案體現了基於特定最終用戶標準觸發的用戶界面。管理綁定jQuery的第三方JavaScript庫

UI是通過jQuery的幫助構建的,我們真的不能指望我們的客戶在他們的頁面上插入,更不用說版本不匹配將很難解決。因此,我們的第三方庫下載它自己的jQuery版本,儘管命名空間不同以避免任何衝突。然而,這種機制要求我們重新命名所有jQuery實例,以幫助我們避免與另一個jQuery實例(如果存在)發生名稱衝突,並使得我們的jQuery(下面示例中的MY_Query)變得非常困難管理,更不用說升級了。

例如

jQuery = window.jQuery = window.$ = function(selector, context) { 
    // The jQuery object is actually just the init constructor 'enhanced' 
    return new jQuery.fn.init(selector, context); 
}, 
. 
. 
. 
jQuery.fn = jQuery.prototype = ... 

成爲

MY_JQuery = window.MY_JQuery = window.MY_Q = function(selector, context) { 
    // The MY_JQuery object is actually just the init constructor 'enhanced' 
    return new MY_JQuery.fn.init(selector, context); 
}, 
. 
. 
. 
MP_JQuery.fn = MP_JQuery.prototype = ... 

在一個理想的世界裏,我們和客戶端將有jQuery的單一版本的網站上,我們都將用它來我們的優點。但是,這意味着jQuery的升級需要雙方進行大量測試(而包含嚴重的jQuery版本),並且任何插件都需要客戶端向其站點添加適當的腳本標籤,這引發了雙方之間的政治爭論在什麼版本贏。

那麼,我可以在客戶端網站上管理我們的jQuery版本(帶插件),而不必用上面提到的約束來重新命名像MY_Query之類的所有jQuery實例?

+1

爲什麼不鏈接到谷歌代碼的jQuery庫,你都將具有相同的版本,永不需要對它們進行升級,只是一個想法。 – brett 2010-12-14 15:11:14

+0

很難說服客戶這麼做。另外,客戶端可能有合法的理由拒絕這個提議 – 2010-12-14 16:52:02

回答

4

爲什麼不檢查他們是否已經包含在頁面上的jQuery,如果沒有動態加載呢?如果你知道的基本級別的jQuery您可以根據需要檢查的是這樣的:

if(!jQuery || !jQuery.fn.jquery === "1.4.4"){ 
    var url = "http://code.jquery.com/jquery-1.4.4.js"; 
    var script = document.createElement('script'); 
    script.type = 'text/javascript'; 
    script.src = url; 
    document.body.appendChild(script); 
} 

你可能會想改善的版本檢測,以確保它不會有一個版本1.4.4之後,但我敢肯定,你可以寫代碼爲自己;-)根據反饋

所以,你需要保持在頁面上的jQuery的多個版本

====編輯。你有沒有嘗試過這樣的事情:

var original_jquery = $().noConflict(); 
original_jquery.getScript("http://code.jquery.com/jquery-1.4.4.js"); 
var new_jquery = $().noConflict(); 
window.$ = original_jquery; 

然後使用new_jquery作爲你的jQuery版本嗎?我沒有測試過,看看它是否可行,但你可能會有一些運氣。

====最後編輯

正如你所說,我的javascript上面是不完全正確的,所以我在控制檯嘗試了幾件事情。是的,你不需要保存舊版本的jQuery,因爲jQuery在noConflict方法中實現了這一點。所以就叫getScript加入,然後noConflict但保存到一個新的變量:

>> $.fn.jquery 
"1.4.2" 
>> $.getScript("http://code.jquery.com/jquery-1.4.4.js"); 
undefined 
>> $.fn.jquery 
"1.4.4" 
>> var new_jquery = $.noConflict(); 
undefined 
>> new_jquery.fn.jquery 
"1.4.4" 
>> $.fn.jquery 
"1.4.2" 
+0

不同版本的jQuery使用相同的命名空間。因此,當jQuery 1.3.2在網站上,並且我們想要自動下載1.4.4時,以上不起作用,所有對jQuery的引用現在指向1.4.4,而我們的客戶期望它是1.3.2 – 2010-12-14 15:40:41

+0

你有什麼共同點,你編程?你是否正在編寫代碼,以便它只適用於jQuery 1.4.4? – sioked 2010-12-14 15:49:43

+0

我使用的jQuery庫是1.3.2,客戶端有不同的版本 – 2010-12-14 16:51:17

1

您是否嘗試過使用JQuery.noConflict()。這聽起來像它可以幫助你。

+0

我當然試過使用jQuery.noConflict(),但是這隻會將之前設置的$變量釋放回原始所有者。所有jQuery實例仍將受下載的新jQuery庫影響 – 2010-12-14 15:13:47