2013-03-27 64 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... 
    }); 

}