3

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

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

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

谁能推荐一些有效的策略来解决这个问题?

我使用的两个插件是:

4

3 回答 3

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 类的声明中你使用完整的命名空间

于 2012-05-11T20:16:14.533 回答
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 中移至插件

于 2012-05-11T20:19:56.903 回答
0

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

于 2012-05-11T20:54:50.463 回答