我正在使用两个jquery插件。两者都使用原型函数removeTag
扩展jquery。这会导致第二个加载的插件正常工作,而第一个没有。
作为一个快速补丁,我将第二个插件上的removeTag和所有调用重命名为其他内容。
显然,这不是一个好的解决方案。升级需要手动编辑,可能还有其他命名空间冲突,我还没有意识到。
有人可以推荐一些有效的策略来解决这个问题吗?
我使用的两个插件是:
答案 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版本则不起作用,那么这个解决方案将无效。