Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
处理jquery命名空间冲突的好方法/最佳方法是什么?_Jquery - Fatal编程技术网

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

处理jquery命名空间冲突的好方法/最佳方法是什么?,jquery,Jquery,我正在使用两个jquery插件。两者都使用原型函数removeTag扩展jquery。这会导致第二个加载的插件正常工作,而第一个插件则无法正常工作 作为一个快速补丁,我将第二个插件上的removeTag(以及对它的所有调用)重命名为其他插件 显然,这不是一个好的解决方案。升级将需要手动编辑,可能还有我尚未意识到的其他名称空间冲突 有人能推荐一些有效的策略来处理这个问题吗 我使用的两个插件是: jQuery标记- jQuery标记输入- 您可以使用以下代码添加js文件: if (jQuery)

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

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

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

有人能推荐一些有效的策略来处理这个问题吗

我使用的两个插件是:

  • jQuery标记-
  • jQuery标记输入-

您可以使用以下代码添加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]];
            }
    }
稍后代码将引用完整的名称空间,如:

SomeJs.MyCustomjs.myFunc();
希望能有帮助


编辑:我忘了在js类声明中提到,您使用完整名称空间的可能性是使用
jQuery.sub()

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

// load jQuery
// load plugin1

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

// load plugin2

jQuery.plugin2Stuff();
$origJQ.plugin1Stuff();
不过最大的缺点是,在处理任何一个插件时,都需要确保使用jQuery的适当别名。若至少有一个插件是在加载页面时调用的,尽管这可能不是问题


编辑:显然,这在1.7中已被弃用,并将被移动到1.8中的插件中

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

两个jQuery库或两个jQuery插件。差别很大。如果是两个jQuery库,那么removeTag并不是唯一冲突的东西。库是什么?如果您的名称空间已命名,您不能调用removeTag的名称空间版本(不确定我说的是否正确)。或者您可以给它一个名称,而不是修改名称空间中的单个方法吗?您可能很幸运,只需在HTML文档中反转库/脚本的调用,并将它们放在关闭标记之前的底部。作为最后的手段,您可以使用
noConflict
,尽管这需要您加载jquery两次。更不用说在jquery中使用两个不同的别名,并在每次调用中使用正确的别名。很抱歉造成混淆。两个插件。将编辑。。。
// load jQuery
// load plugin1

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

// load plugin2

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