【问题标题】:Jquery plugins occupy the same function name -> conflictjquery插件占用相同的函数名->冲突
【发布时间】:2011-08-10 02:29:35
【问题描述】:

我在使用 jquery expose 插件和 Masked Input 插件时遇到了问题。 问题是它们都占用了$.mask 函数,这会导致冲突。但我非常需要这两个插件一起工作。我会将其中一个中的$.mask 重命名为...比如说$.msk,但在这种情况下,我总是需要记住它,如果我想升级到新版本,我会再次重命名。

寻找更好的解决办法来处理这种jquery插件之间的冲突。

【问题讨论】:

  • 能否请插件作者重命名函数?这将为您、他们和社区带来好处。
  • 我会尝试这样做。当我阅读有关创建 jQuery 插件的教程时,有人说开发人员应尽量避免使用可能被其他插件开发人员采用的名称命名插件。 docs.jquery.com/Plugins/Authoring#Namespacing
  • @SlavaGu 我没有回复

标签: jquery jquery-plugins namespaces


【解决方案1】:

我想我同意 mu 的回答。一个补充可能是使用jQuery.sub()

由于大多数插件在构建过程中都使用 jQuery 全局变量,因此您应该能够在加载其中一个插件之前为 jQuery 设置别名。然后你可以在之后重新别名为你选择的任何东西。

<script src="http://cdn.jquerytools.org/1.2.5/full/jquery.tools.min.js?foo"></script> 
<script type="text/javascript">
var jQuery = $.sub();
</script>
<script src="jquery.maskedinput.js" type="text/javascript"></script>
<script type="text/javascript">
var $$$ = jQuery;
jQuery = $;
</script>

这种方法唯一可能的优点是它可以将一个插件与另一个插件可能对 jQuery 方法所做的更改隔离开来。这有点令人费解,但我能想到的唯一替代插件的方法。

【讨论】:

  • 升级到 jQuery v1.8 时要记住的一点是,jQuery.sub 在 jQuery v1.7 中已被弃用,在 v1.8 中将不再可用。
【解决方案2】:

好的。我现在正在回答我的问题。

我考虑过 mu 太短 的方法,但不太适合。我的同事提出以下建议:

我们像这样创建新的 jQuery 实例:

var $$$ = $.extend( true, function(selector, context) {
    return new $$$.fn.init( selector, context );
}, $);
$$$.fn = $$$.prototype = jQuery.prototype;

我们在其上创建$函数的插件闭包(因为$在插件内部使用):

(function($) {
... plugin code goes here ...
$.fn.extend({
        myplugin: function(maybe_some_options) {
...
})($$$);

现在我们可以同时调用$$$(&lt;selector&gt;).myplugin( { do : 'great job', and : 'be happy' } );$(&lt;selector&gt;).myplugin()了。

到目前为止,我们对这种方法没有任何问题,我看不出它会崩溃的原因,所以我们决定继续这个决定。

【讨论】:

  • 这可行,但现在您的客户在内存中有两个 jQuery 副本,您必须(一直)记住哪个版本的 jQuery 用于哪个插件。您让您的客户在内存中付费,而不是遵循简单的升级程序和测试。
  • init()方法最好不要覆盖,使用sub()会更好。
【解决方案3】:

我认为您可以在需要记住某些内容的解决方案之间进行选择,问题是您希望记住的频率。

如果您重命名其中一个,那么您必须记住修补任何升级。我认为这没什么大不了的,在软件开发中经常发生。

另一种方法是引入其中一个插件,然后立即加载一个名称空间修补程序,例如jQuery.fn.masked_input = jQuery.fn.mask;,然后可以加载暴露插件。只要重命名的插件没有在任何地方引用它自己的名称,这种方法就可以工作。而且,您必须记住插件的特定加载顺序。这种事情在软件开发中也时有发生。

【讨论】:

  • 感谢您的回复。对不起,我不能接受你的回答,但至少值得一票。恐怕你是对的 - 无论如何,下次我想更新它时,我不得不从脑海中回忆起一些关于这个插件的事情。
猜你喜欢
  • 2012-08-07
  • 1970-01-01
  • 1970-01-01
  • 2012-08-20
  • 1970-01-01
  • 2016-05-03
  • 1970-01-01
相关资源
最近更新 更多