【问题标题】:What is the best way to make sure a jQuery plugin won't ever overwrite a jQuery native method?确保 jQuery 插件永远不会覆盖 jQuery 本机方法的最佳方法是什么?
【发布时间】:2010-11-28 09:25:32
【问题描述】:

我正在编写一个 jQuery 插件,我想知道如何确保我不会覆盖未来的 jQuery 本机方法。

比如我的插件叫Foo,用法是$('selector').foo()

jQuery 2.6 注意到 Foo 的流行并决定将其包含在核心包中。它也通过$('selector').foo()使用。

我不希望我的 Foo 覆盖 jQuery 的原生 Foo(否则会发生冲突)。

这就是我想出的......

(function($) {

  // If jQuery adds this method, we don't want to overwrite it
  if (typeof $.foo === 'function') {
    return;
  };

  $.fn.foo = function() {
     // Foo
  };  

})(jQuery);

这是最好的方法吗?

【问题讨论】:

  • 如果您的 foo 实现与 jQuery 不同,那么您的插件会出现错误...不过,这可能是一个好习惯,也许我会尝试一下 :-)

标签: javascript jquery jquery-plugins


【解决方案1】:

您可以跳过if 语句并将定义检查构建到您的函数声明中。

(function($){

  $.fn.foo = $.fn.foo || function () {
    // only used if $.fn.foo is undefined
  }

})(jQuery)

【讨论】:

  • 这很性感!非常感谢您的回答。我认为没有人能超越这一点。我总是忘记利用短路评估和 JavaScript 返回第一个 truthy 操作数。
  • @alxed - 你应该注意这对于属性来说是不安全的,例如.length.active 和其他默认为0 的东西会在这里被覆盖,即使被 jQuery 使用.
  • @Nick 在 jQuery 原型上只有三个非函数属性:jquerylengthselector。只要您没有为这三个插件中的任何一个命名,就可以了。
  • 其实我不会重新发明length 属性:P
【解决方案2】:

我认为你会更好:

  if ($.foo !== undefined) {
    alert('there is something at foo');
    return;
  };

原因是,您的插件可能如下所示:

$.foo = {
     doSomething: function() { /* do something*/ },
     doSomethingElse: function() { /* do something else*/ }
  }; 

上面的typeof不是函数,而是对象,所以你的例子中的条件不会像你期望的那样表现。

【讨论】:

  • 感谢您的回答 karim79。也许我做错了什么,但是当我做alert($.unwrap); 时,我得到undefined,即使我使用的是 jQuery 1.4,alert($); 给了我缩小 jQuery 函数的toString()
【解决方案3】:

您可能希望以与常规 JavaScript 编写 getElementsByClassName 函数类似的方式执行此操作 - 您检查它是否存在,如果不存在则创建它。

【讨论】:

    【解决方案4】:

    稍微好一点(性能方面)的版本:

    jQuery.fn.foo || (jQuery.fn.foo = function(){
    var $ = jQuery;
    (your code goes here)
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-08
      • 2011-12-31
      • 2011-06-09
      • 2012-04-17
      相关资源
      最近更新 更多