2013-03-27 63 views
2

我有一個企業應用程序,它導入一些java腳本庫(比方說A)和全局命名空間中的一些功能。如何避免javascript命名空間衝突?

我們的客戶可以擴展我們的平臺並導入jquery,這將導致命名空間衝突。

什麼是最好的方式幫助客戶不要擊中名稱空間衝突,因爲jquery非常流行,每個客戶都會使用它。

如何更改庫A的命名空間?什麼是最方便和最安全的方式來做到這一點。

回答

3

對於jQuery,最簡單的方法是使用jQuery.noConflict()來獲得一個新的選擇變量而不是$。

var j$ = jQuery.noConflict(); 

j$('#test-id') 
2

您應該構建一個不允許您的客戶影響全局空間的界面。

將您客戶的代碼包裝在自己的功能中。

(function() { 
    var window, global; // Keep these private to this function 
    // Customer code here 
])(); 

您將需要爲他們提供一個接口來訪問您的函數,但是您如何做到這一點取決於您的應用程序,所以我不能提供示例。這可能就像傳入一個參數一樣簡單,該參數允許訪問包含需要由該客戶代碼操作的對象的對象。

現在,這並不適用於所有事情。顯然,你大大限制了他們的代碼訪問權限。您需要自行提供對該功能的訪問權限。

+0

在你的匿名函數中聲明window&global有什麼意義?本地範圍是否仍然能夠看到窗口等全局屬性? – Sledge 2017-05-23 15:08:44

1

使用此結構:

(function ($, a, b) { 
    // ... place your code here 
})(jQuery, myLibraryA, otherLibraryB); 

這是所謂的「匿名函數」,創建一個本地範圍內(內聲明的所有變量和函數將本地和不會干涉與其他代碼)。它導入三個庫,jQuery,myLiberayA和其他庫B,並且在本地範圍內,它們在名稱$,a和b下可見。

0

如果你想使用第三方JavaScript庫的組合,你也可以這樣做: 基本上爲每個對象創建另一個名稱空間;

if(window.jQuery && !(window.MyjQuery)){ 
    var window['MyjQuery'] = window.jQuery; 
    var j$ = window['MyjQuery']; //alias 

    j$(document).ready(function(){ 
    //code goes here... 
    }); 

}