处理jquery命名空间冲突的好/最佳方法是什么?

时间:2012-05-11 20:02:35

标签: jquery

我正在使用两个jquery插件。两者都使用原型函数removeTag扩展jquery。这会导致第二个加载的插件正常工作,而第一个没有。

作为一个快速补丁,我将第二个插件上的removeTag和所有调用重命名为其他内容。

显然,这不是一个好的解决方案。升级需要手动编辑,可能还有其他命名空间冲突,我还没有意识到。

有人可以推荐一些有效的策略来解决这个问题吗?

我使用的两个插件是:

3 个答案:

答案 0 :(得分:4)

您可以使用以下代码添加js文件:

if (jQuery) {
    jQuery.namespace = function(namespace) {
            var names = namespace.split(".");
            var parent = window;
            for (var index = 0; index < names.length; index++) {
                    if (!parent[names[index]]) {
                            parent[names[index]] = function() {
                                    throw "Namespace, Cannot instantiate";
                            }
                    }
                    parent = parent[names[index]];
            }
    }

}

在您的脚本上,您可以使用它,如下所示:

$.namespace("Somejs.MyCustomjs");

稍后在代码中引用完整的命名空间,如:

SomeJs.MyCustomjs.myFunc();

希望它有所帮助

编辑:我忘了在你的js类的声明中提到你使用了完整的命名空间

答案 1 :(得分:0)

一种可能性是使用jQuery.sub()

http://api.jquery.com/jQuery.sub/

这将允许您创建jQuery对象的副本,并让一个插件使用该副本。

// load jQuery
// load plugin1

var $origJQ = jQuery;
jQuery = jQuery.sub();

// load plugin2

jQuery.plugin2Stuff();
$origJQ.plugin1Stuff();

但最大的缺点是,在处理任一插件时,您需要确保使用适当的jQuery别名。如果至少有一个插件只是在您加载页面时调用一次,尽管这可能不是问题。

编辑:显然,这在1.7中已弃用,并将移至1.8插件

答案 2 :(得分:0)

在第一个插件中加载后,使用不同的名称$.fn.removeTagsPlugin=$.fn.removeTags定义该函数,然后当您加载第二个插件时,它可以愉快地覆盖$ .fn.removeTags。这有局限性..如果第一个插件在内部使用removeTags,如果它使用新插件的removeTags版本则不起作用,那么这个解决方案将无效。